Ansible 项目管理核心要点总结
一、引用主机清单
在playbook中引用hosts时,如果对应的主机清单中没有配置该主机,是无法执行的
如果主机清单中配置的是主机名称,那么在playbook中hosts字段后写的是ip或者主机名,那么也是无法执行的,示例如下:
[student@master ansible]$ vim a.yml
---
- name: test
hosts: 192.168.122.10
tasks:
- name: test1
debug:
msg: 123
~
//跳过该任务,无法执行
[student@master ansible]$ ansible-playbook a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 192.168.122.10
PLAY [test] ********************************************************************
skipping: no hosts matched
PLAY RECAP *********************************************************************
在引用主机清单时,一定要注意playbook里面hosts字段后写的内容一定只能时主机清单里面编辑的内容
使用playbook引用主机清单的方式有很多种,如下
Hosts: node1
Hosts: node1.example.com
Hosts: 172.16.30.10
Hosts: all ----所有的受控主机
Hosts: net ----主机组net
Hosts: '*' ----所有的主机
Hosts: '*.example.com'
Hosts: '172.16.30.*'
Hosts: 'web*' ---通过匹配符*来匹配
Hosts: net:webserver ----取net组和webserver组的并集
Hosts: net:&webserver ---取交集
Hosts: net:!node1 ---net组所有的主机,但是除了node1
Hosts: node[1-5]
Hosts: node[a-d]
二、配置并行
当ansible处理playbook时,会按顺序运行每个play。确定play的主机列表后,ansible将按顺序运行每个任务。通常,所有主机必须在任何主机在play中启动下一个任务之前完成任务
理论上,ansible可以连接到play中的所有主机以执行每项任务。这非常适用于小型主机列表。但如果该play以数百台主机为目标,则可能会给控制节点带来沉重的负担
Ansible所进行的最大同时连接数由ansible配置文件的forks参数控制。默认值为5.
比如一个play具有10台受控主机,我们forks的值为5,那么,首先前5台主机,同时运行第一个play,当这5台主机运行完成第一个play后,后5台主机同时运行第一个play,等到10台主机运行完成第一个play时,才开始运行第二个play,以此类推
当受控主机是linux主机时,我们执行play的时候,大多数的任务是在受控主机上运行的,ansible控制节点得负载就少了,这种情况下呢,我们可以把forks的值设置得更高一些
当受控主机是网络设备时,比如路由器交换机时,大多数得模块是在控制节点中运行的,这时控制节点的负载就会很高,这个时候我们就不能去提高forks的值了
通常情况下,ansible运行play时,它会确保所有的受控主机在启动任何进行下一项任务之前已完成了每个任务。在所有受控主机完成所有任务后,将运行任何通知的处理器
比如说,给所有webserver主机组安装httpd软件包时,安装成功后会重启服务,那么我们使用触发器进行配置
---
- name: web station
hosts: webserver
tasks:
- name: install httpd
yum:
name: httpd
state: latest
notify: //触发器
- restart httpd
handlers: //处理器
- name: restart httpd
service:
name: httpd
state: restarted
~
那么加入webserver此时有非常非常多的主机,当我们中间某个更新httpd失败时,那么handlers还会执行吗?我们都知道,handlers它是在我们执行完所有的play之后,才会去执行的,但是node1、node2都更新成功了,node3这里失败了,那么整个play就直接中断了,不会去执行handlers了。那么就有问题了,那我们如何来解决这个问题呢?
就可以用到serial参数,加入给该参数设置为2,那么意思就是先从webserver中选择2台主机进行运行play,当我这两台主机全部运行play完成后,再从webserver中未执行play的主机中选择2台进行执行play,以此类推。设置如下:
示例:
[student@master ansible]$ vim a.yml
---
- name: test
hosts: node1,node2,node3
tasks:
- name: test1
debug:
msg: 123
- name: test2
debug:
msg: 456
~
[student@master ansible]$ ansible-playbook a.yml
PLAY [test] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node1]
ok: [node2]
ok: [node3]
TASK [test1] *******************************************************************
ok: [node1] => {
"msg": 123
}
ok: [node2] => {
"msg": 123
}
ok: [node3] => {
"msg": 123
}
TASK [test2] *******************************************************************
ok: [node1] => {
"msg": 456
}
ok: [node2] => {
"msg": 456
}
ok: [node3] => {
"msg": 456
}
PLAY RECAP *********************************************************************
node1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim a.yml
---
- name: test
hosts: node1,node2,node3
serial: 2
tasks:
- name: test1
debug:
msg: 123
- name: test2
debug:
msg: 456
~
[student@master ansible]$ ansible-playbook a.yml
PLAY [test] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node1]
ok: [node2]
TASK [test1] *******************************************************************
ok: [node1] => {
"msg": 123
}
ok: [node2] => {
"msg": 123
}
TASK [test2] *******************************************************************
ok: [node1] => {
"msg": 456
}
ok: [node2] => {
"msg": 456
}
PLAY [test] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node3]
TASK [test1] *******************************************************************
ok: [node3] => {
"msg": 123
}
TASK [test2] *******************************************************************
ok: [node3] => {
"msg": 456
}
PLAY RECAP *********************************************************************
node1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
包含和导入:导入 playbook,部署httpd站点
示例:
[student@master ansible]$ cat repo.yml
---
- name: repo
hosts: all
tasks:
- name: repo1
yum_repository:
name: baseos
description: aa1
baseurl: http://ansible.example.com/rhel9/BaseOS
enabled: yes
gpgcheck: no
- name: repo2
yum_repository:
name: appstream
description: ee1
baseurl: http://ansible.example.com/rhel9/AppStream
enabled: yes
gpgcheck: no
- name: install lvm2
yum:
name: lvm2
state: present
[student@master ansible]$ vim httpd.yml
---
- name: import repo
import_playbook: repo.yml
- name: install httpd
hosts: node1
tasks:
- name: install httpd1
yum:
name: httpd
state: present
~
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [repo] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node3]
ok: [node1]
ok: [node2]
ok: [node5]
ok: [node4]
TASK [repo1] *******************************************************************
ok: [node4]
ok: [node3]
ok: [node5]
ok: [node1]
ok: [node2]
TASK [repo2] *******************************************************************
ok: [node2]
ok: [node1]
ok: [node3]
ok: [node5]
ok: [node4]
TASK [install lvm2] ************************************************************
ok: [node3]
ok: [node1]
ok: [node2]
ok: [node5]
ok: [node4]
PLAY [install httpd] ***********************************************************
TASK [Gathering Facts] *********************************************************
ok: [node1]
TASK [install httpd1] **********************************************************
ok: [node1]
PLAY RECAP *********************************************************************
node1 : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim vsftpd.yml
---
- name: install vsftpd
yum:
name: vsftpd
state: present
~
[student@master ansible]$ vim httpd.yml
---
- name: import repo
import_playbook: repo.yml
- name: install httpd
hosts: node1
tasks:
- name: install httpd1
yum:
name: httpd
state: present
- import_tasks: vsftpd.yml
~
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [repo] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node4]
ok: [node3]
ok: [node1]
ok: [node5]
ok: [node2]
TASK [repo1] *******************************************************************
ok: [node1]
ok: [node5]
ok: [node2]
ok: [node3]
ok: [node4]
TASK [repo2] *******************************************************************
ok: [node1]
ok: [node3]
ok: [node2]
ok: [node5]
ok: [node4]
TASK [install lvm2] ************************************************************
ok: [node3]
ok: [node2]
ok: [node4]
ok: [node1]
ok: [node5]
PLAY [install httpd] ***********************************************************
TASK [Gathering Facts] *********************************************************
ok: [node1]
TASK [install httpd1] **********************************************************
ok: [node1]
TASK [install vsftpd] **********************************************************
changed: [node1]
PLAY RECAP *********************************************************************
node1 : ok=7 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
包含:在tasks中包含任务,安装vsftpd软件包,并启动vsftpd服务
[student@master ansible]$ vim httpd.yml
---
- name: import repo
import_playbook: repo.yml
- name: install httpd
hosts: node1
tasks:
- name: install httpd1
yum:
name: httpd
state: present
- include_tasks: vsftpd.yml
~
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [repo] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node5]
ok: [node1]
ok: [node4]
ok: [node3]
ok: [node2]
TASK [repo1] *******************************************************************
ok: [node2]
ok: [node1]
ok: [node3]
ok: [node5]
ok: [node4]
TASK [repo2] *******************************************************************
ok: [node3]
ok: [node4]
ok: [node1]
ok: [node5]
ok: [node2]
TASK [install lvm2] ************************************************************
ok: [node5]
ok: [node1]
ok: [node3]
ok: [node2]
ok: [node4]
PLAY [install httpd] ***********************************************************
TASK [Gathering Facts] *********************************************************
ok: [node1]
TASK [install httpd1] **********************************************************
ok: [node1]
TASK [include_tasks] ***********************************************************
included: /home/student/ansible/vsftpd.yml for node1
TASK [install vsftpd] **********************************************************
ok: [node1]
PLAY RECAP *********************************************************************
node1 : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim vsftpd.yml
---
- name: install vsftpd
yum:
name: mariadb-server
state: present
~
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [repo] ********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node4]
ok: [node2]
ok: [node1]
ok: [node5]
ok: [node3]
TASK [repo1] *******************************************************************
ok: [node2]
ok: [node1]
ok: [node5]
ok: [node4]
ok: [node3]
TASK [repo2] *******************************************************************
ok: [node1]
ok: [node2]
ok: [node4]
ok: [node3]
ok: [node5]
TASK [install lvm2] ************************************************************
ok: [node2]
ok: [node4]
ok: [node1]
ok: [node5]
ok: [node3]
PLAY [install httpd] ***********************************************************
TASK [Gathering Facts] *********************************************************
ok: [node1]
TASK [install httpd1] **********************************************************
ok: [node1]
TASK [include_tasks] ***********************************************************
included: /home/student/ansible/vsftpd.yml for node1
TASK [install vsftpd] **********************************************************
changed: [node1]
PLAY RECAP *********************************************************************
node1 : ok=8 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0