让你的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依赖包。

posted @ 2018-03-26 17:50  wanstack  阅读(635)  评论(0编辑  收藏  举报