Ad hoc 命令简介

Ansible 的 ad hoc 命令使用 /usr/bin/ansible 命令行工具在一个或多个受管节点上自动化单个任务。ad hoc 命令快速简便,但不可重用。那么为什么学习 ad hoc 命令呢?ad hoc 命令展示了 Ansible 的简洁性和强大功能。您在此处学习的概念将直接移植到剧本语言中。在阅读和执行这些示例之前,请阅读 如何构建您的清单.

为什么要使用 ad hoc 命令?

ad hoc 命令非常适合您很少重复的任务。例如,如果您想在圣诞假期关闭实验室中的所有机器,则可以在 Ansible 中执行一个快速的一行代码,而无需编写剧本。ad hoc 命令看起来像这样

$ ansible [pattern] -m [module] -a "[module options]"

-a 选项接受通过 key=value 语法或以 { 开头和 } 结尾的 JSON 字符串来实现的选项,以实现更复杂的选项结构。您可以在其他页面上了解有关 模式模块 的更多信息。

Ad hoc 任务的用例

Ad hoc 任务可用于重新启动服务器、复制文件、管理软件包和用户,以及更多功能。您可以在 ad hoc 任务中使用任何 Ansible 模块。与剧本类似,ad hoc 任务使用声明性模型,计算并执行达到指定最终状态所需的行动。它们通过在开始之前检查当前状态,并在当前状态与指定最终状态不同时才执行任何操作,来实现一种幂等性形式。

重新启动服务器

ansible 命令行实用程序的默认模块是 ansible.builtin.command 模块。您可以使用 ad hoc 任务来调用 command 模块并一次重新启动亚特兰大中的所有 Web 服务器,每次 10 台。在 Ansible 能够执行此操作之前,您必须在清单中将亚特兰大中的所有服务器列在名为 [atlanta] 的组中,并且您必须拥有该组中每台机器的正常 SSH 凭据。要重新启动 [atlanta] 组中的所有服务器

$ ansible atlanta -a "/sbin/reboot"

默认情况下,Ansible 只使用五个并行进程。如果您拥有的主机数量超过为 fork 计数设置的值,则会增加 Ansible 与主机通信所需的时间。要以 10 个并行 fork 重新启动 [atlanta] 服务器

$ ansible atlanta -a "/sbin/reboot" -f 10

/usr/bin/ansible 默认从您的用户帐户运行。要以其他用户身份连接

$ ansible atlanta -a "/sbin/reboot" -f 10 -u username

重新启动可能需要特权升级。您可以以 username 身份连接到服务器,并使用 become 关键字以 root 用户身份运行命令

$ ansible atlanta -a "/sbin/reboot" -f 10 -u username --become [--ask-become-pass]

如果您添加 --ask-become-pass-K,Ansible 会提示您输入用于特权升级的密码 (sudo/su/pfexec/doas/等)。

注意

command 模块 不支持扩展的 shell 语法,例如管道和重定向 (尽管 shell 变量将始终起作用)。如果您的命令需要 shell 特定的语法,请改用 shell 模块。

到目前为止,我们所有的示例都使用了默认的“command”模块。要使用其他模块,请传递 -m 表示模块名称。例如,要使用 ansible.builtin.shell 模块

$ ansible raleigh -m ansible.builtin.shell -a 'echo $TERM'

在使用 Ansible *ad hoc* CLI (而不是 剧本) 运行任何命令时,请特别注意 shell 引号规则,以便本地 shell 保留变量并将其传递给 Ansible。例如,在上面的示例中使用双引号而不是单引号将评估您所在机器上的变量。

管理文件

Ad hoc 任务可以利用 Ansible 和 SCP 的强大功能,将多个文件并行传输到多台机器。要将文件直接传输到 [atlanta] 组中的所有服务器

$ ansible atlanta -m ansible.builtin.copy -a "src=/etc/hosts dest=/tmp/hosts"

如果您计划重复执行此类任务,请在剧本中使用 ansible.builtin.template 模块。

ansible.builtin.file 模块允许更改文件的拥有权和权限。这些相同的选项也可以直接传递给 copy 模块

$ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"

file 模块还可以创建目录,类似于 mkdir -p

$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

以及删除目录 (递归地) 和删除文件

$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c state=absent"

管理软件包

您还可以使用 ad hoc 任务来使用软件包管理模块(例如 yum)在受管节点上安装、更新或删除软件包。软件包管理模块支持常见的函数来安装、删除和一般管理软件包。软件包管理器的某些特定函数可能不会出现在 Ansible 模块中,因为它们不是一般软件包管理的一部分。

要确保安装软件包而不更新它

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=present"

要确保安装软件包的特定版本

$ ansible webservers -m ansible.builtin.yum -a "name=acme-1.5 state=present"

要确保软件包是最新的版本

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=latest"

要确保软件包未安装

$ ansible webservers -m ansible.builtin.yum -a "name=acme state=absent"

Ansible 拥有用于管理许多平台下软件包的模块。如果没有您软件包管理器的模块,您可以使用 command 模块安装软件包,或为您的软件包管理器创建模块。

管理用户和组

您可以使用 ad hoc 任务在受管节点上创建、管理和删除用户帐户

$ ansible all -m ansible.builtin.user -a "name=foo password=<encrypted password here>"

$ ansible all -m ansible.builtin.user -a "name=foo state=absent"

有关所有可用选项的详细信息,包括如何操作组和组成员身份,请参阅 ansible.builtin.user 模块文档。

管理服务

确保在所有 Web 服务器上启动一项服务

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=started"

或者,在所有 Web 服务器上重新启动一项服务

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=restarted"

确保一项服务已停止

$ ansible webservers -m ansible.builtin.service -a "name=httpd state=stopped"

收集事实

事实代表关于系统的发现变量。您可以使用事实来实现任务的条件执行,还可以仅获取关于系统的 ad hoc 信息。要查看所有事实

$ ansible all -m ansible.builtin.setup

您也可以过滤此输出,以仅显示某些事实,有关详细信息,请参阅 ansible.builtin.setup 模块文档。

检查模式

在检查模式下,Ansible 不会对远程系统进行任何更改。Ansible 只打印命令。它不会运行命令。

$  ansible all -m copy -a "content=foo dest=/root/bar.txt" -C

在上述命令中启用检查模式 (-C--check) 表示 Ansible 实际上不会在任何远程系统上创建或更新 /root/bar.txt 文件。

模式和 ad hoc 命令

有关所有可用选项的详细信息,包括如何在 ad hoc 命令中使用模式进行限制,请参阅 模式 文档。

现在您已经了解了 Ansible 执行的基本要素,您已准备好学习使用 Ansible 剧本 自动化重复性任务。

另请参阅

配置 Ansible

关于 Ansible 配置文件的一切

集合索引

浏览现有的集合、模块和插件

使用剧本

使用 Ansible 进行配置管理和部署

邮件列表

有问题?需要帮助?有想法?请访问 Google Groups 上的列表

实时聊天

如何加入 Ansible 聊天频道