主要内容
ansible简介
ansible是一个强大的运维自动化工具,在主控制机器上安装ansible,通过ssh连接,就可以方便地管理其他机器,被管理的机器上不需要安装任何客户端,且通过ssh连接,传输的数据受到安全的保护。ansible强大,但学习曲线简单,学习ansible并不需要太多的编程知识。
安装ansible
以centos7为例子,通过yum安装ansible
1 2 |
yum install -y ansible |
如果提示找不到ansible包,可能没有安装epel repo。可以通过下面的命令先安装epel
1 2 |
yum install -y epel-release |
ansible配置文件
ansible有一个名为ansible.cfg
的配置文件,ansible会在以下三个地方寻找这个文件
- ANSIBLE_CONFIG变量的值
- /etc/ansible目录
- 用户home目录
最先找到的优先生效,默认这个文件在/etc/ansible
目录下。
使用ansible
ansible是通过ssh管理受控端的,因此,如果希望运行ansible命令的时候无须输入密码,就要把服务器的公钥存放到受控端中。假设受控端为centos7-host1和centos7-host2:
1 2 3 4 |
ssh-keygen #一路回车,生成ssh密钥 ssh-copy-id root@centos7-host1 #复制public key到host1 ssh-copy-id root@centos7-host2 #复制public key到host2 |
第一条ansible命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@centos7-server ~]# ansible all -m ping localhost | SUCCESS => { "changed": false, "ping": "pong" } centos7-host1 | SUCCESS => { "changed": false, "ping": "pong" } centos7-host2 | SUCCESS => { "changed": false, "ping": "pong" } |
命令解释:
- ansible ansible的其中一个命令行工具
- all 所有受控的主机,这些主机保存在invertory文件中
- -m ping -m(module)表示使用指定的ansible模块,这里是ping模块
也就是说,该命令使用ping测试所有主机是否在线,通常来说,ansible可以根据返回文本的颜色判断命令执行状态,成功执行的文本颜色为绿色,失败的为红色。
Inventory
inventory是指所有的受控主机,这些主机保存在/etc/ansible/hosts
文件中。我们可以使用两种方式编写这个文件
- ini配置方式,默认方式
- yaml配置方式
我们可以决定是否对主机进行分组保存,每一个分组以方括号[]
区分。inventory默认有两个分组:all
和ungrouped
,all包括了所有的主机,而ungrouped则包括所有没有分组的主机。例如分三组,local、webserver和database,配置文件编写如下:
ini方式
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[local] localhost ansible_connection=local #或者把变量独立出来,如下 [local:vars] ansible_connection=local [webserver] webserver.node1 webserver.node2 [database] database.node1 database.node2 |
yaml方式
1 2 3 4 5 6 7 8 9 10 11 |
local: hosts: localhost: vars: ansible_connection: local webserver: hosts: centos7-host1: centos7-host2: |
yaml方式中一定不能忘记主机后面的冒号:
,否则可能会解析错误;主机可以使用域名,也可以使用ip地址。本地主机最好使用ansible_connection=local变量标识,否则本地主机会和远程主机一样处理
查看分组中的主机
1 2 3 4 5 6 7 8 |
[root@centos7-server ~]# ansible webserver --list-hosts hosts (2): centos7-host2 centos7-host1 [root@centos7-server ~]# ansible local --list-hosts hosts (1): localhost |
正则匹配
主机可以使用正则匹配,例如:
- webserver[01:10] 匹配webserver01到webserver10之间的所有主机
- database-[a:f] 匹配database-a到database-f之间的所有主机
- 192.168.11.[7:8] 匹配192.168.11.7和192.168.11.8
除了inventory文件支持正则匹配之外,ansible命令也支持正则,例如:
1 2 3 |
ansible centos7-* -m ping #ping centos7-host1和centos7-host2 ansible 192.168.11.* -m ping #ping 192.168.11.7和192.168.11.8 |
Ad-Hoc和playbook
ansible可以通过两种方式执行任务,它们是:
- Ad-Hoc
- playbook
它们的区别类似于shell的行内代码和script脚本文件,前者适合执行一些临时性的或者简单的任务;后者则适合执行复杂的,且以后会重复执行的任务。可以认为playbook由多条Ad-Hoc任务组合而成,但稍有不同。
Ad-Hoc
前面我们已经使用过Ad-Hoc的方式执行任务,例如
1 2 3 |
ansible all -m ping #使用ping模块 ansible all -m yum -a 'name=* state=latest' #使用yum模块更新系统,相当于yum update -y |
playbook
playbook文件使用yaml编写,一个playbook文件可以由一个或多个play组成,每一个play由hosts标识区分。例如:
包含一个play的playbook
1 2 3 4 5 6 7 8 9 |
--- - hosts: webservers remote_user: root tasks: - name: ensure apache is at the latest version yum: name: httpd state: latest |
包含两个play的playbook
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
--- - hosts: webservers remote_user: root tasks: - name: ensure apache is at the latest version yum: name: httpd state: latest - hosts: database remote_user: root tasks: - name: ensure mariadb is at the latest version yum: name: mariadb-server state: latest |
上面的playbook示例使用了yum模块,该模块相当于centos系统的yum功能,用于管理软件包。
playbook文件由ansible-playbook
命令执行,例如执行example.yml:
1 2 |
ansible-playbook example.yml |
检查playbook语法
ansible-playbook命令提供了语法检查选项--syntax-check
。例如检查httpd.yml的语法
1 2 3 4 |
[root@centos7-server ~]# ansible-playbook httpd.yml --syntax-check playbook: httpd.yml |
如果playbook中的语法没有错误,则显示如上,否则会输出错误信息。
Dry run选项
Dry run的意思是模拟playbook的运行过程,但实际上对系统不造成任何影响。
开启dry run模式的选项是--check
。
1 2 |
ansible-playbook httpd.yml --check |
在2.2版本之后,通过check_mode变量,可以针对特定的任务开启和关闭Dry run模式。
1 2 3 4 5 6 7 8 9 10 |
--- - hosts: webserver remote_user: root tasks: - name: ensure apache is at the latest version check_mode: no #不允许任务进行Dry run,即使指定check选项也会正常运行任务 yum: name: httpd state: latest |
模块
ansible的强大在于它内置了非常多的模块,可以通过下面的命令列出所有ansible支持的模块
1 2 |
ansible-doc --list |
在ansible 2.6.0版本中,一共有1800多个模块。
常用模块
虽然模块很多,但是常用的模块不外乎下面这些
- ping 网络测试模块
- command/shell 命令执行模块
- script 脚本执行模块
- user 用户管理模块
- yum/apt 软件包管理模块,针对不同的系统有不同的模块
- service/systemd 服务管理模块
- file/copy 文件管理模块
- git 版本管理模块
更多模块的资料可到官方网站查询
如果需要获得相关模块的使用方法,可以使用下面的命令
1 2 3 4 |
ansible-doc ping #或者 ansible-doc -s ping |
模块的简单使用
使用ping模块
1 2 |
ansible all -m ping |
使用command/shell模块
两者的作用类似
1 2 3 |
ansible all -m command -a 'uname -r' #获取内核版本 ansible all -m shell -a 'uname -r' |
返回结果:
1 2 3 4 5 6 7 |
[root@centos7-server ~]# ansible all -m shell -a 'uname -r' centos7-host1 | SUCCESS | rc=0 >> 3.10.0-862.9.1.el7.x86_64 centos7-host2 | SUCCESS | rc=0 >> 3.10.0-862.9.1.el7.x86_64 |
使用service/systemd模块
两者的作用类似
1 2 3 |
[root@centos7-server ~]# ansible webserver -m service -a 'name=httpd state=started' [root@centos7-server ~]# ansible webserver -m systemd -a 'name=httpd.service state=started' |
由于返回的内容太多,不在这里列出。
转载请注明:Pure nonsense » 运维自动化之ansible