前言



看到这个文档的人,应该都大致了解ansible。它是一款基于Python开发,完善的自动化运维工具,可以简单的实现批量的任务。由于其基于ssh,所以无需安装客户端,只要ssh可以登录上去,就可以执行批量的管理。举例来说:只要你会简单的ansible 命令,并且你的ansible服务器能登录其他服务器,就可以对大量的主机 批量安装软件,批量配置或发送文件,批量的添加计划任务,批量执行脚本等(目标主机的目录的权限和用户权限也得稍微注意点)。ansible也可以集成到Jenkins或者devops自己开发的平台,完成批量的发布代码和web界面的主机管理等任务。

实际上如果使用ansible仅仅只是执行简单的几条命令,例如批量 配置文件或添加计划任务等任务的话,使用ansible的默认配置即可。但是如果使用了一些特殊模块,还是需要对部分配置文件进行调整的。下面记录的某一次执行ansible-playbook的出现的问题及处理方法。



问题


执行ansible-playbook批量为主机安装软件,但是速度特别的慢



可能原因:
基于ssh,是否ssh连接客户端,网络延迟大
是否ansible服务器资源不足或负载较高
是否执行时,有部分主机报错,执行失败
是否playbook执行的yml问题
是否ansible本身配置问题



解决方法



<1>使用ssh登录主机,发现延迟并不高
我是内网环境,且ssh已被调优。应该不是网络导致的原因。

如果是连接外网的服务器,通常的确特别慢。建议"合法上网"或对应使用云服务厂商的SSL-VPN等服务。

如果是连接内网的服务器慢,建议修改如下参数:

vim  /etc/ssh/sshd_config

GSSAPIAuthentication no
UseDNS no


<2>服务器负载并不高(此问题忽略)

如果是负载高导致,需要等待负载较高的服务处理完成
如果资源不足,只能扩大资源



<3>执行ansible-playbook的确有部分主机报错,报错后,跳过异常,往下一台继续执行。
并非导致执行慢的主要原因。待执行完成后,对报错主机再处理。



<4>检查playbook的yml

yml符合格式,可正常推送,只是比较慢



<5>查看ansible配置文件


1、fork 为 5, 并行进程数为5个,可根据服务器资源扩大


2、实际主要问题在执行playbook后,第一步特别慢(GATHERING FACTS)

原因是由于Ansible默认对远程主机执行任何一个playbook之前,都会先通过setup模块获取facts。它是从远程主机上自动收集的变量。包括主机名、内核版本、网卡、IP、环境变量等等信息,用于ansible后续的其他操作,所以特别费时间,通常如果不需要facts需要对其配置进行关闭。如果需要就必须的开启了,(例如:你要获取远程主机的系统版本,然后判断安装什么版本的包),可以配置redis缓存facts。

fact关闭方法:

 vim  /etc/ansible/ansible.cfg 
 
gathering = explicit 

#smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts
#implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False
#explicit 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture


fact配置redis缓存方法
 
 vim  /etc/ansible/ansible.cfg 
 
[defaults]
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
#redis的ip和端口,也可使用域名
fact_caching_connection = 192.168.1.5:6379



如果redis设置了密码为admin
fact_caching_connection = 192.168.1.5:6379:0:admin