天天看点

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

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

3.2 ad-hoc命令集介绍

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

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

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

3.2.1 ad-hoc命令集用法简介

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

ansible

host-pattern [options]

可用选项如下。

-v, --verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息。

-i path,

--inventory=path:指定inventory信息,默认etcansiblehosts。

-f num,

--forks=num:并发线程数,默认5个线程。

--private-key=private_key_file:指定密钥文件。

-m name,

--module-name=name:指定执行使用的模块。

-m directory,

--module-path=directory:指定模块存放路径,默认usrshareansible,也可以通过ansible_library设定默认路径。

-a 'arguments',

--args='arguments':模块参数。

-k, --ask-pass

ssh:认证密码。

-k,

--ask-sudo-pass sudo:用户的密码(--sudo时使用)。

-o, --one-line:标准输出至一行。

-s, --sudo:相当于linux系统下的sudo命令。

-t directory,

--tree=directory:输出信息至directory目录下,结果文件以远程主机名命名。

-t seconds,

--timeout=seconds:指定连接远程主机的最大超时,单位是秒。

-b num,

--background=num:后台执行命令,超num秒后中止正在执行的任务。

-p num,

--poll=num:定期返回后台任务进度。

-u username,

--user=username:指定远程主机以username运行命令。

-u

sudo_username, --sudo-user=sudo_username:使用sudo,相当于linux下的sudo命令。

-c connection,

--connection=connection:指定连接方式,可用选项paramiko (ssh)、ssh、local,local方式常用于crontab和kickstarts。

-l subset,

--limit=subset:指定运行主机。

-l ~regex, --limit=~regex:指定运行主机(正则)。

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

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

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

执行命令:

proxy  –f 5 –m ping

返回结果如图3-1所示。

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

执行结果诠释:

192.168.37.159  success 

{

    changed false,

    ping pong

}

其中192.168.37.159是指命令执行的主机,success表示命令执行成功,“ {}”表示详细返回结果如下。“changed

false”表示没有对主机做变更,“ping

pong”表示执行了ping命令返回结果为pong。

情景2:返回proxy组所有主机的hostname,并打印最详细的执行过程到标准输出。

ansible proxy -s

-m command -a 'hostname' -vvv

返回结果如图3-2所示。

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

192.168.37.159

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

remote_module command hostname # 远程执行命令hostname

exec binsh -c 'mkdir -p $home.ansibletmpansible-tmp-1455684626.83-94958346638443

&& echo $home.ansibletmpansible-tmp-1455684626.83-94958346638443' # 生成临时目录用于存放ansible远程执行脚本

put tmptmp5sawsq to

root.ansibletmpansible-tmp-1455684626.83-94958346638443command # 改名临时脚本并存放至临时目录

exec binsh -c 'sudo -k && sudo -h -s -p [sudo via ansible,

key=urvzacjxvaagwvlrywymxpxfhjkirkqb] password 

-u root binsh -c '''echo

become-success-urvzacjxvaagwvlrywymxpxfhjkirkqb; lang=c lc_ctype=c usrbinpython

root.ansibletmpansible-tmp-1455684626.83-94958346638443command; rm -rf

root.ansibletmpansible-tmp-1455684626.83-94958346638443 devnull 2&1'''' # 使用sudo方式并以python脚本方式执行命令

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

linuxlst # 返回的命令返回结果如下

使用-vvv参数可以清楚地了解ansible命令执行流程,如图3-3所示。

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

情景3:列出web组所有主机列表。

ansible web

--list

返回结果如下:

10.3.33.21

10.3.33.23

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

接下来我们模拟较为复杂的场景。

情景4:对10.21.40.61服务器以root执行sleep 20,设置最大连接超时时长为2s,且设置为后台运行模式,执行过程每2s输出一次进度,如5s还未执行完则终止该任务。

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

time ansible

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

返回结果如图3-4所示。

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

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

第2行:background

launch...表示使用-b使该命令后台运行

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

job

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

182625384959.32339 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功能生效但时间不精确,正式使用前请多测试)。

以上为ad-hoc命令集的用法说明,后面的章节我们会通过更复杂的实例深入了解其功能。

3.2.2 通过ad-hoc查看系统设置

3.2.1节为大家介绍了ad-hoc的命令集用法,本节我们通过df、free命令查看系统设置,但是是通过ad-hoc实现的,在此过程中帮助大家了解ansible。我们模拟如下两个场景。

情景1:批量查看apps组所有主机的磁盘容量(使用command模块)。

ansible apps -a

df -lh

192.168.37.130  success 

rc=0

filesystem            size  used avail use% mounted on

devmappervg_linuxlst-lv_root

                       19g  3.6g  

14g  21%

tmpfs                 123m     0 

123m   0% devshm

devsda1             485m   29m 

431m   7% boot

192.168.37.155  success 

filesystem                       size  used avail use% mounted on

devmappervg_linuxlst-lv_root   18g 

4.9g   12g  30%

tmpfs                            144m     0 

144m   0% devshm

devsda1                        485m   33m 

427m   8% boot

192.168.37.142  success 

5.4g   12g  33%

tmpfs                            144m     0 

192.168.37.156  success 

devmappervg_linuxlst-lv_root  8.4g 

6.4g  1.6g  81%

tmpfs                            140m     0 

140m   0% devshm

