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