天天看点

《Ansible权威指南 》一3.2 Ad-Hoc命令集介绍

本节书摘来自华章出版社《ansible权威指南 》一书中的第3章,第3.2节,李松涛 魏 巍 甘 捷 著更多章节内容可以访问云栖社区“华章计算机”公众号查看。

本节介绍通过ad-hoc命令集查看系统设置,通过ad-hoc研究ansible的并发特性,通过ad-hoc研究ansible的模块使用。俗话说,磨刀不误砍柴工。开始之前做一些简单的初始化检查,如系统时间正确与否、磁盘容量是否充足等,是很有必要的。

在实际工作中,很多“诡异”问题迫使我们花费大量时间排查,最终却发现是非常简单的基础环境问题导致的。这其实还是挺常见的,不论对新手还是老鸟均如此,谨记!

我们前面做的系统时间正确与否、磁盘容量是否充足等工作,其实linux下是有开源工具可以帮助我们自动监控的。这里也为大家推荐几款linux下耳熟能详的监控工具,如zabbix、nagios、cacti、falcon、cat等。

本节我们介绍ad-hoc命令集用法。ad-hoc命令集由/usr/bin/ansible实现,其命令用法如下:

可用选项如下。

--list-hosts:列出符合条件的主机列表,不执行任何命令。

下面的示例有助于加深对上述内容的理解。

情景1:检查proxy组所有主机是否存活。

执行命令:

192.168.37.159 | success >> {

}

ansible proxy -s -m command -a 'hostname' -vvv

<192.168.37.159> establish connection for user: root on port 22 to 192.168.37.159 # 远程主机192.168.37.159监听root用户的22号端口

<192.168.37.159> remote_module command hostname # 远程执行命令hostname

<192.168.37.159> exec /bin/sh -c 'mkdir -p $home/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443 && echo $home/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443' # 生成临时目录用于存放ansible远程执行脚本

<192.168.37.159> put /tmp/tmp5sawsq to /root/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443/command # 改名临时脚本并存放至临时目录

<192.168.37.159> exec /bin/sh -c 'sudo -k && sudo -h -s -p "[sudo via ansible, key=urvzacjxvaagwvlrywymxpxfhjkirkqb] password: " -u root /bin/sh -c '"'"'echo become-success-urvzacjxvaagwvlrywymxpxfhjkirkqb; lang=c lc_ctype=c /usr/bin/python /root/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443/command; rm -rf /root/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443/ >/dev/null 2>&1'"'"'' # 使用sudo方式并以python脚本方式执行命令

192.168.37.159 | success | rc=0 >> # 返回结果为success,coderesult为0

ansible web --list

10.3.33.21

10.3.33.23

--list选项列出web组所有主机列表信息,web组中包括 10.3.33.21 和 10.3.3

// time命令可省,为方便观察结果,这里使用time命令查看执行时长

time ansible 10.21.40.61 -b 5 -p 2 -t 2 -m command -a 'sleep 20' -u root

第1行:[warning]不用理会,需升级gmp,该提醒不影响命令返回结果

第2行:background launch...表示使用-b使该命令后台运行

下面每隔2s输出一次执行进度

polling on 10.21.40.61, 3s remaining表示执行时长剩余3s

polling on 10.21.40.61, 1s remaining表示执行时长剩余1s

real 0m10.268s程序执行总时长

user 0m1.898s系统用户层执行时长

sys 0m0.163s系统内核层执行时长

细心的朋友会发现,我们sleep 20表示暂停 20s,即该命令最少执行时长为20s,但为什么real程序实际运行时长只有10s呢?这就是-b选项的意义了,如果超过其指定时间则终止正在执行的任务(但real为什么是10.268s而不是5.268s,经笔者实测,-b功能生效但时间不精确,正式使用前请多测试)。

ansible apps -a "df -lh"

192.168.37.130 | success | rc=0 >>

filesystem size used avail use% mounted on

/dev/mapper/vg_linuxlst-lv_root

tmpfs 123m 0 123m 0% /dev/shm

/dev/sda1 485m 29m 431m 7% /boot

192.168.37.155 | success | rc=0 >>

filesystem size used avail use% mounted on

/dev/mapper/vg_linuxlst-lv_root 18g 4.9g 12g 30% /

