优化ansible速度
简单介绍和说明下,优化ansible执行速度的方法,具体如下~
常规优化方法
ansible的- t选项妙用
ansible的“-t"或“——tree"选项是将ansible的执行结果按主机名保存在指定目录下的文件中。
<代码> ansible测试- m ping - o - f 6 - t/tmp/树代码>
至于保存的内容为何?实际上仅仅只是保存了普通的输出内容而已。
<代码> # pwd/tmp/树 #猫192.168.246.187 {" ansible_facts ": {“discovered_interpreter_python”:“/usr/bin/python”},“改变”:假的,“萍”:“乒乓球”}代码>
设置ansible开启ssh长连接
如要开启ssh长连接,要求ansible端的openssh版本高于或等于5.6。使用ssh - v <代码> 代码>可以查看版本号。然后设置ansible使用ssh连接被控端的连接参数,此处修改<代码>/和c/可能/ansible.cfg> 代码,在此文件中启动下面的连接选项,其中<代码> ControlPersist=5 d 代码>是控制ssh连接会话保持时长为5天。
<代码> ssh_args=- c - o ControlMaster=auto - o ControlPersist=5 d 代码>
除此之外直接设置<代码>/etc/ssh/ssh_config> 代码(不是<代码>中> 代码,因为ssh命令是客户端命令)中对应的长连接项也是可以的。
开启长连接后,在会话过期前会一直建立连接,在<代码> netstat> 代码的结果中会看到ssh连接是一直建立<代码> 代码>状态,且会在当前用户家目录的<代码>。ans可能/cp 代码>目录下生成一些套接字文件,每个会话一个文件。
例如:执行一次特别<代码> 代码>操作:
<代码> ansible测试- m ping 代码>
查看netstat,发现ssh进程的会话一直是建立状态。
<代码> netstat -lnpta 代码>
且家目录下<代码> ~/.ansible/cp/> 代码下会生成对应的套接字文件。
? ?关于ssh保持长连接的方法:
(1)修改服务器端的等sshd_config
/ssh/<代码> ClientAliveInterval 60 #服务器每隔60秒发送一次请求给客户,然后端响应,从而保持连接 ClientAliveCountMax 3 #服务器发出请求后,客户端没有响应得次数达到3,就自动断开连接,正常情况下,客户端不会不响应 systemctl重载sshd 代码>
(2)修改客户端的etc/ssh/ssh_config添加以下:(在没有权限改服务器配置的情形下)
<代码> ServerAliveInterval 60 #客户每隔60秒发送一次请求给服务器,然后服务器响应,从而保持连接 ServerAliveCountMax 3 #客户发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,服务器不会不响应代码>
(3)命令行临时修改
在命令参数里<代码> ssh - o ServerAliveInterval=60> 代码这样子只会在需要的连接中保持持久连接,毕竟不是所有连接都要保持持久的。
开启流水线
管道也是openssh的一个特性。在ansible执行每个任务的流程中,有一个过程是将临时任务文件放置到一个ansible端的一个临时文件中,然后sftp传输到远端,然后通过ssh连接过去远程执行这个任务。
如果开启了<代码>流水线> 代码,一个任务的所有动作都在一个ssh会话中完成,也会省去sftp到远端的过程,它会直接将要执行的任务在ssh会话中进行。
开启流水线的方式是配置文件(如ansible。cf g)中设置<代码>流水线=true> 代码,默认是假的。
但是要注意,如果在ansible中使用sudo命令的话(ssh user@host sudo cmd),需要在被控节点的<代码>/etc/sudoers> 代码中禁用“requiretty"。
之所以要设置/etc/sudoers中的requiretty,是因为ssh远程执行命令时,它的环境是非登录式非交互式外壳,默认不会分配tty,没有tty, ssh的sudo就无法关闭密码回显(使用“-tt"选项强制ssh分配tty)。
所以出于安全考虑,/etc/sudoers中默认是开启requiretty的,它要求只有拥有tty的用户才能使用sudo,也就是说ssh连接过去不允许执行sudo。可以通过visudo/vim编辑配置文件,注释该选项来禁用它。
<代码> grep requiretty/etc/sudoers #默认requiretty 代码>
修改设置/etc/sudoers是在被控节点上进行的(或者ansible连接过去修改),其实在ansible端也可以解决sudo的问题,只需在ansible的ssh参数上加上“- tt“选项即可。
<代码> ssh_args=- c - o ControlMaster=auto - o ControlPersist=5 d tt 代码>
开启管道后,每次执行任务时都大量减少了ssh连接次数(只需要一次ssh连接),且省去了sftp传输任务文件的过程,因此在管理大量节点时能极大提升执行效率。