1.Ansible优化技巧
在使用Ansible进行自动化管理时,可以采取一些优化措施来提高执行效率和可靠性。以下是一些常见的Ansible优化技巧:
并行执行:通过在Ansible playbook中设置forks参数,可以指定同时执行的任务数量。适当增加并行度可以加快任务执行速度。但是要注意服务器的资源限制,确保不会过载。
使用异步任务:对于一些耗时较长的任务,可以使用Ansible的异步任务功能。通过将任务标记为异步,可以在后台执行任务,而不会阻塞其他任务的执行。在需要等待任务完成的地方,可以使用async_status模块来检查任务的状态。
优化任务顺序:根据具体情况,可以优化任务的执行顺序,将耗时较长的任务放在后面,以便先执行一些较快的任务。这样可以更快地看到结果,并在后台执行较长的任务。
使用批量操作:对于多台主机上需要执行相同任务的情况,可以使用Ansible的批量操作功能。通过将多个主机组合成一个批量组,可以减少任务的执行次数,提高效率。
减少不必要的事务:在Ansible playbook中,尽量减少不必要的事务操作。例如,可以使用when条件来判断是否需要执行某个任务,避免不必要的重复操作。
使用模板缓存:Ansible使用Jinja2模板引擎来生成配置文件等内容。可以使用Ansible的模板缓存功能,将模板预先编译并缓存起来,以提高模板渲染的效率。
合理使用变量:在Ansible playbook中,合理使用变量可以提高可维护性和重用性。可以使用变量来存储常用的配置项,以便在多个任务中共享和重用。
使用插件和回调:Ansible提供了插件和回调机制,可以通过编写自定义插件和回调来扩展Ansible的功能。可以使用插件来实现一些特定的需求,提高自动化的灵活性和可扩展性。
2.优化
在企业环境中,如果管理的服务器越来越多,ansible的执行效率会变的很慢,可通过优化Ansible提高工作效率,由于Ansible基于SSH协议通信,SSH连接慢会导致整个基于Ansible执行变得缓慢,也需对OpenSSH进行优化
Ansible SSH关闭密钥检测
修改ansible的配置文件/etc/ansible/ansible.cfg
host_key_checking = False
OpenSSH连接优化
使用OpenSSH服务时,默认服务端配置文件UseDNS=YES,该选项会导致服务器根据客户端的IP地址进行DNS PTR反向解析。
关闭DNS解析:
[root@localhost ansible]# sed -i '/^GSSAPI/s/yes/no/g; /UseDNS/d; /Protocol/aUseDNS no' /etc/ssh/sshd_config [root@localhost ansible]# systemctl restart sshd
SSH pipelining 加速Ansible
SSH pipelinling 是一个加速 Ansible 执行速度的简单方法,SSH pipelinling 默认是关闭的。如果不适用sudo建议开启该选项,打开此选项可以减少Ansible执行没有文件传输时,SSH在被控机器上执行的连接数。
[root@localhost ansible]# vim /etc/ansible/ansible.cfg # By default, this option is disabled to preserve compatibility with # sudoers configurations that have requiretty (the default on many distros). # pipelining = True
需要注意的是:如果开启pipelining,需要被控的远程服务器将/etc/sudoers中的”Defaults requiretty”注释掉,否则会出现类似如:you must have a tty to run sudo 的报错
Ansible facts 缓存优化
Ansible PlayBook在执行过程中,默认会执行Gather facts,如果不需要获取客户端的fact数据的话,可以关闭。(False和No都小写也行)
关闭fact功能,在 PlayBook yaml 文件中加入:
gather_facts: no
设置ssh长连接
vim /etc/ansible/ansible.cfg ssh_args = -C -o ControlMaster=auto -o ControlPersist=3d
ControlPersist=5d,这个参数是设置整个长连接保持时间为5天
开启此参数的ssh长连接功能后,在会话过期前会一直建立连接
通过SSH连接过的设备都会在当前用户家目录的 .ansible/cp 目录下生成一个socket文件,每个会话对应生成一个socket文件
ControlPersist SSH 优化
CrontrolPersist 需要高版本的SSH支持,centos6默认不支持。
CrontrolPersist 即持久化socket,一次验证证多次通信。
只需要修改SSH客户端的配置,如果ansible以root登录,只需在客户端的 /root/.ssh/config 目录中添加以下代码:
HOST * Compression yes ServerAliveInterval 60 ServerAliveCountMax 5 ControlMaster auto ControlPath ~/.ssh/sockets/ % r@ % h- %p ControlPersist 4h
HOST * Compression yes:是否压缩会话 ServerAliveInterval 60:60s之内没有操作就会断开 ServerAliveCountMax 5:最大5个连接 ControlMaster auto:开启 ControlPath ~/.ssh/sockets/ % r@ % h- %p:会话文件路径 ControlPersist 4h:断开连接,会话文件保持4个小时
开启accelerate模式
accelerate模式类似于SSH的Multiplexing功能,都是使ansible控制服务器和远程服务器之间保持长连接。accelerate模式是使用python程序在远程服务器上运行一个守护进程,ansible通过这个守护进程监听的端口进行通信。
accelerate模式的开启方法很简单,只要在playbook中配置accelerate: true即可。ansible.cfg配置文件中需要配置一些accelerate参数,如:
[accelerate] accelerate_port = 5099 accelerate_timeout = 30 accelerate_connect_timeout = 5.0
对facts设置优化
ansible playbook默认第一个task是Gathering Facts收集各主机的facts信息,以方便我们在paybook中直接引用facts里的信息。
如果不需要用到facts信息的话,可以设置gather_facts: false,来省去facts采集这一步以提高playbook效率。
如果既想用facts信息,有希望能提高playbook的效率的话,可以采用facts缓存来实现。
facts缓存支持多种方式:json文件方式,redis方式,memcache方式等。各种方式的配置都是在ansible.cfg中配置。
json文件方式
gathering=smart fact_caching_timeout=86400 fact_caching=jsonfile fact_caching_connection=/path/to/ansible_fact_cache
这里的86400单位为秒,表示缓存的过期时间。保存facts信息的json文件保存在/path/to/ansible_fact_cache下面,文件名是按照inventory hostname来命名的。
redis方式
gathering=smart fact_caching_timeout=86400 fact_caching=redis
需要注意的是,facts存储不支持远端的redis,需要在ansible的控制服务器上安装redis;同时,还需要安装python的redis模块。
memcache方式
gathering=smart fact_caching_timeout=86400 fact_caching=memcached
与redis方式类似,需要运行memcached服务,同时,安装python的memcached依赖包
Forks主机连接数
forks用来设置同一时刻与目的主机连接数,也可以理解为主机并行数,默认值比较保守为5。在生产中,多数情况下我们会更改这个参数。如果控制节点的CPU和网络性能够用,设置几十上百个也是可以的
在ansible.cfg设置forks的全局默认值:(/etc/ansible/ansible.cfg)
[defaults] # some basic default values... forks = 20