1.Ansible优化
1.1 关闭facts
只需要在playbook文件中加上"gather_facts: False"
或者 "gather_facts: No"
即可
- 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
,没有tty
,ssh
的sudo
就无法关闭密码回显(使用 "-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 取消交互
$ 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