devsda1                        485m   35m 

426m   8% boot

devsdb5                         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

             total       used       free    

shared    buffers     cached

mem           286 

      282          4          0         34        119

-+

bufferscache        128        158

swap         2015        668       1347

mem           244        188         56          0         30        101

bufferscache         56        187

swap         1023          0       1023

mem           286        217         69          0         84         63

bufferscache         68        218

swap         2015          0       2015

mem           279        251         28          0         29         33

bufferscache        188         91

swap         1023         22       1001

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

通过上面两个场景的示例相信大家对ad-hoc的用法有一定的了解,接下来的章节我们进一步学习ansible的并发特性。

3.2.3 通过ad-hoc研究ansible的并发特性

如3.2.1节所讲,ansible和ansible-playbook默认会fork 5个线程并发执行命令,但在实际工作中,如果主机数量众多,ansible并发5个线程是远不能满足企业所需的,所以本节介绍ansible的并发特性。我们通过如下测试来更深入地了解ansible的并发工作模式。

场景如下:我们定义[apps]组,多次执行同样的ad-hoc命令来查看其返回的结果。

以下是执行步骤。

步骤1:定义[apps]组,编辑etcansiblehosts的配置。

执行命令vi etcansiblehosts,键入i进入vi编辑模式,跳转到文件最末尾,添加如下配置:

[apps]

192.168.37.130

192.168.37.155

192.168.37.142

192.168.37.156

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

ping -f 3

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

表3-1 返回结果对比

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

    changed false,

}    192.168.37.130  success 

返回结果分析如下:

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

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

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

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

 单台主机的性能始终有限,大家根据自己机器实际的硬件配置做调整,建议并发数配置的cpu核数偶数倍就好。如4cores

8gb的服务器,建议最多并发20个线程。关于ansible的性能,后面章节会为大家介绍ansible的加速模式。

3.2.4 通过ad-hoc研究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用法。

命令用法:

ansible-doc

[options] [module...]

--version:显示工具版本号。

-h, --help:显示该help说明。

-m module_path,

--module-path=module_path:指定ansible模块的默认加载目录。

-l, --list:列出所有可用模块。

-s, --snippet:只显示playbook说明的代码段。

-v:等同于—version,显示工具版本号。

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

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

ansible-doc –l

a10_server                    manage a10 networks

axsoftaxthundervthunder devices

a10_service_group             manage a10 networks

a10_virtual_server            manage a10 networks

acl                           sets and retrieves

file acl information.

add_host                      add a host (and

alternatively a group) to the ansible-playboo...

airbrake_deployment           notify airbrake about app

deployments

alternatives                  manages alternative programs

for common commands

apache2_module                enablesdisables a module of the

apache2 webserver

apt                           manages apt-packages

apt_key                       add or remove an apt key

apt_repository                add and remove apt repositories

apt_rpmapt_rpm

package manager

arista_interface              manage physical ethernet

interfaces

arista_l2interface            manage layer 2 interfaces

arista_lag                    manage port channel (lag)

arista_vlan                   manage vlan resources

assemble                      assembles a configuration

file from fragments

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

ansible-doc yum

 yum

    installs, upgrade, removes, and lists

packages and groups with the

    `yum' package manager.

options (= is

mandatory)

- conf_file

        the remote yum configuration file to

use for the transaction.

        [default none]

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

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

步骤1:安装redhat-lsb。

yum -a 'name=redhat-lsb state=present'

    msg ,

    rc 0,

    results [

        redhat-lsb-4.0-7.el6.centos.i686

providing redhat-lsb is already installed

    ]

其中:

changed:主机是否有变更,true为有;false为没有(第1次运行或事先没有安装,返回值一般是true,否则为false)。

msg:安装过程信息。

rc 0, resultcode:结果返回码,非0返回码往往是红色并且错误的返回,非常明显。

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

command -a 'lsb_release -a'

version   

base-4.0-ia32base-4.0-noarchcore-4.0-ia32core-4.0-noarchgraph

lsb

ics-4.0-ia32graphics-4.0-noarchprinting-4.0-ia32printing-4.0-noarch

distributor id

centos

description    centos release 6.5 (final)

release        6.5

codename       final

部分执行结果诠释:

192.168.37.155:表示命令执行的对象。

success:表示命令执行的返回状态为成功状态。

rc=0:表示命令执行的状态码为0。

:该符号后返回的所有内容为执行lsb_release –a命令返回的信息。

lsb version:表示该系统的内核版本信息。

distributor id:表示发行厂商。

description:表示版本简要信息。

release:表示该系统的发行版本号。

codename:表示发行版本代号。

【示例2】为所有服务器安装ntp服务,并设置为开机启动。

步骤1:安装ntp服务。

ansible apps -s

-m yum -a name=ntp state=present

步骤2:启动ntp服务,并设置为开机启动。

service -a name=ntpd state=started enabled=yes

返回的结果不再一一为大家列举出来,相信上面那么多的示例,大家对如何判断结果是否正确能够理解了。

如linux所有命令的用法一样,我们只能记住日常工作中最常用到的那些,另外那些不常用的命令用法我们只需要知道如何快速获取它们的用法即可。linux系统为我们提供了man工具来快速获取所需。ansible-doc则等同于 man 的功能和作用,这样解释相信大家会更容易理解其重要性。

继续阅读