105)ansible优化
1. 连接优化[openssh]
- 开启SSH长连接
ssh版本:> 5.6
-
关闭ansible的SSH密钥检测
ansible默认是以ssh来实现远程推送执行的,是基于ssh秘钥检测,会检测远程主机的公钥,并记录在本地中known_host文件中,下次访问主机时,会核对公钥,如果公钥不同,openssh会发出警告,如果相同,会提示输入密码
SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来设定的,StrictHostKeyChecking检查级别包括:no(不检查)、ask(询问)、yes(每次都检查)、False(关闭检查)。
vim /etc/ansible/ansible.cfg
host_key_checking = False #关闭StrictHostKeyChecking检查
- openssh UseDNS
使用OpenSSH服务时,默认服务器端配置文件UseDNS=YES状态,该选项会导致服务器根据客户端的IP地址进行DNS PTR反向解析,得到客户端的主机名,然后根据获取到的主机名进行DNS正向A记录查询,并验证该IP是否与原始IP一致。关闭DNS解析代码如下:
sed -i '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no' /etc/ssh/sshd_config
- SSH pipelining加速Ansible
开启「pipelining」特性实际上是通过减少ssh连接次数,从而缩短ansible执行时间
SSH pipelining是一个加速 Ansible 执行速度的简单方法,SSH pipelining 默认是关闭的,关闭是为了兼容不同的 sudo 配置,主要是requiretty 选项。
如果不使用Sudo建议开启该选项,打开此选项可以减少Ansible 执行没有文件传输时,SSH在被控机器上执行任务的连接数。使用Sudo操作的时候, 必须在所有被管理的主机上将配置文件/etc/sudoers中requiretty选项禁用。
sed -i '/^pipelining/s/False/True/g' /etc/ansible/ansible.cf
2- Ansible Facts缓存优化
- 关闭
gather_facts: nogather_facts: no
- 保存在文件或者redis中[只在第一次连接时收集]
Gather subset:
给play单独添加一个setup模块,并通过gather_subset参数严格控制facts的收集种类,这样既拿到了我们需要的fact变量又提高了ansible的执行效率,gather_subset参数的默认值为all。
- yaml:
- name: Collect only facts returned by facter
setup:
gather_subset:
- '!all'
- '!any'
- facter
- 命令行:
ansible all -m setup -a 'gather_subset=!all,!any,facter'
可用参数有all, min, hardware, network, virtual, ohai, facter,可以使用列表的格式指定多个参数,使用「!」指定不收集的facts类型。
比较常用的几个范例:
- 仅指定facter,说明收集puppet facter和min子集信息(默认包含min子集)。
- 指定「!all」,说明只收集min子集信息
- 指定「!all,!min」,说明不收集任何信息
- 指定「!all,!any」+其他的fact子集,说明只收集该子集信息
3- Control_path
control_path通过设置ControlPath sockets的文件路径与文件命名避免因sockets文件过长(超过108个字符串)导致ansible报错的问题。
设置方法为更改ansible.cfg里的control_path参数,ansible2.7版本默认值为「配置项control_path_dir的值」+「根据hostname生成的哈希值」+「ssh端口号」+「用户名」
在ansible旧版本中,默认值是包含主机名的,这在一些特殊情况下(例如EC2主机),会因主机名过长导致ControlPath sockets文件过长,从而导致ansible执行报错。但在新版本中默认值的主机名部分被替换为主机名的哈希值,这很大程度上避免了该问题的发生。
4- Strategy
strategy的作用范围是一个play,通过设置不同参数,控制一个play内所有任务的执行策略。
设置方法为更改ansible.cfg里的strategy参数,默认值为linear,可选参数为free;另外一种方式是在playbook内定义该策略,格式为:
- hosts: all
strategy: free
tasks:
...
参数含义:
- linear策略即线性执行策略,线性执行策略指主机组内所有主机完成一个任务后才继续下一个任务的执行,在执行一个任务时,如果某个主机先执行完则会等待其他主机执行结束。说直白点就是第一个任务在指定的主机都执行完,再进行第二个任务的执行,第二个任务在指定的主机都执行完后,再进行第三个任务的执行…… 以此类推。
- free策略即自由策略,即在一个play执行完之前,每个主机都各顾各的尽可能快的完成play里的所有任务,而不会因为其他主机没执行完任务而等待,不受线性执行策略那样的约束。所以这种策略的执行结果给人感觉是无序的甚至是杂乱无章的,而且每次执行结果的task显示顺序很可能不一样。
5- Forks
forks用来设置同一时刻与目的主机连接数,也可以理解为主机并行数,默认值比较保守为5。在生产中,多数情况下我们会更改这个参数。如果控制节点的CPU和网络性能够用,设置几十上百个也是可以的。
- 配置文件:
ansible.cfg
[defaults]
forks = 15
- 命令行:
通过「--forks」或「-f」指定
lab-ansible ansible-playbook playbooks/test_forks.yaml --fork 10
ansible的同步模式与异步模式执行区别:
同步模式: 如果节点数太多,ansible无法一次在所有远程节点上执行任务,那么将先在一部分节点上执行一个任务(每一批节点的数量取决于fork进程数量,默认为5个,可设置),直到这一批所有节点上该任务完全执行完毕才会接入下一个批节点,直到所有节点将该任务都执行完毕,然后重新回到第一批节点开始执行第二个任务。依次类推,直到所有节点执行完所有任务,ansible端才会释放shell。这是默认的同步模式,也就是说在未执行完毕的时候,ansible是占用当前shell的,任务执行完毕后,释放shell了才可以输入其他命令做其他动作。
异步模式:假如fork控制的并发进程数为5,远程控制节点为24个,则ansible一开始会将5个节点的任务扔在后台,并每隔一段时间去检查这些节点的任务完成情况,当某节点完成不会立即返回,而是继续等待直到5个进程都空闲了,才会将这5个节点的结果返回给ansible端,ansible会继续将下一批5个节点的任务扔在后台并每隔一段时间进行检查,依次类推,直到完成所有任务。
在异步模式下,如果设置的检查时间间隔为0,在将每一批节点的任务丢到后台后都会立即返回ansible,并立即将下一批节点的任务丢到后台,直到所有任务都丢到后台完成后,会返回ansible端,ansible会立即释放占用的shell。也就是说,此时ansible是不会管各个节点的任务执行情况的,不管执行成功还是失败。因此,在轮训检查时间内,ansible仍然正在运行(尽管某批任务已经被放到后台执行了),当前shell进程仍被占用处于睡眠状态,只有指定的检查时间间隔为0,才会尽快将所有任务放到后台并释放shell。
6- Serial
用于控制一个play内的主机并行数,这个并行数不能超过forks,超过后则serial不会生效
- yaml
--
- hosts: nodes
serial: 2
tasks:
serial作用范围是一个play,受限于forks,但比forks控制的更加细节。
7- Async and poll
同步阻塞模式和异步模式
- 同步阻塞模式指在playbook执行时,控制端和被控制端会一直保持连接状态,逐个任务的执行,直到该playbook执行完毕,这种模式称为同步阻塞模式,也是absible的默认执行模式。
- 异步模式指ansible将一次性运行所有的任务,并将所有的任务丢到后台执行,每个任务有一个job_id,ansible会根据这个job_id每隔一段时间轮训检测该任务的执行情况,直到检测到任务执行结束。这种模式称为异步模式。
Async and pool
前面章节我们所说的Strategy、Forks、Serial都是ansible同步阻塞模式下的优化方法,其中,strategy是通过控制任务执行策略进行优化,forks和serial是通过控制并行数进行优化。
针对某些特殊任务,尤其是可能被锁住或超时的任务,我们可以采用ansible异步模式来提高执行效率。
async和poll分别用来指定异步模式下任务的最大运行时间和检测间隔时间,poll的缺省值为10。
- yaml
---
- hosts: all
remote_user: root
tasks:
- name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec
command: /bin/sleep 15
async: 45
poll: 5
sleep命令采用异步的方式执行,ansible会等待该任务最长45秒,每隔5秒钟检测一次任务的执行结果。
特殊情况下,我们可以将poll的值设置为0,这代表ansible将任务放到后台后,不会再管这个任务的执行状态,任其自生自灭。
ansible并发和异步:
ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行。那如果你有大量的机器需要控制,或者你希望减少进程数,那你可以采取异步执行。
使用async和poll这两个关键字便可以并行运行一个任务。 async这个关键字触发ansible并行运作任务,而async的值是ansible等待运行这个任务的最大超时值(如果执行超时任务会强制中断导致失败),而poll就是ansible检查这个任务是否完成的频率时间。
8- ControlPersist
ControlPersist 特性需要高版本的 SSH 才支持,CentOS 6 默认是不支持的,如果需要使用,需要自行升级 openssh。ControlPersist 即持久化 socket,一次验证,多次通信。并且只需要修改 ssh 客户端就行,也就是 Ansible 机器即可。
ControlPersist 设置:
cat ~/.ssh/config
Host *
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 5
ControlMaster auto
ControlPath <a href="mailto:~/.ssh/sockets/%25r@%25h-%25p"><code>~/.ssh/sockets/%r@%h-%p</code></a>
ControlPersist 4h
9- 任务
- 目录结构
如果只是一个简单的独立任务,使用playbook文件即可,方便我们在其他地方引用. 复杂建议采用role形式管理.
- 定义多环境
通过Inventory 方式去区分多环境下的主机或者主机组信息. 生成多个主机文件.
不同环境需要调用不同的playbook 或者task ,可以通过when 方式去判断当前的主机信息存在哪个环境中,然后进行引用.
- 检测
ansible-playbook 命令的–syntax-check 参数即可
- 灰度发布
挑选一台机器进行测试,只有进行测试之后我们才知道整个配置流程是否达到我们想要结果.
进行预运行时,我们只需要把一个或者多个task 使用delegate_to参数指定到一台设备上进行测试. 如果测试通过后,再进行接下来的工作.
- 统一管理
纳入git/svn仓库管理