Ansible - 7 - 性能优化
Ansible 性能优化
在默认设置的情况下,Ansible的执行效率已经可以满足大多数场景。
面对巨量目标主机时,可以通过一些配置优化去再提高ansible的执行效率。
Ansible 基本设置
# 通过 time 命令统计执行时间
time <ansible-command>
# 关闭SSH密钥检测
- 以SSH登录远程设备时,默认该设备会检查远程主机的公钥,并且将该公钥记录在~/.ssh/known_hosts文件中
- 当下次该主机访问时会核对公钥,如果公钥不同则会发出警告,如果公钥相同,则会提示输入密码
- 对主机公钥的检查是根据StrictHostKeyChecking变量的检查级别确定:no(不检查)、ask(是否检查要询问)、yes(每次都检查)、False(关闭检查)
- 设置 /etc/ansible/ansible.cfg 中参数 host_key_checking = False
# 并发数forks
- Ansible默认只会创建5个进程并发执行任务,所以在任务中只能同时控制5台主机执行
- forks是线程数,受限于CPU的核心数,加大forks值能让CPU尽量提升并发数量,一定程度上提高执行效率
- 设置 /etc/ansible/ansible.cfg 中 forks 参数,默认值为5
- 在执行命令时通过 -f 参数指定并发数
# 关闭 gather_facts
- playbook默认执行第一个tasks是gather_facts,用于收集主机信息
- 如果任务并不需要调用主机信息变量,建议关闭可以减少Ansible在收集客户端信息的时间,提高运行速度
- 可以在playbook文件中设置gather_facts参数为false或no(不区分大小写)
gather_facts: False
gather_facts: no
- 也可以设置 /etc/ansible/ansible.cfg 中参数
gather_facts: no
# 设置 facts缓存
- 不过禁用facts,可以采用facts缓存保证一定的运行效率来使用facts信息
- 在ansible.cfg中可以配置多种facts缓存的方式:json文件,redis,memcache等
- 使用redis存储facts文件需安装redis和响应的python库
- 以json文件方式为例
gathering=smart
fact_caching_timeout=86400
fact_caching=jsonfile
fact_caching_connection=/path/to/ansible_fact_cache
# serial滚动更新
- 并发可以在ansible.cfg里修改配置,也可以在playbook中限制服务端的并发数量
- Ansible默认将尝试并行管理playbook中所有的机器,可以使用serial关键字定义一次应管理多少主机
- 常应用与负载均衡环境下,不能一次性停止所有主机的场景
- 在play或者task下都可以设置serial参数,但其值对应的主机数不应大于forks值
serial: "30%" # 按百分比执行
serial: 2 # 指定单次执行数量
# OpenSSH链接优化(非必要,不建议)
- 默认情况下,使用OpenSSH时,服务器端会根据客户端的IP地址进行DNS反向解析,然后根据获取到的主机名再次进行DNS查询得到IP地址,比较这两个IP地址是否一致
- 可以在一定程度上提高安全性,但会花费更多时间,可以关闭这一特性来实现加速SSH链接速度
- 设置 /etc/ssh/sshd_config 中参数 UseDNS no
# 开启pipeling
- 发送执行命令代替命令临时文件(针对不使用sudo的场景,建议以单独ansible.cfg文件方式开启)
- 设置 /etc/ansible/ansible.cfg 中参数 pipelining = True
Ansible 异步async与轮询polling特性
# Ansible的异步async与轮询polling特性
# 适合使用到ansible的polling特性的场景
# - task需要运行很长的时间,这个task很可能会达到timeout
# - 任务需要在大量的机器上面运行
# - 任务是不需要等待它完成的
# 不适合使用polling特性的场景
# - task任务是需要运行完后才能继续另外的任务的
# - task任务能很快的完成
# 注意:需在ansible服务端的/etc/ansible/ansible.cfg文件里配置"host_key_checking = False"
- hosts: all
max_fail_percentage: 30 # 主机数最大失败百分比,只有在大于时中止tasks的执行,结合serial参数则以serial值为基准
serial: 7 # 定义同时执行操作的主机数,一般要小于forks的值,否则会按forks值进行“分片”执行任务
tasks:
- name: test-1
shell: sleep 5 && echo "test-1 done" && hostname && date
async: 9 # 任务执行时间的上限值,超时则任务失败,建议设置为略大于任务正常实际执行时长,设置为0时表示一直等待任务结束
poll: 2 # 检查任务结果的间隔时长,建议设置为小于任务实际执行时长,设置为0表示不用等待结果继续执行后续任务
register: script_result
- name: test-2
async_status: jid={{ script_result.ansible_job_id }} # 通过模块async_status查看轮询结果
register: job_result
until: job_result.finished #
retries: 10 # 重试10次
- name: test-3 # 将在所有主机执行完成后一次性返回结果
shell: echo "test-3 done" && hostname && date
全文跳转链接
Ansible系列全文地址 :https://www.cnblogs.com/anliven/p/16859401.html
行动是绝望的解药!
欢迎转载和引用,但请在明显处保留原文链接和原作者信息!
本博客内容多为个人工作与学习的记录,少数内容来自于网络并略有修改,已尽力标明原文链接和转载说明。如有冒犯,即刻删除!
以所舍,求所得,有所获,方所成。