Ansible执行速度优化指北

更新日志:
2019.11.06  更新方法一:禁用采集facts信息;

  最近没事看了看ansible,试了个最简单的playbook,发现执行效率很差,跟saltstack差很多,google了下,发现主要是因为ansible使用ssh执行导致的(这一点也是跟saltstack最大的不同),在此找了找解决方法记录分享下。
  ansible/python版本如下:

#ansible --version
ansible 2.4.2.0
python version = 2.7.5 (default, Apr  9 2019, 14:30:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

  playbook内容hello.yml内容,一个很简单的hostname命令

---
- hosts: k8s_nodes
  remote_user: root
  
  tasks:
    - name: hello
      command: hostname

  执行hello.yml,3个节点竟然需要58s!

[root@master playbook]# time ansible-playbook hello.yml 

PLAY [k8s_nodes] ****************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [10.1.129.122]
ok: [10.1.129.123]
ok: [10.1.129.121]

TASK [hello] ********************************************************************************************************************************************************************************************************************************
changed: [10.1.129.122]
changed: [10.1.129.123]
changed: [10.1.129.121]

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
10.1.129.121               : ok=2    changed=1    unreachable=0    failed=0   
10.1.129.122               : ok=2    changed=1    unreachable=0    failed=0   
10.1.129.123               : ok=2    changed=1    unreachable=0    failed=0   


real    0m58.228s
user    0m10.588s
sys     0m3.153s

  在playbook中添加一行gather_facts: no,再执行只需要6s不到!:

[root@master playbook]# time ansible-playbook hello.yml 

PLAY [k8s_nodes] ****************************************************************************************************************************************************************************************************************************

TASK [hello] ********************************************************************************************************************************************************************************************************************************
changed: [10.1.129.122]
changed: [10.1.129.123]
changed: [10.1.129.121]

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
10.1.129.121               : ok=1    changed=1    unreachable=0    failed=0   
10.1.129.122               : ok=1    changed=1    unreachable=0    failed=0   
10.1.129.123               : ok=1    changed=1    unreachable=0    failed=0   


real    0m5.866s
user    0m3.785s
sys     0m1.020s

  关于facts是什么以及为什么不禁用会导致慢可以看这篇文章《Ansible 进阶 | facts 缓存》
  简单来说就是: facts是远程主机的一堆系统信息,Ansible在对远程主机执行任何一个 playbook 之前,总会先通过 setup 模块获取该主机的 facts,并暂存在内存中,直至该 playbook 执行结束。随着主机数量增多,获取这么多数据也是是非常耗时的。
  看来使用gather_facts: no也是暂时解决这个问题,后续还需要使用redis缓存facts信息(关键词:Ansible 的配置文件中可以修改 gathering结合redis缓存缓存facts信息)

你可能感兴趣的:(Ansible执行速度优化指北)