Ansible基础
- 一、工作原理
- 二、快速入门
- 2.1 测试所有资产的网络连通性
- 2.2 发布文件到被管理节点(资产)
- 三、资产(被管理节点)
- 3.1 静态资产
- 3.1.1 自定义资产
- 3.1.2 自定义资产的使用
- 3.1.3 资产选择器
- 四、Ansible Ad-Hoc 命令
- 4.1 模块类型
- 4.1.1 command & shell 模块
- 4.1.2 copy模块
- 4.1.3 yum_repsitory模块
- 4.1.4 yum 模块
- 4.1.5 user模块
按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战
一、工作原理
Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。
Ansible ⽤ Python 编写,尽管市⾯上已经有很多可供选择的配置管理解决⽅案(例如 Salt、Puppet、Chef等),但它们各有优劣,⽽Ansible的特点在于它的简洁。
让 Ansible 在主流的配置管理系统中与众不同的⼀点便是,它并不需要你在想要配置的每个节点上安装⾃⼰的组件。同时提供的另⼀个优点,如果需要的话,你可以在不⽌⼀个地⽅控制你的整个基础架构
- 在ANSIBLE 管理体系中,存在"管理节点" 和 “被管理节点” 两种⻆⾊。
- 被管理节点通常被称为"资产"
- 在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。并通过SSH将这些Python 脚本传递到被管理服务器上。在被管理服务器上依次执⾏,并实时的将结果返回给管理节点
二、快速入门
Ansible的安装非常简单,此处不再做说明了
管理节点:
- 172.18.0.2
被管理节点(资产):
- 172.18.0.3
- 172.17.0.4
管理节点 和 被管理节点之间的节点已经打通 SSH 信任关系。
2.1 测试所有资产的网络连通性
ansible all -i 172.18.0.3,172.18.0.4 -m ping
172.18.0.4 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.18.0.3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
注意 -i 参数后⾯接的是⼀个列表(List)。因此当为⼀个被管理节点时,我们后⾯⼀定要加⼀个英⽂逗号(,),告知是List
2.2 发布文件到被管理节点(资产)
touch /tmp/a.conf
ansible all -i 172.18.0.3,172.18.0.4 -m copy -a
"src=/tmp/a.conf dest=/tmp/a.conf"
src(source) 源地址,dest(destination)目标地址
参数解释:
- all 在 ansible 中称为资产选择器。就是匹配资产(-i 参数指定的清单) 中的⼀部分。
此处的all -i 172.18.0.3,172.18.0.4 指的是匹配-i 参数指定的清单(172.18.0.3,172.18.0.4)的所有资产。
- -i 指定Ansible 的资产,也就是被管理服务器。
- -m 指定要运⾏的模块,例如上述的 ping 模块和 copy 模块。
模块为ansible提供的,也可以是社区开源的模块。
- -a 指定模块的参数,模块 ping 没有指定参数, 模块 copy指定了 src 和 dest 参数。
三、资产(被管理节点)
在实际场景中,ansible要管理的服务器往往要多得多。依然使用 -i 参数后⾯⼀个个追加IP显然不合乎常理。
Ansible的资产,主要分为静态资产和动态资产,此处先介绍静态资产。
3.1 静态资产
在 Ansible 中,静态资产(static assets)指的是那些在运行时不会发生变化的资源或配置文件。这些资产通常是预先定义好的,并且在整个 Ansible 运行过程中保持不变。
静态资产本身是⼀个文本文件,⼀个格式类似INI的文件,默认情况下,Ansible的资产⽂件位于 /ect/ansible/hosts,安装方式不同可能没有该文件,手动创建即可。
静态资产可以包括但不限于以下几类:
库存文件(Inventory Files):库存文件定义了目标主机及其分组信息。这些文件是静态的,除非手动修改,否则在 Ansible 运行过程中不会发生变化。
INI格式:
[webservers]
web1.example.com
web2.example.com
yaml格式:
all:
children:
webservers:
hosts:
web1.example.com:
web2.example.com:
变量文件(Variable Files):变量文件包含可以在 playbook 中使用的变量定义。这些文件通常也是静态的,除非手动修改。
app_name: myapp
app_port: 8080
模板文件(Template Files):模板文件用于生成配置文件或其他文本文件。这些模板文件通常是静态的,但在运行时会被 Ansible 渲染成最终的配置文件。(后边介绍)
角色(Roles):角色是一组相关的任务、文件、模板和变量的集合。角色文件夹中的内容通常是静态的,除非手动修改。
Playbook 文件:Playbook 文件定义了一组任务,这些任务将在目标主机上执行。Playbook 文件通常是静态的,除非手动修改。
3.1.1 自定义资产
上述提到的INI格式文件静态资产可以进行自定义,下⾯给出⼀个⾃定义的静态资产实例,然后再具体解释其含义。
cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
aimyon36.com
ztmy.com
aimyon[05:09].com //aimyon05.com ....aimyon09.com
[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5
[dbdb_servers]
192.168.2.2
192.168.2.3
192.168.1.5
[alldb_servers]
[alldb_servers:children]
dbdb_servers
web_servers
- Ansible 的资产⽂件中,可以以IP地址的形式或者主机名(如果使用主机名须配置hosts的映射)的形式存在。
- Ansible 的资产若连续,可以使⽤[stat:end] 的形式去表达。
- 可以将服务器按照业务场景定义成组,⽐如dbdb_servers 和web_servers
- 组和组之间可以存在继承关系,⽐如dbdb_servers 和web_servers 同时继承 alldb_servers 组
3.1.2 自定义资产的使用
ansible all -i inventory.ini ...
- -i 参数用来指定资产。
- 通过 -i 参数指定⾃定义资产的位置即可(可以是全路径,也可以是相对路径)。
列举出所有资产
ansible all -i inventory.ini --list-hosts
hosts (29):
1.1.1.1
2.2.2.2
3.3.3.1
...略...
列举出选定资产
ansible web_servers -i inventory.ini --listhosts
hosts (3):
192.168.2.2
192.168.2.3
192.168.1.5
-i 是指定要进行匹配的资产
web_servers 是匹配指定的资产中属于web_servers这个组的资产
3.1.3 资产选择器
有时操作者希望只对资产中的⼀部分服务器进⾏操作,而不是资产中所有服务器。此时可以使⽤ Ansible 的PATTERN资产选择器。
基本语法格式
- ansible PATTERN -i inventory -m module -a argument
选择⼀台或者多台服务器
ansible 1.1.1.1 -i inventory.ini --list-hosts
hosts (1):
1.1.1.1
ansible aimyon36.com -i inventory.ini --listhosts
hosts (1):
aimyon36.com
ansible 1.1.1.1,2.2.2.2 -i inventory.ini --listhosts
hosts (2):
1.1.1.1
2.2.2.2
选择⼀组服务器
ansible web_servers -i inventory.ini --list-hosts
hosts (3):
192.168.1.2
192.168.1.3
192.168.1.5
使用*匹配
ansible 3.3.3.1* -i inventory.ini --list-hosts
hosts (7):
3.3.3.13
3.3.3.10
3.3.3.11
3.3.3.12
3.3.3.14
3.3.3.15
3.3.3.1
使⽤逻辑匹配
ansible 'web_servers:db_servers' -i inventory.ini --list-hosts //web_servers 和 dbdb_servers 的并集
hosts (5):
192.168.1.2
192.168.1.3
192.168.1.5
192.168.2.2
192.168.2.3
ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts //web_servers 和 dbdb_servers 的交集
hosts (1):
192.168.1.5
ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts //在 web_servers 中,但是不在 db_servers 中
hosts (2):
192.168.1.2
192.168.1.3
四、Ansible Ad-Hoc 命令
Ansible Ad-Hoc其实是⼀个概念性的名字,是相对于写Ansible playbook 来说的.类似于在命令⾏敲⼊shell命令和 写shell scripts两者之间的关系。可以⽤于执⾏⼀些临时命令。
如果希望敲⼊⼀些命令去比较快的完成⼀些事情,⽽不需要将这些执⾏的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。
Ansible提供两种⽅式去完成任务,⼀是 ad-hoc(临时) 命令,⼀是写Ansible playbook(剧本)。前者可以解决⼀些简单的任务, 后者解决较复杂的任务,⽐如做配置管理或部署。
命令格式
- ansible pattern [-i inventory] -m module -a argument
- pattern 资产选择器
- -i 指定资产清单⽂件的位置
- -m 指定本次Ansible ad-hoc 要执⾏的模块。可以类别成SHELL 中的命令。
- -a 模块的参数. 可以类⽐成SHELL 中的命令参数
快速入门部分介绍的就是ad-hoc命令,快速入门部分已经介绍了通过ansible筛选出指定的资产进行相应操作,但在实际操作上,我们希望使用到文件传输,修改,服务安装等操作。因此需要引入模块进行操作。
4.1 模块类型
Ansible 模块分三种类型: 核⼼模块(core module)、附加模块(extra module)及用户⾃定义模块(consume module)。
核⼼模块是由Ansible 的官⽅团队提供的。附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。
当核⼼模块和附加模块都⽆法满⾜你的需求时,⽤户可以⾃定义模块。
默认情况下,在安装Ansible 的时候, 核⼼模块和附加模块都已经安装而⽆需⽤户干预。
Ansible 的核⼼模块和附加模块,数量有3000+ 。这样庞⼤的模块数量,对于任何⼀个接触Ansible 的⼈都不可能将其完全记住、掌握使⽤。 因此能够顺利使⽤Ansible 的帮助⽂档,对我们来说是很有必要的。Ansible 的帮助⽂档,由它本身提供的命令ansible-doc 实现。
常用帮助命令
列举出所有的核⼼模块和附加模块
- ansible-doc -l
查询某个模块的使⽤⽅法
- ansible-doc modulename
查询某个模块的使⽤⽅法,⽐较简洁的信息
- ansible-doc -s modulename
4.1.1 command & shell 模块
command & shell 两个模块都是在远程服务器上去执⾏命令。command模块是ad-hoc的默认模块,在执⾏ad-hoc时,若不指定模块的名字则默认使⽤此模块。
ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
ansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
shell 模块可以执⾏SHELL 的内置命令和 特性(⽐如管道符)。
command 模块⽆法执⾏SHELL 的内置命令和特性。
4.1.2 copy模块
copy 模块的主要⽤于管理节点和被管理节点之间的⽂件拷⻉。
常用参数
- src 指定拷⻉⽂件的源地址
- dest 指定拷⻉⽂件的⽬标地址
- backup 拷⻉⽂件前,若原⽬标⽂件发⽣了变化,则对⽬标⽂件进行备份
- woner 指定新拷⻉⽂件的所有者
- group 指定新拷⻉⽂件的所有组
- mode 指定新拷⻉⽂件的权限
copy 管理节点上的 nginx.repo 到被管理节点上
ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo
copy 前, 在被管理节点上对原⽂件进⾏备份
ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
copy ⽂件的同时对⽂件进⾏⽤户及⽤户组设置
ansible all -i hosts -m copy -a "src=./nginx.repodest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
copy ⽂件的同时对⽂件进⾏权限设置
ansible all -i hosts -m copy -a "src=./nginx.repo
dest=/etc/yum.repos.d/nginx.repo mode=0755"
4.1.3 yum_repsitory模块
主要用于向被管理节点添加yum仓库源。
常⽤参数
- name 仓库名称,就是仓库⽂件中第⼀⾏的中括号中名称,必须的参数。
- description 仓库描述信息,添加时必须的参数
- baseurl yum存储库 “repodata” ⽬录所在⽬录的URL,添加时必须的参数。它也可以是多个URL的列表。
- file 仓库⽂件保存到被管理节点的⽂件名,不包含 .repo。默认是 name 的值。
- state preset 确认添加仓库⽂件, absent 确认删除仓库⽂件。
- gpgcheck 是否检查 GPG yes|no, 没有默认值,使⽤/etc/yum.conf 中的配置。
添加 epel 源
ansible dbservers -i hosts -m
yum_repository -a "name=epel
baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/'
description='EPEL YUM repo'"
172.18.0.3 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/bin/python"
},
"changed": true,
"repo": "epel",
"state": "present"
}
删除epel源
ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
172.18.0.3 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/bin/python"
},
"changed": true,
"repo": "epel",
"state": "absent"
}
4.1.4 yum 模块
等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进⾏管理。
常用参数
- name 要安装的软件包名, 多个软件包以英⽂逗号(,) 隔开
- state 对当前指定的软件安装、移除操作(present installed latest absent removed)
- present 确认已经安装,但不升级
- installed 确认已经安装
- latest 确保安装,且升级为最新
- absent 和 removed 确认已移除
安装⼀个软件包
ansible webservers -i hosts -m yum -a
"name=nginx state=present"
ansible webservers -i hosts -m yum -a
"name=nginx state=latest"
ansible webservers -i hosts -m yum -a
"name=nginx state=installed"
安装⼀个软件包组
ansible webservers -i hosts -m yum -a
"name='@Development tools' state=present"
4.1.5 user模块
⽤于在被管理节点上对⽤户进⾏管理。
常⽤参数
- name 必须的参数, 指定⽤户名
- password 设置⽤户的密码,这⾥接受的是⼀个加密的值,因为会直接存到 shadow, 默认不设置密码
- update_password 假如设置的密码不同于原密码,则会更新密码. 在 1.3 中被加⼊
- home 指定⽤户的家⽬录
- shell 设置⽤户的 shell
- comment ⽤户的描述信息
- create_home 在创建⽤户时,是否创建其家⽬录。默认创建,假如不创建,设置为 no。2.5版本之前使⽤ createhome group 设置⽤户的主组
- groups 将⽤户加⼊到多个其他组中,多个⽤逗号隔开。默认会把⽤户从其他已经加⼊的组中删除。
- append yes|no 和 groups 配合使⽤,yes 时,不会把⽤户从其他已经加⼊的组中删除
- system 设置为 yes 时,将会创建⼀个系统账号
- expires 设置⽤户的过期时间,值为时间戳,会转为为天数后,放在 shadow 的第 8 个字段⾥
- generate_ssh_key 设置为 yes 将会为⽤户⽣成密钥,这不会覆盖原来的密钥
- ssh_key_type 指定⽤户的密钥类型, 默认 rsa, 具体的类型取决于被管理节点
- state 删除或添加⽤户, present 为添加,absent 为删除;默认值 present
- remove 当与 state=absent ⼀起使⽤,删除⼀个⽤户及关联的⽬录,⽐如家⽬录,邮箱⽬录。可选的值为: yes/no
创建⽤户并设置密码
pass=$(echo "123456" | openssl passwd -1 -stdin)
ansible all -i hosts -m user -a "name=foo password=${pass}"
创建⽤户 yangge, 并且为其创建密钥对,并且密钥类型为:ecdsa
ansible all -i hosts -m user -a "name=yangge
generate_ssh_key=yes ssh_key_type=ecdsa"
创建⽤ tom, 并且设置其有效期到 2020年4⽉15⽇, 加⼊到组db_admin 中, 不改变⽤户原有假如的组。
ansible dbservers -i hosts -m user -a
"name=tom expires=$(date +%s -d 20200415)
gorups=db_admin append=yes"
本章节Ansible-基础就介绍到这,相信看到这已经能够用ansible在资产服务器上执行一些简单的命令了,关于ansible的模块,可以自行查看文档了解,此处不再介绍了,说再多用不到也白扯 - - #
按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战