使用分叉在Ansible中配置并行
在Ansible处理playbook的时候会按顺序运行每个play
确定play的主机列表之后,Ansible将按照顺序运行每个任务
所有主机必须在任意主机在play中启动下一个任务之前完成任务
forks
Ansible所进行的最大同时连接数由Ansible配置文件中的forks参数控制
默认情况下应该是5
使用命令——grep forks ansible.cfg 来查看
![](https://img-blog.csdnimg.cn/img_convert/e0556b8a16d7f6ccbba0b29987892c55.png)
我们不妨来假设这样一个情况:
在Ansible控制节点上分叉的默认值是5
同时,存在10个受管主机等待playbook任务的运行
运行方式:
Ansible将会在前5个受管主机上执行playbook中的第一个任务
完成之后,才在后5个受管主机上执行第一个任务
当所有的受管主机上都执行完第一个任务之后,
Ansible,才会继续在前5个受管主机执行下一个任务
以此类推,知道play结束
forks的调整
事实上,forks的默认值设置的非常保守
提高forks的情况
如果控制节点正在管理Linux主机,则大多数任务将在受管主机上运行,并且控制节点的负载较少
这种情况下就可以调高forks的值,性能也将随之提高
降低forks的情况
如果playbook在控制节点上要运行很多代码,那么适量提高分叉限制
比方说使用Ansible管理网络路由器和交换机,那么大多数模块在控制节点上运行而不是在网络设备上运行,这会增加控制节点上的负载,这时候就有必要降低forks的值
管理滚动更新
通常,当Ansible运行play时,它会确保所有受管主机在启动任何主机进行下一个任务之前已完成每个任务,在所有受管主机完成所有任务之后,将运行任何通知的处理程序
某个情况
在所有主机上运行所有任务可能会导致意外的情况
如果play更新负载均衡Web服务器集群,可能需要阿紫进行更新时让每个Web服务器停止服务
如果所有服务器都在同一个play中更新,则有这样一种可能,它们全部同时停止服务
当然我们有办法解决这个问题
serial
通过play批量运行主机,在下一批次启动之前,每批主机将在整个play中运行
简单点来说 就是 有很多主机的话
serial:2
先对两台机子下手,这两台机子同时配置
一起做任务一,然后一起做任务二
当所有任务完成的时候
进行下两台的任务
以此类推直到完成
RH294实验——配置并行
任务:跨多个受管主机调整playbook的并行和串行执行
实验开始: lab projects-parallelism start
去往工作目录: cd ~/projects-parallelism
查看文件 vim ansible.cfg
![](https://img-blog.csdnimg.cn/img_convert/fb6310044697e0c576095cd2c904e3dd.png)
查看inventory文件的内容
![](https://img-blog.csdnimg.cn/img_convert/14ce935d1f3699877ad18b7c777abf86.png)
检查playbook的内容 vim playbook.yml
![](https://img-blog.csdnimg.cn/img_convert/16d722380b16c9303fd93ebced25f7ad.png)
检查remove_apache.yml的内容
![](https://img-blog.csdnimg.cn/img_convert/361bd4fdb7aa5f73fdc93d1fb946fe5a.png)
2.执行playbook并且使用time命令得到运行所需时间
注意ansible如何同时在所有四台主机上执行每项任务
![](https://img-blog.csdnimg.cn/img_convert/44ed0b8c287086e55383a47452a9c7d2.png)
注意时间
![](https://img-blog.csdnimg.cn/img_convert/92b021e27b2741df8ad49456c7d59159.png)
3.执行ansible-playbook remove_apache.yml以停止和禁用httpd服务并删除httpd软件包
4.在ansible.cfg中将forks参数的值改为1
![](https://img-blog.csdnimg.cn/img_convert/f0bcd765c35b92cb42db5ab01d297a75.png)
5.重新运行playbook并且使用time命令得到运行所需时间
注意这次ansible将一次在一台主机上执行各项任务
注意减少了分叉数量之后如何导致了playbook执行时间比以往更长
![](https://img-blog.csdnimg.cn/img_convert/21c1cf9b0bc88b2e9a57b5bb09673660.png)
![](https://img-blog.csdnimg.cn/img_convert/42cc768ab1f977fb03c4e92003ce69d6.png)
6.执行ansible-playbook remove_apache.yml以停止和禁用httpd服务并删除httpd软件包
7.将forks的值设置为2
![](https://img-blog.csdnimg.cn/img_convert/a420f8adf021d12dca344667f2905715.png)
8.在playbook.yml中添加serial参数并且值设置为2
![](https://img-blog.csdnimg.cn/img_convert/9527492c19532f94862686c77070704c.png)
9.运行playbook.yml
![](https://img-blog.csdnimg.cn/img_convert/f42800bc3172a6312f74635e5e93e8a5.png)
很明显分开运行了
10.执行ansible-playbook remove_apache.yml以停止和禁用httpd服务并删除httpd软件包
11.将forks的值设置为4
12.将playbook中的serial的参数设置为3
![](https://img-blog.csdnimg.cn/img_convert/956b0962686d560e9fa6f9d0b8b9cc9e.png)
13.重新运行 playbook
此时ansible会只在三台主机上执行整个play
然后在最后一台主机上重复该play
![](https://img-blog.csdnimg.cn/img_convert/63b02c3df0c798f623933419756af0c9.png)
实验结束 lab projects-parallelism finish