性能优化

在默认设置的情况下,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

异步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

原文地址:http://www.cnblogs.com/anliven/p/16857814.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性