Ad Hoc 命令简介

Ansible 的 Ad Hoc 命令使用 /usr/bin/ansible 命令行工具在一个或多个托管节点上自动化单个任务。Ad Hoc 命令快速且简单,但不可重用。那么为什么要学习 Ad Hoc 命令呢?Ad Hoc 命令展示了 Ansible 的简单性和强大功能。您在此处学习的概念将直接应用于 Playbook 语言。在阅读和执行这些示例之前,请阅读 如何构建清单

为什么要使用 Ad Hoc 命令?

Ad Hoc 命令非常适合您很少重复执行的任务。例如,如果您想在圣诞节假期关闭实验室中的所有机器,您可以在 Ansible 中执行一个快速的一行命令,而无需编写 Playbook。Ad Hoc 命令如下所示

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

-a 选项通过 key=value 语法或以 { 开头并以 } 结尾的 JSON 字符串接受选项,用于更复杂的选项结构。您可以了解有关 模式模块 的更多信息。

Ad Hoc 任务的用例

Ad Hoc 任务可用于重启服务器、复制文件、管理软件包和用户等等。您可以在 Ad Hoc 任务中使用任何 Ansible 模块。Ad Hoc 任务(如 Playbook)使用声明性模型,计算并执行达到指定最终状态所需的 action。它们通过在开始之前检查当前状态并在当前状态与指定最终状态不同时才执行操作来实现一种幂等性。

重启服务器

ansible 命令行实用程序的默认模块是 ansible.builtin.command 模块。您可以使用 Ad Hoc 任务来调用命令模块并一次重启亚特兰大中的所有 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 的命令(与 Playbook 相反)时,请特别注意 shell 引号规则,以便本地 shell 保留变量并将其传递给 Ansible。例如,在上述示例中使用双引号而不是单引号将在您所在的机器上计算变量。

管理文件

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

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

如果您计划重复执行此类任务,请在 Playbook 中使用 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 具有用于管理许多平台下软件包的模块。如果您的软件包管理器没有模块,您可以使用命令模块安装软件包,或为您的软件包管理器创建模块。

管理用户和组

您可以使用 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"

收集信息

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

$ 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 文件。

模式和临时命令

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

现在您已经了解了 Ansible 执行的基本要素,您可以开始学习如何使用Ansible Playbook来自动执行重复性任务。

另请参阅

配置 Ansible

关于 Ansible 配置文件

集合索引

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

使用 playbook

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

通信

有问题?需要帮助?想分享你的想法?请访问 Ansible 通信指南