在我们之前的文章中,我们讨论了什么是 ansible 库存和配置文件 这为学习ansible奠定了基础。 在本文中,我们将通过一些示例来讨论 ansible ad hoc 命令。
内容
介绍
当您想要运行任何快速任务和不经常重复的任务时,Ansible Ad hoc 命令非常有用。 通常,这些临时命令将是单行命令,您可以直接从终端或从 shell 脚本运行。
在了解如何使用 ad hoc 命令之前,您应该了解什么是幂等。 Ansible 是 相同 在本质上,这意味着如果对象状态已经更改,则无论您运行相同任务多少次,ansible 都不会尝试再次对该对象进行相同的更改。
Ad hoc 命令通过 /usr/bin/ansible
程序。 您可以运行以下命令来获取 ansible 命令支持的选项列表。
$ ansible --help
如果您没有可练习的 ansible 实验室,那么您可以查看我们的指南,了解如何手动设置 ansible 以及使用 Vagrant 和 Virtualbox。
- 在 Linux 中安装和配置 Ansible
- 在 Linux 中使用 Vagrant 和 Virtualbox 进行自动化 Ansible 实验室设置
了解目标
在使用临时命令或编写剧本之前,您应该清楚地了解业务需求和要使用的目标环境。
目标环境可以是任何 ansible 支持的服务器、网络设备、容器、云解决方案等。 在这里,我使用了两个运行 Ubuntu 20.04 的托管节点。
您可以运行以下命令来检查运行 ad hoc 命令或 playbook 时将使用的主机列表。
#SYNTAX $ ansible --list-hosts
组名可以是 默认(全部, 未分组) 或者 用户定义组.
如果您想了解有关群组的更多信息,请参阅以下链接。
- Ansible 清单和配置文件
获取所有组的主机列表。
$ ansible all --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
获取用户定义组的主机列表。 这里我的组名是 ubuntu.
$ ansible ubuntu --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
库存文件
Inventory 文件包含受管节点的列表。 库存文件位置将在 ansible.cfg
文件。 您可以使用 -i
或者 --inventory
运行临时命令时的标志。
我有两个清单文件,默认文件名为 hosts。 要使用文件 host2,我需要使用 -i
标记并将文件作为参数传递。
$ ansible all -i host2 --list-hosts hosts (1): managed2.anslab.com
小心: 如果清单文件位于不同的位置,则必须提供绝对路径。 您可以参考以下链接了解库存文件的优先顺序。
- Ansible 清单和配置文件
Ansible 模块
Ansible 是一个包含电池的工具,这意味着它附带了大量的模块。 模块是编写的程序 Python ansible 使用它在受管节点上运行以执行任务。 Ansible 遵循即插即用的方法,这意味着您可以编写自己的模块并通过 ansible 运行它。
Ansible 支持许多由开源社区和不同产品供应商创建的包。 要获取您机器上安装的所有模块的列表,请运行以下命令。
$ ansible-doc -l # LIST ALL MODULES AVAILABLE $ ansible-doc -l | grep -i -w ^apt # GREP PARTICULAR MODULE(APT) MODULE
要查看模块的文档,您可以运行以下命令。 在这里,我正在查看 apt 模块的文档,该模块是基于 Debian/Ubuntu 的发行版的包管理器模块。
$ ansible-doc apt
下图显示了 ansible apt 模块的文档。
即席命令语法
运行 ad hoc 命令时,您必须提供一些输入。
- 您必须指定目标(受管节点)。 您可以使用默认的“所有/未分组”组或用户定义的组。
- 您必须将模块名称作为参数传递给
-m
旗帜。 - 每个模块都接受一组选项。 这些选项应该作为参数传递给 -a 标志。 如果有多个选项,则应将它们括在引号内。
$ ansible [group] -m [module] -a [module arguments]
您可以将我们在前几节中看到的其他参数组合到 ad hoc 命令中。
使用 Ping 模块验证连接性
设置 ansible 后运行的第一个模块是 “平” 模块。 ping 模块用于验证与控制器和受管节点的连接是否正常。 如果连接成功,您将收到如下响应 “乒乓”.
$ ansible all -m ping
您还可以使用 -o
旗帜。
$ ansible all -m ping -o
通过 Shell 模块执行命令
这 外壳模块 用于执行可以在终端上运行的任何命令。 这就像在 Linux 终端上运行命令一样。
你应该使用 -a
标记并将命令作为参数传递给 shell 模块。
$ ansible all -m shell -a "arguments"
下面是我通过 ansible shell 模块运行的一些命令。
$ ansible all -m shell -a "echo $USER"
$ ansible all -m shell -a "uptime"
$ ansible all -m shell -a "cat /etc/os-release | grep -i PRETTY_NAME"
$ ansible all -m shell -a "touch /tmp/abc.txt"
$ ansible all -m shell -a "ls -l /tmp/abc.txt"
除了 shell 模块,您还可以使用命令模块,它是 ansible 中的默认模块。 您可以直接使用 -a
标记并将命令作为参数传递,因为命令模块是默认模块。
$ ansible all -m command -a "uptime" # EXCLUSIVELY PASSING COMMAND MODULE $ ansible all -a "uptime" # NOT USING -m TO PASS MODULE
shell 和命令模块之间的区别在于命令模块可以访问一些特殊的变量,而不能使用管道、重定向和逻辑与运算符。
运行以下命令,你会得到一个错误。
$ ansible all -m command -a "test -f /etc/hosts && echo 'hosts file present'"
您可以通过 shell 模块运行相同的命令,它会运行良好。
$ ansible all -m shell -a "test -f /etc/hosts && echo 'hosts file present'"
通过脚本模块执行脚本
当您希望执行任何脚本(python、shell 等)时,您可以使用脚本模块,它将脚本从您的控制器机器复制到所有受管节点,然后执行脚本。
我有以下 python 代码 /tmp
目录。
import sys,os print("CURRENT PYTHON VERSION = ", sys.version_info) print("HOSTNAME = ", os.uname()[1]) print("CURRENT DIRECTORY = ", os.getcwd())
运行以下命令以使用脚本模块运行脚本。 脚本模块支持额外的参数,具体取决于您运行脚本的方式。 就我而言,我正在运行一个 python 脚本,所以我试图传递额外的参数 “可执行文件=python3” 连同脚本路径。
$ ansible all -m script -a "/tmp/get_host_details.py executable=python3"
包管理模块
有一些模块可以与操作系统包管理器一起使用,比如 dnf
, apt
, pacman
等。我在这里使用 apt
因为我正在运行 Ubuntu。 但是对于所有具有参数差异的包管理器,语法将是相同的。 您应该查看相应的文档以了解更多信息。
要安装软件包,您可以运行以下命令并将状态设置为 “展示”. 你应该选择 -b
或者 -become
运行模块的标志 sudo
受管节点中的特权。 如果您设置了密码 sudo 用户,那么你应该通过 -K
随着 -b
将提示输入的标志 变得 密码。
$ ansible all -m apt -a "name=cowsay,vim,cmatrix state=present" -b -K
要了解权限提升的工作原理,请使用下面的链接查看我们的文章。
- Ansible SSH 身份验证和权限提升
要删除软件包,您可以运行以下命令并将状态设置为 “缺席的”.
$ ansible all -m apt -a "name=cowsay,vim,cmatrix state=absent" -b -K
到目前为止,我已经展示了如何为不同的任务使用不同的模块。 这可能使您对运行临时命令时的工作方式有了很好的了解。
还有大量其他模块,本文不足以通读所有模块。 所以我建议你根据你的用例选择模块,并开始练习 ad hoc 命令。
输出颜色
当您执行临时命令时,您应该已经看到了三种不同颜色的输出。 每种颜色都有它的含义。
RED - Failure YELLOW - Success With Changes happened GREEN - Success but no changes happened
红色 – 失败
如果您的任务失败,那么它将以红色打印。
黄色 – 改变成功
当状态设置为更改时,输出将为黄色。
绿色 – 成功但没有改变
当对象状态未更改时,输出将为绿色。
结论
在本文中,我们讨论了什么是 ad hoc 命令以及如何在 Ansible 中使用 ad hoc 命令。 作为初学者,ad hoc 命令会让你很好地理解 ansible 如何使用模块来完成任务。 在下一个级别,您将开始以 YAML 格式编写剧本,这将在另一篇文章中详细介绍。
阅读下一篇:
- 使用 Ansible 剧本
资源:
- https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
- https://www.redhat.com/sysadmin/ansible-ad-hoc-commands
Ad hoc 命令AnsibleAnsible Ad Hoc 命令Ansible 系列Ansible 教程DevOpsIT 自动化LinuxLinux 管理开源