最初,ansible的执行效率和saltstack(基于zeromq消息队列的方式)相比要慢的多的多,特别是被控节点量很大的时候。但是ansible发展到现在,它的效率得到了极大的改善。在被控节点不太多的时候,默认的设置已经够快,即使被控节点数量巨大的时候,也可以通过一些优化,极大的提高其执行效率。
1、时间插件,使每个任务显示花费的时间,对速度优化没有直接用处,只是测试优化效果或者就是想知道花了多长时间可以安装
[root@ansible] ~$ grep callback_whitelist /etc/ansible/ansible.cfg
#callback_whitelist = timer, mail
修改为
callback_whitelist = timer, profile_tasks
查看可用参数
ansible-doc -t callback -l
效果:
===============================================================================
go : unarchive go_package ------------------------------------------------------------------------------------------------------------------------------------------------------------ 6.13s
Gathering Facts ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2.57s
go : copy go package ----------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.17s
go : set go env ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.55s
go : source -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.40s
Playbook run took 0 days, 0 hours, 0 minutes, 10 seconds
2、不需要的情况下,关闭 facts 或者配置文件中设gathering = smart
3、并发根据机器配置来,就算机器性能很好,一般也不要超过50?
4、设置ssh长连接 ControlPersist
ansible天然支持openssh,默认连接方式下,它对ssh的依赖性非常强。所以优化ssh连接,在一定程度上也在优化ansible。其中一点是开启ssh的长连接,即长时间保持连接状态。
在开启了 ControlPersist长连接特性后,SSH 在建立了 sockets 之后,节省了每次验证和创建的时间。在网络状况不是特别理想,尤其是跨互联网的情况下,所带来的性能提升是非常可观的。有这边需求的,试试就知道了。
要开启ssh长连接,要求ansible端的openssh版本高于或等于5.6。
修改/etc/ansible/ansible.cfg,其中ControlPersist=5d是控制ssh连接会话保持时长为5天,默认是60s
ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d
也可以通过修改ansible被控端的ssh 客户端配置
cat ~/.ssh/config
Host *
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 5
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 4h
开启长连接后,在会话过期前会一直建立连接,在netstat的结果中会看到ssh连接是一直established状态,且会在当前用户家目录的".ansible/cp"目录下生成一些socket文件,每个会话一个文件。 例如:执行一次ad-hoc操作。
ansible centos -m ping
查看netstat,发现ssh进程的会话一直是established状态。
shell> netstat -tnalp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1143/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2265/master
tcp 0 0 192.168.100.62:58474 192.168.100.59:22 ESTABLISHED 31947/ssh: /root/.a
tcp 0 96 192.168.100.62:22 192.168.100.1:8189 ESTABLISHED 29869/sshd: root@pt
tcp 0 0 192.168.100.62:37718 192.168.100.64:22 ESTABLISHED 31961/ssh: /root/.a
tcp 0 0 192.168.100.62:38894 192.168.100.60:22 ESTABLISHED 31952/ssh: /root/.a
tcp 0 0 192.168.100.62:48659 192.168.100.61:22 ESTABLISHED 31949/ssh: /root/.a
tcp 0 0 192.168.100.62:33546 192.168.100.65:22 ESTABLISHED 31992/ssh: /root/.a
tcp 0 0 192.168.100.62:54824 192.168.100.63:22 ESTABLISHED 31958/ssh: /root/.a
tcp6 0 0 :::22 :::* LISTEN 1143/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2265/master
且家目录下"~/.ansible/cp/"下会生成对应的socket文件。
ls -l ~/.ansible/cp/
total 0
srw------- 1 root root 0 Jun 3 18:26 5c4a6dce87
srw------- 1 root root 0 Jun 3 18:26 bca3850113
srw------- 1 root root 0 Jun 3 18:26 c89359d711
srw------- 1 root root 0 Jun 3 18:26 cd829456ec
srw------- 1 root root 0 Jun 3 18:26 edb7051c84
srw------- 1 root root 0 Jun 3 18:26 fe17ac7eed
5、开启PIPElinING
pipeline也是openssh的一个特性。在ansible执行每个任务的流程中,有一个过程是将临时任务文件put到一个ansible端的一个临时文件中,然后sftp传输到远端,然后通过ssh连接过去远程执行这个任务。如果开启了pipelining,一个任务的所有动作都在一个ssh会话中完成,也会省去sftp到远端的过程,它会直接将要执行的任务在ssh会话中进行。
ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。不过,如果使用 sudo,必须关闭 requiretty 选项。
开启pipelining的方式是修改配置文件/etc/ansible/ansible.cfg
将
pipelining=False
修改为
pipelining=True
但是要注意,如果在ansible中使用sudo命令的话需要在被控节点的/etc/sudoers中禁用"requiretty"。
之所以要禁用requiretty,是因为ssh远程执行命令时,它的环境是非登录式非交互式shell,默认不会分配tty,没有tty,ssh的sudo就无法关闭密码回显,此时使用sudo,有可能会造成密码泄露。
/etc/sudoers中默认是开启requiretty的,意思是只有拥有tty的用户才能使用sudo,也就是说ssh连接过去不允许执行sudo。
可以通过visudo编辑配置文件,注释该选项来禁用它。
grep requiretty /etc/sudoers
# Defaults requiretty
另外,修改设置/etc/sudoers是在被控节点上进行的(或者ansible连接过去修改),其实在ansible端也可以解决sudo的问题,只需在ansible的ssh参数上加上"-tt"选项即可,"-tt"选项可以强制SSH分配tty,这样使用sudo的时候就可以关闭密码回显了
ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d -tt
开启pipelining前后,ansible的执行过程,可以通过很简单的一个例子来测试
ansible master1.hanli.com -m ping -vvvv
执行前,一个step需要多次ssh连接
执行后,每次执行任务时都大量减少了ssh连接次数(只需要一次ssh连接),且省去了sftp传输任务文件的过程,因此在管理大量节点时能极大提升执行效率。
6、修改ansible的执行策略
默认ansible在远程执行任务是按批并行执行的,一批控制多少台主机由命令行的"-f"或"–forks"选项控制。例如,默认的并行进程数是5,如果有20台被控主机,那么只有在每5台全部执行完一个任务才继续下一批的5台执行该任务,即使中间某台机器性能较好,完成速度较快,它也会空闲地等待在那,直到所有20台主机都执行完该任务才会以同样的方式继续下一个任务
在ansible 2.0中,添加了一个策略控制选项strategy,默认值为"linear",即上面按批并行处理的方式。还可以设置strategy的值为"free"。 在free模式下,ansible会尽可能快的切入到下一个主机。同样是上面的例子,首先每5台并行执行一个任务,当其中某一台机器由于性能较好提前完成了该任务,它不会等待其他4台完成,而是会跳出该任务让ansible切入到下一台机器来执行该任务。也就是说,这种模式下,一台主机完成一个任务后,另一台主机会立即执行任务,它是"前赴后继"的方式。
通过修改配置文件/etc/ansible/ansible.cfg来开启
# by default, ansible will use the 'linear' strategy but you may want to try
# another one
strategy = free
7、开启facts缓存
ansible或ansible-playbook默认总是先收集facts信息。在被控主机较少的情况下,收集信息还可以容忍,如果被控主机数量非常大,收集facts信息会消耗掉非常多时间。
可以设置"gather_facts: no"来禁止ansible收集facts信息,但是有时候又需要使用facts中的内容,这时候可以设置facts的缓存。例如,在空闲的时候收集facts,缓存下来,在需要的时候直接读取缓存进行引用。
ansible的配置文件中可以修改’gathering’的值为’smart’、‘implicit’或者’explicit’。smart表示默认收集facts,但facts已有的情况下不会收集,即使用缓存facts;implicit表示默认收集facts,要禁止收集,必须使用gather_facts: False;explicit则表示默认不收集,要显式收集,必须使用gather_facts: Ture。
在使用facts缓存时(即设置为smart),ansible支持两种facts缓存:redis和jsonfile。
例如,以下是/etc/ansible/ansible.cfg中jsonfile格式的缓存配置方法。
[defaults]
gathering = smart
fact_caching_timeout = 86400
fact_caching = jsonfile
fact_caching_connection = /path/to/cachedir
这里设置的缓存过期时间为86400秒,即缓存一天。缓存的json文件放在/path/to/cachedir目录下,各主机的缓存文件以主机名命名。缓存文件是一个json文件,要查看缓存文件,如/path/to/cachedir/192.168.100.59中的内容,使用如下语句即可。
cat /path/to/cachedir/192.168.100.59 | python -m json.tool
8、-t选项(原理未知,且未经验证)
-t 或–tree,是将ansible的执行结果按主机名保存在指定目录下的文件中。
[root@ansible] ~$ cat /tmp/facts/master1.hanli.com
[root@ansible] ~$ ll /tmp/facts/
total 80
-rw-r--r-- 1 root root 24382 Mar 4 21:12 master1.hanli.com
-rw-r--r-- 1 root root 32040 Mar 4 21:12 master2.hanli.com
-rw-r--r-- 1 root root 24469 Mar 4 21:12 master3.hanli.com
https://www.cnblogs.com/f-ck-need-u/p/7580170.html