更新日志:
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信息)
网友评论