ansible问题及优化

ansible 优化

优化变量收集facts
在playbook执行过程中,ansible收集facts变量是很耗时的一个步骤,如果我们确定play中没有用到fact变量信息,可以直接将其关闭,关闭获取 facts 很简单,只需要在 playbook 文件中加上“gather_facts: no”即可。

但是在实际使用中不收集facts变量的情况很少。在gather_facts关闭的情况下,我们可以给play单独添加一个setup模块,并通过gather_subset参数严格控制facts的收集种类,这样既拿到了我们需要的fact变量又提高了ansible的执行效率,gather_subset参数的默认值为all。

playbook中使用方法示例:

- 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子集,说明只收集该子集信息

也可以设置facts 缓存

 # 保存json文件
 gathering = smart
 fact_caching_timeout = 86400
 fact_caching = jsonfile
 fact_caching_connection = /dev/shm/ansible_fact_cache   #缓存文件的存储路径

 # 保留到redis  目前facts 存储还不支持远端,所以需要在Ansible 中控机上安装Redis 服务,然后安装Redis Python 库
 gathering = smart
 fact_caching_timeout = 86400
 fact_caching = redis


Strategy
strategy的作用范围是一个playbook,通过设置不同参数,控制一个play内所有任务的执行策略。

设置方法为更改ansible.cfg里的strategy参数,默认值为linear,可选参数为free;另外一种方式是在playbook内定义该策略,格式为:

  • hosts: all
    strategy: free
    tasks:
    ...
    参数含义:

linear策略即线性执行策略,线性执行策略指主机组内所有主机完成一个任务后才继续下一个任务的执行,在执行一个任务时,如果某个主机先执行完则会等待其他主机执行结束。说直白点就是第一个任务在指定的主机都执行完,再进行第二个任务的执行,第二个任务在指定的主机都执行完后,再进行第三个任务的执行…… 以此类推。
free策略即自由策略,即在一个play执行完之前,每个主机都各顾各的尽可能快的完成play里的所有任务,而不会因为其他主机没执行完任务而等待,不受线性执行策略那样的约束。所以这种策略的执行结果给人感觉是无序的甚至是杂乱无章的,而且每次执行结果的task显示顺序很可能不一样。


Forks主机连接数
forks用来设置同一时刻与目的主机连接数,也可以理解为主机并行数,默认值比较保守为5。在生产中,多数情况下我们会更改这个参数。如果控制节点的CPU和网络性能够用,设置几十上百个也是可以的。

在ansible.cfg设置forks的全局默认值:

# ansible.cfg
[defaults]
forks  = 15

Serial主机连接数
serial用于控制一个play内的主机并行数,这个并行数不能超过forks,超过后则serial不会生效。

定义方法如下:

--
- hosts: nodes
  serial: 2
  tasks:
     .....................

本质上,serial作用范围是一个play,受限于forks,但比forks控制的更加细节。假如我们的forks设置为100,但是想让某个play里的所有任务并行数为50的执行,此时我们应该想到serial这个调优方法。

开启长链接
ansible使用ssh协议和被管控主机通信,开启长连接后会有一个established的连接
openssh5.6以后的版本支持了multiplexing,如果管控机命令行执行ssh -V得到的版本号大于5.6就可以设置长连接
[root@localhost ansible]# vim ansible.cfg
[ssh_connection]
echo "ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d" >> /etc/ansible/ansible.cfg

更多详细操作

ansible生产问题

ansible排错: -vvv
1.没ssh建立免密就执行ansible,出现UNREACHABLE的错误
2.remote_user权限不足
3.playbook中关键字写错
4.长链接时ssh版本不匹配

一个主机无法正常执行,会影响到其他主机的执行吗? ---不会

test.yml

---
- hosts: web       ##服务器组
  remote_user: root  ##远程登录的用户
  serial: 2
  tasks:   ##任务
  - name: test
    shell: pwd
  - name: test2
    shell: ls

一共四台主机,这里设置了并行数是2
把第一台主机下线了

[root@slave1-node ansible]# ansible-playbook test.yml 

PLAY [web] *********************************************************************

TASK [Gathering Facts] *********************************************************
fatal: [192.168.122.222]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.122.222 port 22: No route to host", "unreachable": true}
ok: [10.0.122.119]

TASK [test] ********************************************************************
changed: [10.0.122.119]

TASK [test2] *******************************************************************
changed: [10.0.122.119]

PLAY [web] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.122.57]
ok: [47.98.34.58]

TASK [test] ********************************************************************
changed: [192.168.122.57]
changed: [47.98.34.58]

TASK [test2] *******************************************************************
changed: [192.168.122.57]
changed: [47.98.34.58]

PLAY RECAP *********************************************************************
10.0.122.119               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.122.222            : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
192.168.122.57             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
47.98.34.58                : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

你可能感兴趣的:(ansible问题及优化)