Ansible 速度优化
1、Ansible的并发和异步
Anisble默认是同步阻塞模式,他会等待所以机器执行完毕后才会向前台返回。Ansible默认只会创建5个进程执行并发任务。
Anisble除了支持同步模式外还支持异步模式。下面的这种情况需要使用的异步特性
(1)当我们有一个task需要运行很长的时间,而且这个task可能会达到timeout时。
(2)当我们有一个任务需要在大量的机器上运行时
(3)当我们有一个任务不需要等待它完成时
官方给的示例代码如下所示:
---
- 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
async:代表这个任务执行时间的上线值,如果执行所用时间超过了这个时间点,则认为任务失败,若没设置参数,则同步执行
poll:表示 任务异步执行时间轮询的时间间隔
在此异步模式下,Ansible 会将节点的任务丢在后台,每台被控制的机器都有一个job_id, Ansible 会根据这个job id去轮询该机器上任务的执行情况,例如某机器H此任务中的某一个阶段是否完成,是否进入下一个阶段等。即使任务早就结束了,也只有等轮询检查到任务结束之后才认为该任务结束。可以指定任务检查的时间间隔,默认是10秒。除非指定任务检查的时间间隔为0,否则会等待所有任务都完成后,Ansible 端才会释放占用的Shell.如果指定的时间间隔为0,则Ansible会立即返回(至少得连接上目标主机,任务发布成功之后立即返回),并且不会检查它的任务进度。
ansible webserver -B 30 P 0 -m yum -a ' name=php' -vv
参数说明:-B 30 表示启用异步,超时时间为30秒,-P0表示轮询时间为0 既不检查任务进度,立即返回结果
2、开启 SSH MUltiplexing
我们一般远程主机都是用openssh程序进行远程连接,openssh支持一个优化 称为 SSH Multiplexing (简称为多路复用),多个连接到相同的被控主机的SSH绘画将会共享相同的TCP连接,只有第一次连接的时候进行3次握手。
具体方法:修改/root/.ssh/config文件
Host * ControlMaster auto ControlPath /tmp/master-%r@%h:%p ControlPersist 10m
3、开始SSH pipelining
下面回忆一下Ansible 是如何执行一个tak任kptinge也是OoS的特性之一,的,具体步骤如下所示。
1) Asle基于调用的模块生成一个Python临时脚本。
2)它将此临时脚本复制到被控端主机上。
3)执行此Python临时脚本。
4)执行成功以后删除此临时脚本,抹去痕迹。
具体方法如下:
编辑Ansible配置文件,在【ssh_connection】加以下内容
pipelining = True
4、fscts缓存
每次在运行tasks任务时都会收集主机信息,这个过程就是在收集每台主机的facts信息,我们可以通过redis的方式来缓存facts的方式
修改ansible配置文件
gathering = smart fact_caching = redis fact_cashing_timeout = 86400 fact_caching_connection = 127.0.0.1:6739
......