Ansible 即席命令入门

在我们之前的文章中,我们讨论了什么是 ansible 库存和配置文件 这为学习ansible奠定了基础。 在本文中,我们将通过一些示例来讨论 ansible ad hoc 命令。

内容

  1. 介绍
  2. 了解目标
  3. 库存文件
  4. Ansible 模块
  5. 即席命令语法
  6. 使用 Ping 模块验证连接性
  7. 通过 Shell 模块执行命令
  8. 通过脚本模块执行脚本
  9. 包管理模块
  10. 输出颜色
    1. 红色 – 失败
    2. 黄色 – 改变成功
    3. 绿色 – 成功但没有改变
  11. 结论

介绍

当您想要运行任何快速任务和不经常重复的任务时,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 剧本

资源:

  • 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 管理开源