Skip to content

1.Ansible优化

1.1 关闭facts

只需要在playbook文件中加上"gather_facts: False" 或者 "gather_facts: No"即可

yaml
- hosts: nginx
  remote_user: root
  gather_facts: False
 
  tasks:
    - name: this is a test
      shell: echo "haha"
- hosts: nginx
  remote_user: root
  gather_facts: False
 
  tasks:
    - name: this is a test
      shell: echo "haha"

1.2 开启SSH pipelining

pipeline是openssh的一个特性,ssh pipelining 是一个加速Ansible执行速度的简单方法。

在ansible执行每个任务的整个流程中,有一个过程是将临时任务文件put到远程的ansible客户机上,然后通过ssh连接过去远程执行这个任务。 如果开启了pipelining,一个任务的所有动作都在一个ssh会话中完成,也会省去sftp到远端的过程,它会直接将要执行的任务在ssh会话中进行。

sshpipelining 默认是关闭!!!!之所以默认关闭是为了兼容不同的sudo配置,主要是 requiretty 选项。如果不使用sudo,建议开启!!! 打开此选项可以减少ansible执行没有传输时ssh在被控机器上执行任务的连接数。 不过,如果使用sudo,必须关闭requiretty选项。修改/etc/ansible/ansible.cfg 文件可以开启pipelining

$ vim /etc/ansible/ansible.cfg
........
pipelining = True
$ vim /etc/ansible/ansible.cfg
........
pipelining = True

❌ 注意

如果在ansible中使用sudo命令的话(ssh user@host sudo cmd),需要在被控节点的/etc/sudoers中禁用"requiretty"!!!!

之所以要设置/etc/sudoers中的requiretty,是因为ssh远程执行命令时,它的环境是非登录式非交互式shell,默认不会分配tty,没有ttysshsudo就无法关闭密码回显(使用 "-tt"选项强制SSH分配tty)。所以出于安全考虑,/etc/sudoers中默认是开启requiretty的,它要求只有拥有tty的用户才能使用sudo,也就是说ssh连接过去不允许执行sudo。 可以通过visudo编辑配置文件,注释该选项来禁用它。

$ grep requiretty /etc/sudoers  
# Defaults  requiretty
$ grep requiretty /etc/sudoers  
# Defaults  requiretty

1.3 开启长连接

Ansible中控机的SSH -V版本高于5.6时, 就可以使用ControlPersist来提高ssh连接速度,从而提高ansible执行效率

$ vim /etc/ansible/ansible.cfg
..........
ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d

# 注意:ConrolPersist=5d, 这个参数是设置整个长连接保持时间为5天。
$ vim /etc/ansible/ansible.cfg
..........
ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d

# 注意:ConrolPersist=5d, 这个参数是设置整个长连接保持时间为5天。

1.4 取消交互

bash
$ vim /etc/ansible/ansible.cfg
........
host_key_checking = False          # 打开注释即可
    
# 取消ssh的yes和no的交互:
$ vim /root/.ssh/config
UserKnownHostsFile /dev/null
ConnectTimeout 15
StrictHostKeyChecking no
    
或者直接ssh时增加一个参数
$ ssh -o StrictHostKeyChecking=no -p22 root@10.4.7.101
$ vim /etc/ansible/ansible.cfg
........
host_key_checking = False          # 打开注释即可
    
# 取消ssh的yes和no的交互:
$ vim /root/.ssh/config
UserKnownHostsFile /dev/null
ConnectTimeout 15
StrictHostKeyChecking no
    
或者直接ssh时增加一个参数
$ ssh -o StrictHostKeyChecking=no -p22 root@10.4.7.101

2.完整配置

cat /etc/ansible/ansible.cfg
# config file for ansible -- http://ansible.com/

[defaults]
forks = 20
host_key_checking = False
remote_user = root
roles_path = roles/
gathering = smart
fact_caching = jsonfile
fact_caching_connection = $HOME/ansible/facts
fact_caching_timeout = 600
log_path = $HOME/ansible.log
nocows = 1
callback_whitelist = profile_tasks

[privilege_escalation]
become = False

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=600s -o ServerAliveInterval=60
control_path = %(directory)s/%%h-%%r
pipelining = True
timeout = 10
cat /etc/ansible/ansible.cfg
# config file for ansible -- http://ansible.com/

[defaults]
forks = 20
host_key_checking = False
remote_user = root
roles_path = roles/
gathering = smart
fact_caching = jsonfile
fact_caching_connection = $HOME/ansible/facts
fact_caching_timeout = 600
log_path = $HOME/ansible.log
nocows = 1
callback_whitelist = profile_tasks

[privilege_escalation]
become = False

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=600s -o ServerAliveInterval=60
control_path = %(directory)s/%%h-%%r
pipelining = True
timeout = 10