tmpfs 144m 0 144m 0% /dev/shm

/dev/sda1 485m 33m 427m 8% /boot

192.168.37.142 | success | rc=0 >>

/dev/mapper/vg_linuxlst-lv_root 18g 5.4g 12g 33% /

192.168.37.156 | success | rc=0 >>

/dev/mapper/vg_linuxlst-lv_root 8.4g 6.4g 1.6g 81% /

tmpfs 140m 0 140m 0% /dev/shm

/dev/sda1 485m 35m 426m 8% /boot

/dev/sdb5 20g 3.0g 16g 16% /data2

以192.168.37.130的返回为例,success表示命令执行成功,rc=0表示resultcode=0,即命令返回结果,返回码为0,表示命令执行成功,>>后面跟的内容相当于在主机本地执行df –lh后的结果返回。

情景2:批量查看远程主机内存使用情况(shell模块)。

ansible apps -m shell -a "free -m"

mem: 286 282 4 0 34 119

-/+ buffers/cache: 128 158

swap: 2015 668 1347

mem: 244 188 56 0 30 101

-/+ buffers/cache: 56 187

swap: 1023 0 1023

mem: 286 217 69 0 84 63

-/+ buffers/cache: 68 218

swap: 2015 0 2015

mem: 279 251 28 0 29 33

-/+ buffers/cache: 188 91

swap: 1023 22 1001

以192.168.37.142的返回为例,success表示命令执行成功,rc=0表示resultcode=0,即命令返回结果,返回码为0,表示命令执行成功,>>后面跟的内容相当于在主机本地执行free-m后的结果返回。

[apps]

192.168.37.130

192.168.37.155

192.168.37.142

192.168.37.156

``

步骤2:多次执行ansible命令,执行命令如下:

步骤3:对比返回结果,如表3-1所示。

《Ansible权威指南 》一3.2 Ad-Hoc命令集介绍

表3-1 返回结果对比

第1次返回结果 第2次返回结果

返回结果分析如下:

1)同样的命令多次执行,但每次的输出结果都不一定一样。

2)输出结果不是按照/etc/ansible/hosts中[apps]定义的主机顺序输出。

3)结果输出基本上遵循每次输出3条记录(线程池始终保持3个线程,所以这里如果每次输出小于等于3都是正常的)。

通过上面的实验我们对ansible的并发性有了概念性的了解。回到前面的问题,企业实际应用中,如主机数量很多,我们需调大线程数,该如何操作呢?这里ansible为我们提供了便捷的选项,-f指定线程数,如-f 1表示并发启动一个线程,-f 10则表示同时启动10个线程并发执行命令。其实查看源码可知,ansible使用multiprocessing管理多线程。

单台主机的性能始终有限,大家根据自己机器实际的硬件配置做调整,建议并发数配置的cpu核数偶数倍就好。如4cores 8gb的服务器,建议最多并发20个线程。关于ansible的性能,后面章节会为大家介绍ansible的加速模式。

前面的章节为大家详细介绍了ad-hoc的命令集使用方法及其并发特性等,那么,ansible究竟有多少现成功能可供大家使用呢?本节来为大家介绍ad-hoc的模块使用。

截至本篇编写时(2016-2-11),官方呈现的所有可用模块为468个(2016-8-19所有可用模块为622个,短短6个月增加了154个,可见ansible的发展速度),所有模块官方也做了详尽的功能分类。明细可参考官方链接。另外,ansible也提供了类似于man功能的help说明工具ansible-doc,直接按回车键或输入-h显示功能用法。它和linux系统下的man命令一样重要,正式学习ansible模块使用前,有必要先了解ansible-doc用法。

命令用法:

下面我们看些简单的示例。

情景1:显示所有可用模块。

返回结果如下:

情景2:以yum模块为例,我们希望获取yum模块的help说明。

其他模块help说明以此类推即可。下面通过ansible内置模块来完成一些具体工作。

【示例1】安装redhat-lsb并查看服务器系统版本号。

步骤1:安装redhat-lsb。

其中:

步骤2:查看系统版本号。

部分执行结果诠释:

ansible apps -s -m yum -a "name=ntp state=present"

ansible apps -m service -a "name=ntpd state=started enabled=yes"