Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂的任务。

        Ad-Hoc是ansible最常用的命令集,所谓Ad-Hoc,简而言之就是“临时命令”,更为直白的说就是,如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

        简单说一下Ad-Hoc的应用场景:

情景1:

        比如最近Nginx的CVE-2018-16843和CVE-2018-16844漏洞,我们需要及时更新到安全版本,这种临时的任务,我们就可以用Ad-Hoc命令完成。

情景2:

        临时调整nginx或apache或php配置,需要同事分发配置到所有web服务器。

        所以Ad-Hoc更注重解决一些简单的或者临时的任务,而Ansible-playbook更适合于解决复杂的,固定化的任务。

Ad-Hoc命令集

        Ad-Hoc命令集由/usr/bin/ansible实现,首先看一下命令用法说明:

        ansible <host-pattern> [option]

        host-pattern是指目标主机,可以是一个主机,可以是多个主机用逗号分隔,可以是Inventory中定义的组或别名。

        option是可选项,常用的可选项包括以下:

-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 'MODULE_ARGS', --args=MODULE_ARGS:模块参数 

-k,--ask-pass:认证密码 

-K,--ask-become-pass:用户的密码(sudo 时使用)

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

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

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

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

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

-P POLL_INTERVAL,--poll=POLL_INTERVAL:定期返回后台任务进度

-u REMOTE_USER,--user=REMOTE_USER:指定远程主机以-REMOTE_USER运行命令


-U SUDO_USER,--sudo-user=SUDO_USER:使用sudo,相当于Linux下的 sudo 命令

-c CONNECTION,--connection=CONNECTION:指定连接方式 ,默认为smart

-1 SUBSET,--limit=SUBSET:指定运行主机

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

-C,--check:不对目标主机做任何修改,只测试并返回结果


    注意,在新版本中sudo该为become,所以在用新版本的时候要留意。方便理解,下面用几个例子来看一下以上命令的效果。

Ad-Hoc使用

示例1:ping检测

Ansible之Ad-Hoc_java

该示例直接指定目标主机IP,指定ping模块运行。执行结果中SUCCESS表示执行成功,后面是返回的详细结果,"changed":"false"这里表示没有对主机做变更,"ping":"pong"表示执行了ping命令返回的pong结果。

示例2:返回目标主机的内核版本信息

Ansible之Ad-Hoc_java_02

Ansible之Ad-Hoc_java_03

使用-vvv参数可以清楚的了解Ansilbe的命令执行过程,包括模块的调用,临时文件的创建等。

Ansible之Ad-Hoc_java_04

Ansible命令执行流程图

示例3:列出某组所有影响的目标主机

在对目标组执行命令前,为了确保目标主机正确,可以通过该参数查看会影响到的目标主机列表。

示例4利用file模块在远端服务器上创建个指定权限的文件夹

删除文件夹

修改文件权限

Ansible之Ad-Hoc_java_05

修改所属用户用户组

Ansible之Ad-Hoc_java_06

注意,当目标主机存在selinux的时候,需要安装libselinux-python模块,否则无法使用Ansible中copy/file/template相关模块,如下:

Ansible之Ad-Hoc_java_07

示例5:利用shell模块给目标主机安装libselinux-python

Ansible之Ad-Hoc_java_08

Ansible之Ad-Hoc_java_09

安装完成后再尝试copy模块传输文件

Ansible之Ad-Hoc_java_10

上面安装软件包是通过shell的饭时调用yum命令去安装的,Ansible也支持yum和apt模块

示例6:利用yum模块安装软件

Ansible之Ad-Hoc_java_11

示例7:利用git模块直接部署webapp

Ansible之Ad-Hoc_java_12

举了这么多例子,那么怎么知道ansible支持哪些模块呢,这些模块怎么用呢?

Ad-Hoc模块使用

        Ansible也提供类似于linux下man功能的说明工具ansible-doc,首先看一下用法:

Ansible之Ad-Hoc_java_13

目前我使用的最新版本2.7的支持的模块数量

Ansible之Ad-Hoc_java_14

查看yum模块的用法:

Ansible之Ad-Hoc_java_15

是不是很详细!!!

Ansible结果说明

        通过上面的几个例子,我们可以看待,其实Ansible的返回结果非常友好,特别是从颜色上,一般通过3种颜色来表示执行结果:红色、绿色、橘黄色。其中红色表示执行过程种有异常,一般会终止执行;绿色和橘黄色表示执行过程没有异常,所有任务正常执行,区别在于橘黄色表示执行命令结束后目标主机有状态变化,而绿色表示执行命令结束后目标状态没有变化。