Ansible 即席命令入门

在我们之前的文章中,我们讨论了什么是 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 模块的文档。

Ansible-Doc Apt 模块

即席命令语法

运行 ad hoc 命令时,您必须提供一些输入。

  • 您必须指定目标(受管节点)。 您可以使用默认的“所有/未分组”组或用户定义的组。
  • 您必须将模块名称作为参数传递给 -m 旗帜。
  • 每个模块都接受一组选项。 这些选项应该作为参数传递给 -a 标志。 如果有多个选项,则应将它们括在引号内。
$ ansible [group] -m [module] -a [module arguments]

您可以将我们在前几节中看到的其他参数组合到 ad hoc 命令中。

使用 Ping 模块验证连接性

设置 ansible 后运行的第一个模块是 “平” 模块。 ping 模块用于验证与控制器和受管节点的连接是否正常。 如果连接成功,您将收到如下响应 “乒乓”.

$ ansible all -m ping
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 模块输出 Shell 模块输出

除了 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'"
Shell 和命令输出 Shell 和命令输出

通过脚本模块执行脚本

当您希望执行任何脚本(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
使用 Apt 模块安装软件包 使用 Apt 模块安装软件包

要了解权限提升的工作原理,请使用下面的链接查看我们的文章。

  • Ansible SSH 身份验证和权限提升

要删除软件包,您可以运行以下命令并将状态设置为 “缺席的”.

$ ansible all -m apt -a "name=cowsay,vim,cmatrix state=absent" -b -K
使用 Apt 模块删除包 使用 Apt 模块删除包

到目前为止,我已经展示了如何为不同的任务使用不同的模块。 这可能使您对运行临时命令时的工作方式有了很好的了解。

还有大量其他模块,本文不足以通读所有模块。 所以我建议你根据你的用例选择模块,并开始练习 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 剧本

资源: