ansible 最佳实践1 — 推荐配置
0 条评论打开 SSH 长连接
SSH 长连接需要 openssh 版本 >= 5.6
需修改ansible配置文件:/etc/ansible/ansible.cfg
# ControlPersist表示连接时间,默认为60s,改为86400s
ssh_args = -C -o ControlMaster=auto -o ControlPersist=86400s
//......
打开 SSH Pipeline
pipeline是SSH的功能、
运行一个ansible命令的时候,中间会有很多操作,比如和主机的三次握手、四次挥手,以及在过程中还有 put 、create等这些操作,
为了减少这种额外的操作,可以开启 SSH 的 Pipeline,这些操作直接在 SSH 会话中完成,使用 pipeline 可以减少执行过程中模块所需要的网络操作数。需修改ansible配置文件:/etc/ansible/ansible.cfg
//......
# 默认为False,改为True
pipelining = True
//......
开启 pipelinin 要注意:当使用“sudo:”时,必须首先在远程主机 /etc/sudoers 中禁用 ‘requiretty’,不用 sudo 就不用管它,所以开启 pipelinin 对 sudo 命令有影响。对此文档中也有说明,如下:

将 Facts 缓存到 JSONFILE 或 Redis
如果不希望每次执行 playbook 都去获取 facts,但还是希望使用 ansible_facts 变量,这时就可以把 Facts 缓存到本机文件或 redis ,只有时间缓存的时间过期了才会重新获取facts,缓存 facts 变量也能加速 playbook 的执行。需修改ansible配置文件:/etc/ansible/ansible.cfg
- 将 Facts 缓存到 JSONFILE
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /dev/shm/ansible_facts_cache/
fact_caching_timeout = 86400
- 将 Facts 缓存到 Redis
gathering = smart
fact_caching = redis
fact_caching_connection=redis主机IP:端口
fact_caching_timeout = 86400
配置项说明:
gathering 表示获取 fact 的策略,有以下几种:
- smart - 默认收集,但如果已经收集则不重新收集
- implicit - 默认收集,用gather_facts关闭:False, 这个时默认策略
- explicit - 默认情况下不收集,必须说 gather_facts: True
fact_caching 表示把 fact 的持久化形式, 有以下几个值:
- memory
- jsonfile
- redis
fact_caching_connection 表示把持久化的 fact 文件放在什么地方。注意:不要随意设置一个目录,这样有时候会被删掉。比如 /tmp 目录, 可能有些计划任务每隔一段时间就会清理。
fact_caching_timeout 表示缓存过期时间,默认为60,一般改为86400。
更改 ansible 的执行策略为 free
在命令中可以使用 -f 指定并发的个数,比如 -f 5,表示每次并发(并行)执行 5 台远程主机。不管是 AdHoc 还是 PlayBook,默认策略是批处理执行,比如资产文件中有 15 台机器,编号为 h1 - h15,运行 ansible 命令后:
- 第一次执行编号为 h1 - h5 的机器, 这5台机器执行完成,并且结果全部返回后再执行第二次。
- 第二次执行编号为 h6 - h10 的机器, 这5台机器执行完成,并且结果全部返回后再执行第三次。
- 第三次执行编号为 h11 - h15 的机器, 这5台机器执行完成,并且结果全部返回,这个命令结束。
从 ansible 2.0 开始,ansible-playbook 可以设置一个 free 模式 :
vi /etc/ansible/ansible.cfg
......
# by default, ansible will use the 'linear' strategy but you may want to try
# another one
#strategy = free
......
如果是自由模式,同样假如资产文件中有 15 台机器,编号为 h1 - h15,运行 ansible 命令后,-f 5 还是先执行5个,但是假如 h4 先执行完,并且返回了结果,这时就会把 h6 添加进执行队列;然后再假如 h3 执行完,并且返回了结果,这时 h7 再添加进执行队列。也就是说保持整个队列一直是 5 台机器在执行,这样交替切换,一直到执行完最后一个。
- 优点:执行速度更快。
- 缺点:屏幕上打印的的内容有点乱。
异步运行命令
不管是 AdHoc 还是 PlayBook 命令输入后,总是一直要等到完成才能输入下一条命令。如果执行需要超长时间才能完成的任务,这时就需要它先去执行(相当于让其后台执行),然后通过一个机制最后得到执行结果,这个方式就叫异步。异步/轮询参数设置:
- -B 后台运行超时时间
- -P 调查后台程序时间
# "-P"参数的值大于0,这种情况仍然时同步,只是多了轮询功能。"-B 11 -P 3" 表示后台执行命令最大时间是 11s; -P 每 3s 检查下状态
ansible all -i 192.168.32.100, -m shell -a "sleep 10; echo 'hello'" -B 11 -P 3
# "-P"参数的值等于0,这种情况就是异步,"-P 0"表示不等待返回
ansible all -i 192.168.32.100, -m shell -a "sleep 10; echo 'hello'" -B 11 -P 0
后台执行会返回 ansible_job_id 和 results_file,result_file 这个文件在被执行机器上,ansible提供了一个模块,通过这个模块可以获取这个结果。
