zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Navicat for Mysql安装及破解教程
    如何down掉IB交换机口
    pycharm替换文件中所有相同字段方法
    NAS、SAN、ISCSI存储
    Linux系统下安装rz/sz命令及使用说明
    python 实现查找某个字符在字符串中出现次数,并以字典形式输出
    python class用法
    zookeeper
    机器学习基础
    hive--数据仓库
  • 原文地址:https://www.cnblogs.com/hgzero/p/13949207.html
Copyright © 2011-2022 走看看