Ansible运行临时命令

发布时间:2023年12月19日

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
文章来源:https://blog.csdn.net/m0_74250610/article/details/135028605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。