Ansible性能优化

  • ansible的执行效率比saltstack要慢的多的多,特别是被控节点量很大的时候
  • 在被控节点不太多的时候,默认的设置已经够快,但是即使被控节点数量巨大的时候,也可以通过一些优化去极大的提高ansible的执行效率

1. 关闭gathering facts功能

ansible-playbook的第一个步骤总是进行gather facts,且不论是否在palybook中设定这个tasks。

如果不需要获取被控企及的fact数据的话,就可以关闭获取fact数据功能,关闭之后,可以加快ansible-playbook的执行效率,尤其是在有大量机器的时候非常明显。

关闭获取facts只需在playbook文件中加上 “gather_facts: False” 或者 “gather_facts: No” (False和No都小写也行);或者直接在ansible的配置文件中配置。

  • test_01.yml
- hosts: 10.0.0.205
  remote_user: root
  gather_facts: False

  tasks:
    - name: first ansible test
      shell: executable=/bin/bash echo "first ansible test" >/tmp/ansible_test/ansible_first_test.txt

2. 开启SSH pipelining

pipeline是openssh的一个特性,ssh pipelining是一个加速Ansible执行速度的一个简单方法。

2.1 为何要开启pipelining

在ansible执行每一个任务的整个流程中,有一个过程是将临时任务文件put到远程的ansible客户机上,然后通过ssh连接过去远程执行这个任务,如果开启了pipelining,一个任务的所有动作都在一个ssh会话中完成,也会省去sftp到远端的过程,它会直接将要执行的任务在ssh会话中进行。

开启了pipelining之后,ansible的执行整个流程就少了一个PUT脚本去远程服务端的流程,然后就可以批量对机器执行命令,可以明显感受到速度的提升。

ssh pipelining默认是关闭的,默认关闭是为了兼容不同的sudo配置,主要是requiretty选项,如果不使用sudo,建议开启ssh pipelining选项。打开此选项可以减少ansible执行没有传输时ssh在被控机器上执行任务的连接数。但是如果使用sudo,必须关闭requiretty选项。

如果在ansible中使用sudo命令的话,需要在被控节点的 /etc/sudoer 中禁用 "requiretty",这样设置是因为ssh远程执行命令时,它的环境是非登录式非交互式shell,默认不会分配tty,没有tty,ssh的sudo就无法关闭密码回显(使用 -tt 选项前置ssh分配tty)。所以出于安全考虑,/etc/sudoers 中默认是开启 requiretty的,它要求只有拥有tty的用户才能使用sudo,也就是说ssh连接过去不允许执行sudo。

2.2 配置

1)Ansible开启SSH pipelining

vim  /etc/ansible/ansible.cfg

    pipelining = True

2)sudo中禁用 requiretty

  • 注意:这是在被Ansible管控的主机上设置的
grep requiretty /etc/sudoers  
    # Defaults    requiretty   直接将此项注释即可

3. 开启SSH长连接(ControlPersist特性)

3.1 优化思路

ansible天然支持openssh,默认连接方式下,它对ssh的依赖性非常强,所以优化ssh连接,在一定程序上也在优化ansible。其中一点就是开启ssh的长连接,长时间保持连接状态。

Ansible模式是使用SSH和远程主机进行通信, 所以Ansible对SSH的依赖性非常强, 在OpenSSH 5.6版本以后SSH就支持了Multiplexing(多路复用)。所以如果Ansible中控机的SSH -V版本高于5.6时, 就可以使用ControlPersist来提高ssh连接速度,从而提高ansible执行效率。

  • 查看ssh的版本:ssh  -V

ControlPersist 特性需要高版本的SSH才支持,CentOS6默认是不支持的,如要要使用,需要自行升级openssh(版本高于5.6)

ControlPersist即持久化socket,一次验证,多次通信,并且只需要修改ssh客户端就行,也就是只需要修改Ansible机器。

3.2 设置ssh长连接

vim  /etc/ansible/ansible.cfg

    ssh_args = -C -o ControlMaster=auto -o ControlPersist=3d

# ControlPersist=5d,这个参数是设置整个长连接保持时间为5天
# 开启此参数的ssh长连接功能后,在会话过期前会一直建立连接
# 通过SSH连接过的设备都会在当前用户家目录的 .ansible/cp 目录下生成一个socket文件,每个会话对应生成一个socket文件

4. 设置facts缓存

在执行playbook时,默认第一次task就是gathering facts,这个过程就是Ansible在搜集每台主机的facts信息,以在playbook中直接使用facts中的信息。

但是如果既想在每次执行playbook的时候都能搜集facts,又想加速这个过程,就需要配置facts缓存了。

目前Ansible支持使用json文件存储facts信息。

  • 修改配置文件 /etc/ansible/ansible.cfg
gathering = smart
fact_caching_timeout = 86400
fact_caching = jsonfile
fact_caching_connection = /dev/shm/ansible_fact_cache

5. Ansible的 -t 选项

Ansible的 -t 或 --tree 选项是将ansible的执行结果按主机名保存在指定目录下的文件中。

如果使用 -t 选项,将第一次执行得到的结果按 inventory中定义的主机名保存在文件中,下次执行到同一台主机时速度会变快很多,即使之后不再加上 -t 选项。

除了使用 -t 选项,使用重定向将结果重定向到某个文件中也是一样的效果。

  • 使用示例:
ansible  websrv -m shell -a "executable=/bin/bash hostname -t /tmp/test"
  • 参考:
    • https://www.cnblogs.com/kevingrace/p/11647338.html
原文地址:https://www.cnblogs.com/hgzero/p/13949207.html