一、调试

在执行 ad-hoc 或者 playbook 的时候,在后面加上 `-vvv` 参数,就可以看到  Ansible 的详细执行过程,便于排错。

[root@localhost home]# vim checkhost.yml
- hosts: all
tasks:
- name: check ping
ping
[root@localhost ~]# ansible dbservers -i hosts -m ping -vvv
[root@localhost ~]# ansible-playbook -i hosts checkhost.yml -vvv

限制授影响的主机

`--limit`  后面跟主机名或者主机组名

[root@localhost ~]# ansible-playbook -i hosts  checkhosts.yml --limit dbservers -vvv


二、优化 Ansible 执行速度

openssh5.6 版本后支持Multiplexing

设置 SSH 为长连接

检查控制机器的 ssh 版本 

[root@qfedu.com ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017


升级 ssh 客户端程序

  • 假如不是 5.6 版本以上的,可以用下面的办法升级 ssh 客户端程序
  • Centos6 系统的 YUM 源
ansible cat /etc/yum.repos.d/openssh.repo
[CentALT]
name=CentALT Packages for Enterprise Linux 6 - $basearch
baseurl=http://mirror.neu.edu.cn/CentALT/6/$basearch/
enable=1
gpgcheck=0
[root@localhost ~]# yum update openssh-clients

升级完成后,不必重启任何服务,因为我们的控制机是使用 ssh 的客户端


设置 ansible 配置文件

设置好后,重新连接一次被控主机,即可让控制主机和被控主机之间建立长连接

[root@localhost ~]# vim /etc/ansible/an0ible.cfg
ssh_args = -C -o ControlMaster=auto -o ControlPersist=6000s //开启此行
[root@localhost ~]# ansible-playbook -i hosts checkhost.yml

验证长连接

输出中 有 `ESTAB` 状态的就代表是长连接

同时会在主控机当前用户的家目录下的 .ansibl/cp/ 目录下生成对应的 socket 文件

自动化运维工具Ansible(12)调试与优化 Ansible_linux


开启 pipelining

默认情况下 Ansible 执行过程中会把生成好的本地 python 脚本文件 PUT 到 远端机器。如果我们开启了 ssh 的 pipelining 特性,这个过程就会在 SSH 的会话中进行。

自动化运维工具Ansible(12)调试与优化 Ansible_linux_02

在不通过实际文件传输的情况下执行ansible模块来使用管道特性, 可以减少执行远程服务器上的模块所需的网络操作数量。比如 PUT sftp 等操作都需要建立网络连接。

如果开启这个设置,将显著提高性能.。

然而当使用”sudo:”操作的时候, 你必须在所有管理的主机的 `/etc/sudoers` 中禁用 `requiretty`.

实现步骤

1) 在 ansible.cfg 配置文件中设置 pipelining 为 True

[root@localhost home]# vim /etc/ansible/ansible.cfg
pipelining = True

2) 配置被控主机的 `/etc/sudoers` 文件,添加下面的内容

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. 
# You have to run "ssh -t hostname sudo <cmd>".
#
# Defaults requiretty