ansible优化:主要从关闭facts收集,Forks主机连接数,ssh长连接,异步执行,开启Pipelinling
优化变量收集facts
在playbook执行过程中,ansible收集facts变量是很耗时的一个步骤,如果我们确定play中没有用到fact变量信息,可以直接将其关闭,关闭获取 facts 很简单,只需要在 playbook 文件中加上“gather_facts: no
”即可。
我们可以给play单独添加一个setup
模块,并通过gather_subset
参数严格控制facts
的收集种类,这样既拿到了我们需要的fact变量又提高了ansible
的执行效率,gather_subset
参数的默认值为all。
Forks主机连接数
forks用来设置同一时刻与目的主机连接数,也可以理解为主机并行数,默认值比较保守为5。在生产中,多数情况下我们会更改这个参数。如果控制节点的CPU和网络性能够用,设置几十上百个也是可以的
在ansible.cfg设置forks的全局默认值:
ansible.cfg
[defaults]
forks = 15
开启ssh长链接
ansible使用ssh协议和被管控主机通信,开启长连接后会有一个established的连接
openssh5.6
以后的版本支持了multiplexing
,如果管控机命令行执行ssh -V得到的版本号大于5.6
就可以设置长连接
echo "ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d" >> /etc/ansible/ansible.cfg
Pipelinling
开启「pipelining
」特性实际上是通过减少ssh连接次数
,从而缩短ansible执行时间
。
在部署大规模服务器或引用模块非常多
时,开启「pipelining」特性会给ansible带来显著的性能提升。
/etc/ansible/ansible.cfg
的pipelining
参数设置为True
即可,该参数默认值是False。
缺点: 如果我们要开启pipelining特性,要么playbook
不使用sudo
越权功能,要么取消sudo
的「requiretty
」特性。
Strategy
strategy的作用范围是一个play,通过设置不同参数,控制一个play内所有任务的执行策略。
设置方法为更改ansible.cfg里的strategy参数,默认值为linear,可选参数为free
linear
:
策略即线性执行策略,线性执行策略指主机组内所有主机完成一个任务后才继续下一个任务的执行,
在执行一个任务时,如果某个主机先执行完则会等待其他主机执行结束。
free
:
策略即自由策略,即在一个play执行完之前,每个主机都各顾各的尽可能快的完成play里的所有任务,
而不会因为其他主机没执行完任务而等待,不受线性执行策略那样的约束。
所以这种策略的执行结果给人感觉是无序的甚至是杂乱无章的,
而且每次执行结果的task显示顺序很可能不一样。
异步优化
如果未为poll指定值,则默认轮询值为10秒
异步时间限制没有默认值。如果不使用'async'关键字,则任务将同步运行,这是Ansible的默认设置。
---
- hosts: all
remote_user: root
tasks:
- name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec
command: /bin/sleep 15
async: 45
poll: 5
在异步执行任务时,需要注意那些有依赖性的任务。对于那些对资源要求占有排它锁的任务,如yum,不应该将Poll的间隔设置为0。如果设置为0,很可能会导致资源阻塞。
总结来说,大概有以下一些场景需要使用到ansible的异步特性:
某个task需要运行很长的时间,这个task很可能会达到ssh连接的timeout
没有任务是需要等待它才能完成的,即没有任务依赖此任务是否完成的状态
需要尽快返回当前shell
当然也有一些场景不适合使用异步特性:
这个任务是需要运行完后才能继续另外的任务的
申请排它锁的任务
网友评论