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

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

本节书摘来自华章出版社《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命令集由/usr/bin/ansible实现,其命令用法如下:

ansible <host-pattern> [options]

可用选项如下。

-v, --verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息。
-i PATH, --inventory=PATH:指定inventory信息,默认/etc/ansible/hosts。
-f NUM, --forks=NUM:并发线程数,默认5个线程。
--private-key=PRIVATE_KEY_FILE:指定密钥文件。
-m NAME, --module-name=NAME:指定执行使用的模块。
-M DIRECTORY, --module-path=DIRECTORY:指定模块存放路径,默认/usr/share/ansible,也可以通过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组所有主机是否存活。
执行命令:

ansible proxy  –f 5 –m ping
``
返回结果如图3-1所示。
<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/3ace002f0c291063c09afb06a980b1ff5a2cd192.png" >
</div>
<br/>
执行结果诠释:

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所示。
<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/8cf22c25b79df41505e39692987f14e05f4e088a.png" >
</div>
<br/>
执行结果诠释:

<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

Linuxlst # 返回的命令返回结果如下
使用-vvv参数可以清楚地了解Ansible命令执行流程,如图3-3所示。
<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/60e38d72e60b65ffa083280f92ea5c91eb9a00e4.png" >
</div>
<br/>
情景3:列出Web组所有主机列表。
执行命令:

ansible web --list

返回结果如下:

10.3.33.21
10.3.33.23

执行结果诠释:

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

3.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所示。
<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/2ec6c9d359d8cb97022dfa011bf97a22644e0d2e.png" >
</div>
<br/>

执行结果诠释:

第1行:[WARNING]不用理会,需升级gmp,该提醒不影响命令返回结果
第2行:background launch...表示使用-B使该命令后台运行
下面每隔2s输出一次执行进度
polling on 10.21.40.61, 3s remaining表示执行时长剩余3s
下面每隔2s输出一次执行进度
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
/dev/mapper/vg_linuxlst-lv_root

                   19G  3.6G   14G  21% /

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 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_linuxlst-lv_root 18G 5.4G 12G 33% /
tmpfs 144M 0 144M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot

192.168.37.156 | success | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/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"

返回结果如下:

192.168.37.142 | success | rc=0 >>

         total       used       free     shared    buffers     cached

Mem: 286 282 4 0 34 119
-/+ buffers/cache: 128 158
Swap: 2015 668 1347

192.168.37.130 | success | rc=0 >>

         total       used       free     shared    buffers     cached

Mem: 244 188 56 0 30 101
-/+ buffers/cache: 56 187
Swap: 1023 0 1023

192.168.37.155 | success | rc=0 >>

         total       used       free     shared    buffers     cached

Mem: 286 217 69 0 84 63
-/+ buffers/cache: 68 218
Swap: 2015 0 2015

192.168.37.156 | success | rc=0 >>

         total       used       free     shared    buffers     cached

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后的结果返回。

通过上面两个场景的示例相信大家对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]组,编辑/etc/ansible/hosts的配置。
执行命令vi /etc/ansible/hosts,键入i进入vi编辑模式,跳转到文件最末尾,添加如下配置:

[apps]
192.168.37.130
192.168.37.155
192.168.37.142
192.168.37.156
``
步骤2:多次执行Ansible命令,执行命令如下:

ansible apps -m ping -f 3

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


b038b34ce37f80c3d749db23577c412aebb31864



表3-1 返回结果对比
第1次返回结果 第2次返回结果
192.168.37.130 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.37.142 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.37.155 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.37.156 | success >> {
    "changed": false,
    "ping": "pong"
}    192.168.37.130 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.37.155 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.37.142 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.37.156 | success >> {
    "changed": false,
    "ping": "pong"
}

返回结果分析如下:
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的加速模式。

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 AX/SoftAX/Thunder/vThunder devices
a10_service_group             Manage A10 Networks AX/SoftAX/Thunder/vThunder devices
a10_virtual_server            Manage A10 Networks AX/SoftAX/Thunder/vThunder devices
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                enables/disables 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) interfaces
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。
执行命令:

ansible apps -m yum -a 'name=redhat-lsb state=present'

返回结果如下:

192.168.37.142 | success >> {
    "changed": false,
    "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:查看系统版本号。
执行命令:

ansible apps -m command -a 'lsb_release -a'

返回结果如下:

192.168.37.155 | success | rc=0 >>
Version:    :base-4.0-ia32:base-4.0-noarch:core-4.0-ia32:core-4.0-noarch:graph
LSB
ics-4.0-ia32:graphics-4.0-noarch:printing-4.0-ia32:printing-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服务,并设置为开机启动。
执行命令:

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

返回的结果不再一一为大家列举出来,相信上面那么多的示例,大家对如何判断结果是否正确能够理解了。
相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
8月前
|
运维 监控
【运维知识进阶篇】Zabbix5.0稳定版详解10(Zabbix自动注册+Ansible自动部署,实现一条命令监控任意主机)
【运维知识进阶篇】Zabbix5.0稳定版详解10(Zabbix自动注册+Ansible自动部署,实现一条命令监控任意主机)
110 0
|
8月前
|
运维 Shell 网络安全
【运维知识进阶篇】Ansible自动化运维-ad-hoc详解
【运维知识进阶篇】Ansible自动化运维-ad-hoc详解
106 0
|
8月前
|
Shell 网络安全 网络架构
Ansible模块介绍——命令模块
Ansible模块介绍——命令模块
100 0
|
11月前
|
Shell 数据安全/隐私保护 Python
ansible学习之旅(ad-hoc与常见模块)
ansible学习之旅(ad-hoc与常见模块)
152 0
|
运维 自然语言处理 Shell
金鱼哥戏说RHCE认证:部署Ansible---运行临时命令
第二章 部署Ansible---运行临时命令
184 0
金鱼哥戏说RHCE认证:部署Ansible---运行临时命令
ansible获取命令帮助信息(三)
1.获取ansible命令帮助 1.1.查看某个模块的帮助信息
270 0
LXJ
|
安全 网络安全 数据安全/隐私保护
02-第一条Ansible命令
02-第一条Ansible命令
LXJ
176 0
|
Shell
ansible的命令操作模块<6>
ansible的前面的模块都是对受管主机中的文件进行修改或者插入操作,今天继续跟随学习ansible的命令模块,比如说我要通过ansible在受管主机上执行我们常用的某些命令,该怎么操作 command模块: ansible test177 -m command -a "ls"在177中以root.
1658 0
|
Shell
Ansible 命令执行模块(学习笔记九)
命令执行模块有四个:command、raw、shell、script command、raw 1、command为系统默认模块,使用时可以直接省略: ansible all -a "pwd" image.
1147 0
|
Shell Apache 数据安全/隐私保护
Ansible权威指南笔记(粗略)
# 在托管节点上安装 python 解释器 ansible myhost --sudo -m raw -a "yum install -y python2 python-simplejson" # 各个平台上安装 ansible http://www.
1460 0