ansible 任务花费时间插件 速度优化

最初,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

你可能感兴趣的:(ansible)