让你的ansible飞起来
一、SSH Multiplexing
1 配置
vim /etc/ssh/ssh_config
Host * GSSAPIAuthentication yes # If this option is set to yes then remote X11 clients will have full access # to the original X11 display. As virtually no X11 client supports the untrusted # mode correctly we set this to yes. ForwardX11Trusted yes # Send locale-related environment variables SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE SendEnv XMODIFIERS ControlMaster yes # 这个是新增的 ControlPath /tmp/%r@%h:%p # 这个是新增的 ControlPersist 10m # 这个是新增的
2 测试
[root@host-172-20-6-120 playbooks]# ssh -O check 172.20.6.121 root@172.20.6.121's password: Master running (pid=16802) # 有这个说明开启成功 上面的不是”零“ 而是大写的0
测试速度
[root@host-172-20-6-120 playbooks]# time ssh 172.20.6.121 /bin/true root@172.20.6.121's password: ControlSocket /tmp/root@172.20.6.121:22 already exists, disabling multiplexing real 0m2.137s user 0m0.032s sys 0m0.005s
1 开启SSH长连接
ansible是通过使用ssh和远程主机进行通信,所以对ssh有这很强的依赖。在OpenSSH 5.6以后支持Multiplexing这个特性,可以通过在ansible配置中设置以支持该特性。
如下是配置参数,设置长连接保持时间为5天;control_path指定socket文件所保存的位置。
ssh_args = -o ControlMaster=auto -o ControlPersist=5d control_path = /etc/ansible/ssh-socket/%%h-%%p-%%r
通过上面配置后,ansible中控机上执行一次与远程主机的连接之后,这个连接会持久保持设定时间之久。可以通过netstat命令查看到ESTABLISHED状态的连接信息。
注意1:OpenSSH需要5.6以上版本,低版本需要升级才能使用。
Centos7系统上安装的OpenSSH版本是较新的,可以直接支持;对于Centos6的系统,自带的OpenSSH版本较低,可以用下面这个yum源进行升级yum update openssh-clients:
# /etc/yum.repos.d/openssh.repo [CentALT] name=CentALT Packages for Enterprise Linux 6 baseurl=http://mirror.neu.edu.cn/CentALT/6/$basearch/ enabled=1 gpgcheck=0
注意2:control_path指定的目录不存在,或执行ansible命令的用户没有写权限的话是会报错的。
2 开启pipelining
默认情况下,ansible的执行流程是把生成好的本地python脚本PUT到远程服务器然后运行。如果开启了pipelining,整个流程少了一个PUT脚本到远程服务器的步骤,直接在SSH的会话中进行,可以提高整个执行效率。
# 在ansible.cfg配置文件中设置pipelining为True pipelining = True
需要注意的是:如果开启pipelining,需要被控的远程服务器将/etc/sudoers中的”Defaults requiretty”注释掉,否则会出现类似如:you must have a tty to run sudo 的报错。
3 开启accelerate模式
accelerate模式类似于SSH的Multiplexing功能,都是使ansible控制服务器和远程服务器之间保持长连接。accelerate模式是使用python程序在远程服务器上运行一个守护进程,ansible通过这个守护进程监听的端口进行通信。
accelerate模式的开启方法很简单,只要在playbook中配置accelerate: true即可。ansible.cfg配置文件中需要配置一些accelerate参数,如:
[accelerate] accelerate_port = 5099 accelerate_timeout = 30 accelerate_connect_timeout = 5.0
注意:使用accelerate模式,需要控制服务器和远程服务器都安装python-keyczar包
4 对facts设置优化
ansible playbook默认第一个task是Gathering Facts收集各主机的facts信息,以方便我们在paybook中直接引用facts里的信息。
如果不需要用到facts信息的话,可以设置gather_facts: false,来省去facts采集这一步以提高playbook效率。
如果既想用facts信息,有希望能提高playbook的效率的话,可以采用facts缓存来实现。
facts缓存支持多种方式:json文件方式,redis方式,memcache方式等。各种方式的配置都是在ansible.cfg中配置。
1)json文件方式
vim /etc/ansible/ansible.cfg [defaults] gathering=smart fact_caching_timeout=86400 fact_caching=jsonfile fact_caching_connection=/path/to/ansible_fact_cache
这里的86400单位为秒,表示缓存的过期时间。保存facts信息的json文件保存在/path/to/ansible_fact_cache下面,文件名是按照inventory hostname来命名的。
2)redis方式
gathering=smart fact_caching_timeout=86400 fact_caching=redis
需要注意的是,facts存储不支持远端的redis,需要在ansible的控制服务器上安装redis;同时,还需要安装python的redis模块。
3)memcache方式
gathering=smart fact_caching_timeout=86400 fact_caching=memcached
与redis方式类似,需要运行memcached服务,同时,安装python的memcached依赖包。