ansible中配置并行以及包含和导入
一、引用主机清单
在playbook中引用hosts时,如果对应的主机清单中没有配置该主机,是无法执行的
如果主机清单中配置的是主机名称,那么在playbook中hosts字段后写的是ip或者主机名,那么也是无法执行的
示例如下:
powershell
[student@master ansible]$ vim inventory
[student@master ansible]$ vim a.yml
[student@master ansible]$ ansible-playbook a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 192.168.122.10
[WARNING]: Could not match supplied host pattern, ignoring: node2.example.com
PLAY [test] ****************************************************************************
skipping: no hosts matched
PLAY RECAP *****************************************************************************
主机清单:
powershell
[student@master ansible]$ cat inventory
node1
node2
node3
node4
node5
[test01]
node1
[test02]
node2
[web]
node3
node4
[test05]
node5
[webtest:children]
web
a.yml:
powershell
---
- name: test
hosts: 192.168.122.10,node2.example.com
tasks:
- name: debug1
debug:
msg: 123
执行a.yml这个playbook的时候,就会发现有问题了,直接跳过该任务,无法执行
所以在引用主机清单时,一定要注意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* ' ---通过匹配符*来匹配(所有以web开头的组里面的主机)
Hosts: net:webserver ----取net组和webserver组的并集
Hosts: net:&webserver ---取交集
Hosts: net:!node1 ---net组所有的主机,但是除了node1
Hosts: node[ 1-5 ] (受控主机node1到node5)
Hosts: node[ a-d ]
Hosts:node[ 1:5 ] (受控主机node1和node5)
三、配置并行(forks)
当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,以此类推。
以三台主机和两个任务为例:
先主机node1、node2、node3先完成任务debug1,再主机node1、node2、node3完成任务debug2
powershell
[student@master ansible]$ vim a.yml
[student@master ansible]$ ansible-playbook a.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
ok: [node3]
ok: [node2]
TASK [debug1] **************************************************************************
ok: [node1] => {
"msg": 123
}
ok: [node2] => {
"msg": 123
}
ok: [node3] => {
"msg": 123
}
TASK [debug2] **************************************************************************
ok: [node1] => {
"msg": 234
}
ok: [node2] => {
"msg": 234
}
ok: [node3] => {
"msg": 234
}
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
powershell
---
- name: test
hosts: node1,node2,node3
tasks:
- name: debug1
debug:
msg: 123
- name: debug2
debug:
msg: 234
当受控主机是linux主机时,我们执行play的时候,大多数的任务是在受控主机上运行的,ansible控制节点得负载就少了,这种情况下呢,我们可以把forks的值设置得更高一些。
当受控主机是网络设备时,比如路由器交换机时,大多数得模块是在控制节点中运行的,这时控制节点的负载就会很高,这个时候我们就不能去提高forks的值了。
四、notify handlers用法(当完成....任务时,则进行....任务)
通常情况下,ansible运行play时,它会确保所有的受控主机在启动任何进行下一项任务之前已完成了每个任务。在所有受控主机完成所有任务后,将运行任何通知的处理器。
比如说,给所有webserver主机组安装httpd软件包时,安装成功后会重启服务,那么我们使用触发器进行配置
注:已经配置了yum仓库
powershell
[student@master ansible]$ vim httpd.yml
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [install httpd] *******************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
ok: [node3]
ok: [node2]
TASK [install httpd1] ******************************************************************
changed: [node1]
changed: [node3]
changed: [node2]
RUNNING HANDLER [restart httpd] ********************************************************
changed: [node3]
changed: [node2]
changed: [node1]
PLAY RECAP *****************************************************************************
node1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
powershell
---
- name: install httpd
hosts: node1,node2,node3
tasks:
- name: install httpd1
yum:
name: httpd
state: present
notify:
- restart httpd
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
那么如果此时有非常非常多的主机,当我们中间某个安装httpd失败时,那么handlers还会执行吗?我们都知道,handlers它是在我们执行完所有的play之后,才会去执行的,但是node1、node2都更新成功了,node3这里失败了,那么整个play就直接中断了,不会去执行handlers了。那么就有问题了,那我们如何来解决这个问题呢?
就可以用到serial参数,加入给该参数设置为2,那么意思就是先node1、node2这2台主机进行运行play,当我这两台主机全部运行play完成后,再从设置的hosts中,未执行play的主机中选择2台进行执行play,以此类推。
五、serial参数
例1:
powershell
[student@master ansible]$ vim httpd.yml
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [install httpd] *******************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node2]
ok: [node1]
TASK [install httpd1] ******************************************************************
ok: [node2]
ok: [node1]
PLAY [install httpd] *******************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node3]
TASK [install httpd1] ******************************************************************
ok: [node3]
PLAY RECAP *****************************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
powershell
---
- name: install httpd
hosts: node1,node2,node3
serial: 2
tasks:
- name: install httpd1
yum:
name: httpd
state: present
notify:
- restart httpd
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
例2:
powershell
[student@master ansible]$ vim a.yml
[student@master ansible]$ ansible-playbook a.yml
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node1]
ok: [node2]
TASK [debug1] **************************************************************************
ok: [node1] => {
"msg": 123
}
ok: [node2] => {
"msg": 123
}
TASK [debug2] **************************************************************************
ok: [node1] => {
"msg": 234
}
ok: [node2] => {
"msg": 234
}
PLAY [test] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node3]
TASK [debug1] **************************************************************************
ok: [node3] => {
"msg": 123
}
TASK [debug2] **************************************************************************
ok: [node3] => {
"msg": 234
}
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
powershell
---
- name: test
hosts: node1,node2,node3
serial: 2
tasks:
- name: debug1
debug:
msg: 123
- name: debug2
debug:
msg: 234
六、包含与导入
导入:1、导入任务 2、导入playbook
包含:只包含任务
1、导入playbook:(repo.yml导入到httpd.yml中)
repo.yml:
powershell
---
- name: repo
hosts: all
tasks:
- name: repo1
yum_repository:
name: aa
description: aa1
baseurl: http://ansible.example.com/rhel9/BaseOS
enabled: yes
gpgcheck: no
- name: repo2
yum_repository:
name: bb
description: aa2
baseurl: http://ansible.example.com/rhel9/AppStream
enabled: yes
gpgcheck: no
httpd.yml:
powershell
---
- name: import repo
import_playbook: repo.yml
- name: install httpd
hosts: node4
tasks:
- name: install httpd1
yum:
name: httpd
state: present
- name: restart httpd
service:
name: httpd
state: restarted
运行httpd.yml剧本
powershell
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [repo] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node2]
ok: [node1]
ok: [node3]
ok: [node5]
ok: [node4]
TASK [repo1] ***************************************************************************
ok: [node4]
ok: [node1]
ok: [node5]
ok: [node3]
ok: [node2]
TASK [repo2] ***************************************************************************
ok: [node2]
ok: [node1]
ok: [node3]
ok: [node5]
ok: [node4]
PLAY [install httpd] *******************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node4]
TASK [install httpd1] ******************************************************************
changed: [node4]
TASK [restart httpd] *******************************************************************
changed: [node4]
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
node4 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2、导入任务(将vsftpd.yml导入到httpd.yml中)
vsftpd.yml:
powershell
---
- name: install vsftpd
yum:
name: vsftpd
state: present
- name: restarted vsftpd
service:
name: vsftpd
state: restarted
httpd.yml:
powershell
---
- name: import repo
import_playbook: repo.yml
- name: install httpd
hosts: node4
tasks:
- name: install httpd1
yum:
name: httpd
state: present
- name: restart httpd
service:
name: httpd
state: restarted
- import_tasks: vsftpd.yml
运行httpd.yml剧本
powershell
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [repo] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node5]
ok: [node3]
ok: [node1]
ok: [node2]
ok: [node4]
TASK [repo1] ***************************************************************************
ok: [node5]
ok: [node4]
ok: [node3]
ok: [node2]
ok: [node1]
TASK [repo2] ***************************************************************************
ok: [node1]
ok: [node5]
ok: [node3]
ok: [node4]
ok: [node2]
PLAY [install httpd] *******************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node4]
TASK [install httpd1] ******************************************************************
ok: [node4]
TASK [restart httpd] *******************************************************************
changed: [node4]
TASK [install vsftpd] ******************************************************************
changed: [node4]
TASK [restarted vsftpd] ****************************************************************
changed: [node4]
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
node4 : ok=8 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、包含任务
powershell
[student@master ansible]$ ansible-playbook httpd.yml
PLAY [repo] ****************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node4]
ok: [node5]
ok: [node1]
ok: [node2]
ok: [node3]
TASK [repo1] ***************************************************************************
ok: [node5]
ok: [node4]
ok: [node2]
ok: [node3]
ok: [node1]
TASK [repo2] ***************************************************************************
ok: [node2]
ok: [node1]
ok: [node4]
ok: [node5]
ok: [node3]
PLAY [install httpd] *******************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [node4]
TASK [install httpd1] ******************************************************************
ok: [node4]
TASK [restart httpd] *******************************************************************
changed: [node4]
TASK [include_tasks] *******************************************************************
included: /home/student/ansible/vsftpd.yml for node4
TASK [install vsftpd] ******************************************************************
ok: [node4]
TASK [restarted vsftpd] ****************************************************************
changed: [node4]
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
node4 : ok=9 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node5 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
powershell
---
- name: import repo
import_playbook: repo.yml
- name: install httpd
hosts: node4
tasks:
- name: install httpd1
yum:
name: httpd
state: present
- name: restart httpd
service:
name: httpd
state: restarted
- include_tasks: vsftpd.yml