Ansible服务的强大之处在于只需要一条命令,便可以操控成千上万台的主机节点,而ansible命令便是最得力的工具之一。前文提到,Ansible服务实际上只是一个框架,能够完成工作的是模块化功能代码。Ansible的常用模块大致有20多个(见表16-5),本书将会在后面的实验中逐一详解。
偶尔遇到书中没有提及的模块,大家可以使用"ansible-doc模块名称"的命令格式自行查询,或是使用ansibe-doc -l命令列出所有的模块信息以供选择。
表16-5 Ansible服务常用模块名称及作用
模块名称 | 模块作用 |
---|---|
ping | 检查受管节点主机网络是否能够联通。 |
yum | 安装、更新及卸载软件包。 |
yum_repository | 管理主机的软件仓库配置文件。 |
template | 复制模板文件到受管节点主机。 |
copy | 新建、修改及复制文件。 |
user | 创建、修改及删除用户。 |
group | 创建、修改及删除用户组。 |
service | 启动、关闭及查看服务状态。 |
get_url | 从网络中下载文件。 |
file | 设置文件权限及创建快捷方式。 |
cron | 添加、修改及删除计划任务。 |
command | 直接执行用户指定的命令。 |
shell | 直接执行用户指定的命令(支持特殊字符)。 |
debug | 输出调试或报错信息。 |
mount | 挂载硬盘设备文件。 |
filesystem | 格式化硬盘设备文件。 |
lineinfile | 通过正则表达式修改文件内容。 |
setup | 收集受管节点主机上的系统及变量信息。 |
firewalld | 添加、修改及删除防火墙策略。 |
lvg | 管理主机的物理卷及卷组设备。 |
lvol | 管理主机的逻辑卷设备。 |
在Ansible服务中,ansible是用于执行临时任务的命令,也就在是执行后即结束(与剧本文件的可重复执行不同)。在使用ansible命令时,必须指明受管主机的信息,如果已经设置过主机清单文件(/etc/ansible/hosts),则可以使用all参数来指代全体受管主机,或是用dev、test等主机组名称来指代某一组的主机。
ansible命令常用的语法格式为"ansible受管主机节点 -m模块名称[-a模块参数]",常见的参数如表16-6所示。其中,-a是要传递给模块的参数,只有功能极其简单的模块才不需要额外参数,所以大多情况下-m与-a参数都会同时出现。
表16-6 ansible命令常用参数
参数 | 作用 |
---|---|
-k | 手动输入SSH协议密码 |
-i | 指定主机清单文件 |
-m | 指定要使用的模块名 |
-M | 指定要使用的模块路径 |
-S | 使用su命令 |
-T | 设置SSH协议连接超时时间 |
-a | 设置传递给模块的参数 |
--version | 查看版本信息 |
-h | 帮助信息 |
如果想实现某个功能,但是却不知道用什么模块,又或者是知道了模块名称,但不清楚模块具体的作用,则建议使用ansible-doc命令进行查找。例如,列举出当前Ansible服务所支持的所有模块信息:
[root@localhost ~]# ansible-doc -l
a10_server Manage A10 Networks AX/SoftAX/Thunder/v...
a10_server_axapi3 Manage A10 Networks AX/SoftAX/Thunder/v...
a10_service_group Manage A10 Networks AX/SoftAX/Thunder/v...
a10_virtual_server Manage A10 Networks AX/SoftAX/Thunder/v...
aci_aaa_user Manage AAA users (aaa:User)
aci_aaa_user_certificate Manage AAA user certificates (aaa:User...
aci_access_port_block_to_access_port Manage port blocks of Fabric interface ...
aci_access_port_to_interface_policy_leaf_profile Manage Fabric interface policy leaf pro...
aci_access_sub_port_block_to_access_port Manage sub port blocks of Fabric interf...
aci_aep Manage attachable Access Entity Profile...
aci_aep_to_domain Bind AEPs to Physical or Virtual Domain...
aci_bd_subnet Manage Subnets (fv:Subnet)
………………省略部分输出信息………………
一般情况下,很难通过名称来判别一个模块的作用,要么是参考模块后面的介绍信息,要么是平时多学多练,进行积累。例如,接下来随机查看一个模块的详细信息。ansible-doc命令会在屏幕上显示出这个模块的作用、可用参数及实例等信息:
[root@localhost ~]# ansible-doc a10_server
> A10_SERVER (/usr/lib/python3.6/site-packages/ansible/modules/network/a10/a10_server.py)
Manage SLB (Server Load Balancer) server objects on A10 Networks devices via aXAPIv2.
* This module is maintained by The Ansible Community
………………省略部分输出信息………………
在16.2节,已经成功地将受管主机的IP地址填写到主机清单文件中,接下来小试牛刀,检查一下这些主机的网络连通性。ping模块用于进行简单的网络测试(类似于常用的ping命令)。可以使用ansible命令直接针对所有主机调用ping模块,不需要增加额外的参数,返回值若为SUCCESS,则表示主机当前在线。
[root@localhost ~]# ansible all -m ping
192.168.10.20 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.10.21 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.10.22 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.10.23 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}192.168.10.24 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
由于5台受控主机的输出信息大致相同,因此为了提升读者的阅读体验,本章后续的输出结果默认仅保留192.168.10.20主机的输出值,其余相同的输出信息将会被省略。
是不是感觉很方便呢?!一次就能知道所有主机的在线情况。除了使用-m参数直接指定模块名称之外,还可以用-a参数将参数传递给模块,让模块的功能更高级,更好地满足当前生产的需求。例如,yum_repository模块的作用是管理主机的软件仓库,能够添加、修改及删除软件仓库的配置信息,参数相对比较复杂。遇到这种情况时,建议先用ansible-doc命令对其进行了解。尤其是下面的EXAMPLES结构段会有该模块的实例,对用户来说有非常高的参考价值。
[root@localhost ~]# ansible-doc yum_repository
> YUM_REPOSITORY (/usr/lib/python3.6/site-packages/ansible/modules/packaging>
Add or remove YUM repositories in RPM-based Linux
distributions. If you wish to update an existing repository
definition use [ini_file] instead.
* This module is maintained by The Ansible Core Team
……………………省略部分输出信息………………
EXAMPLES:
- name: Add repository
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
- name: Add multiple repositories into the same file (1/2)
yum_repository:
name: epel
description: EPEL YUM repo
file: external_repos
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
gpgcheck: no
- name: Add multiple repositories into the same file (2/2)
yum_repository:
name: rpmforge
description: RPMforge YUM repo
file: external_repos
baseurl: http://apt.sw.be/redhat/el7/en/$basearch/rpmforge
还好,参数并不是很多,而且与此前学过的/etc/yum.repos.d/目录中的配置文件基本相似。现在,想为主机清单中的所有服务器新增一个如表16-7所示的软件仓库,该怎么操作呢?
表16-7 新增软件仓库信息
仓库名称 | EX294_BASE |
---|---|
仓库描述 | EX294 base software |
仓库地址 | file:///media/cdrom/BaseOS |
GPG签名 | 启用 |
GPG密钥文件 | file:///media/cdrom/RPM-GPG-KEY-redhat-release |
我们可以对照着EXAMPLE实例段,逐一对应填写需求值和参数,其标准格式是在-a参数后接整体参数(用单引号圈起),而各个参数字段的值则用双引号圈起。这是最严谨的写法。在执行下述命令后如果出现CHANGED字样,则表示修改已经成功:
[root@localhost ~]# ansible all -m yum_repository -a 'name="CentOS-Base" description="CentOS base software" baseurl="file:///media/cdrom/BaseOS" gpgcheck=yes enabled=1 gpgkey="file:///media/cdrom/RPM-GPG-KEY-redhat-release"'
……………………以下内容是结果………………
192.168.170.132 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "CentOS-Base",
"state": "present"
}
在命令执行成功后,可以到主机清单中的任意机器上查看新建成功的软件仓库配置文件。尽管这个实验的参数很多,但是并不难。
[root@localhost ~]# cat /etc/yum.repos.d/CentOS-Base.repo
……………………省略部分输出信息………………
[CentOS-Base]
baseurl = file:///media/cdrom/BaseOS
enabled = 1
gpgcheck = 1
gpgkey = file:///media/cdrom/RPM-GPG-KEY-redhat-release
name = CentOS base software