Ansible 手册
简介
本文档从实战的角度展示ansible,不对ansible进行大而全的讲解,够用就好。
安装
- 在线安装
# pwd
/etc/yum.repos.d
# cat aliBase.repo
[aliBase]
name=aliBase
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever
# cat aliEpel.repo
[aliEpel]
name=aliEpel
baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/
enabled=1
gpgcheck=0
- 离线安装
下载ansible软件,然后制作私有yum源,安装
yum install --downloadonly --downloaddir=./ ansible
配置文件
ansible安装完成后,默认使用的配置文件:/etc/ansible/hosts
- 分组
[web]
10.1.1.60 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
[db]
10.1.1.61 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
- IP地址连续
[web]
10.1.1.[59:60] ansible_port=22 ansible_user=root ansible_ssh_pass=123123
- 内嵌套组
[GroupA]
10.1.1.44
10.1.1.34
[GroupB]
10.1.1.55
10.1.1.56
[Total:children]
GroupA
GroupB
备注:有三个组GroupA, GroupB, Total,其中”children”关键字表示当前组中存在子组。GroupA和GroupB就是Total的子组,操作Total就相当于操作GroupA和GroupB。
- 同一IP分配在不同的组中
[GroupA]
10.1.1.44
[GroupB]
10.1.1.44
- yaml格式配置文件
#YAML示例
all:
hosts:
10.1.1.60:
10.1.1.61:
#上例相当于如下INI配置
10.1.1.60
10.1.1.61
备注:all表示组,hosts是关键字,当我们需要在组中定义受管主机时,就需要使用到hosts关键字,当我们进行自定义分组时,也需要使用hosts关键字,每个分组指明自己组内的受管主机时,都要使用到hosts关键字
- yaml的嵌套组
#先看一个INI风格的配置,示例如下
10.1.1.61
[test1]
10.1.1.60
[test2]
10.1.1.70
#上述配置表示当前清单中有3台受管主机,主机61不属于任何组,主机60属于test1组,主机70属于test2组
#使用YAML语法进行同等效果的配置如下
#注意,为了使缩进显得更加明显,此处每次缩进使用两个空格
all:
hosts:
10.1.1.61:
children:
test1:
hosts:
10.1.1.60:
test2:
hosts:
10.1.1.70:
#从上例可以看出,当直接在清单中创建组时,需要在all关键字内使用children关键字,而定义每个组时,有必须使用hosts关键字,指明组内的主机
样例
- 样例配置文件
10.1.1.60 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
- 例如,执行如下命令
ansible 10.1.1.60 -m ping
设置免密
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.1.1.60
- 样例配置文件
10.1.1.60 ansible_port=22
或者
test60 ansible_host=10.1.1.60 ansible_port=22
常用命令
检查所有主机的存活性
# ansible all -m ping
all: 表示对/etc/ansible/hosts中的所有主机执行操作
按照分组检查
- hosts文件配置
[web]
10.1.1.60 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
[db]
10.1.1.61 ansible_port=22 ansible_user=root ansible_ssh_pass=123123
- 执行命令
# ansible db -m ping
检查主机的存活性
> # ansible 'apache:!nginx' -m ping -o
* host.ini
# ansible -i ./hosts --connection=local local -m ping
* --connection=local的意思是不需要通过ssh连接,因为我们针对的就是本地,还可以是--connection=ssh意思是需要ssh连接
* -i ./hosts指定Inventory file,告诉我们连接到哪里
* remote,local,all指明使用哪个标签下面的服务器清单,all表示针对每个服务器运行
* -m ping表示使用ping模块,会返回ping结果
Ansible-playbook
常用参数
--inventory=path,指定inventory文件,默认是在/etc/ansible/hosts下面。
--verbose,显示详细的输出,使用-vvvv显示精确到每分钟的输出。
--extra-vars=vars:定义在playbook使用的变量。
--forks:指定并发的线程数,默认是5.
--connection=type:指定远程连接主机的方式,默认是ssh,设置为local时,则只在本地执行playbook、
--check:检测模式,playbook中定义的所有任务将在每台主机上检测,但是并不执行。
handlers
[root@LOCALHOST ~]# cat yaml/httpd.yaml
---
- hosts: control-node
remote_user: root
vars:
- pkg: httpd
tasks:
- name: "install httpd package."
yum: name={{ pkg }} state=installed
- name: "copy httpd configure file to remote host."
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: "boot httpd service."
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
- 在需要被监控的任务(tasks)中定义一个notify,只有当这个任务被执行时,才会触发notify对应的handlers去执行相应操作;
- handlers只有在其所在的任务被执行时,都会被运行;
- handlers只会在Play的末尾运行一次;如果想在一个Playbook的中间运行handlers,则需要使用meta模块来实现,例如:
- meta: flush_handlers
。 - 如果一个Play在运行到调用handlers的语句之前失败了,那么这个handlers将不会被执行。我们可以使用mega模块的
--force-handlers
选项来强制执行handlers,即使在handlers所在Play中途运行失败也能执行。
tags
- tags用于让用户选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。
- ansible的标签(Tags)功能可以给角色(Roles)、文件、单独的任务,甚至整个Playbook打上标签,然后利用这些标签来指定要运行Playbook中的个别任务,或不执行指定的任务
[root@LOCALHOST ~]# cat yaml/httpd.yaml
---
- hosts: control-node
remote_user: root
vars:
- pkg: httpd
tasks:
- name: "install httpd package."
yum: name={{ pkg }} state=installed
- name: "copy httpd configure file to remote host."
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: "start httpd service."
tags:
- start_httpd # 给“start httpd service”这个任务打个标签
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
- 在命令行中调用: