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

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。