ad hoc 命令简介
Ansible 的 ad hoc 命令使用 /usr/bin/ansible 命令行工具在单个或多个被管理节点上自动化执行一项单一任务。ad hoc 命令快速且简便,但它们不具备可重用性。那么为什么要学习 ad hoc 命令呢?ad hoc 命令展示了 Ansible 的简洁与强大。你在这里学到的概念将直接迁移到 playbook 语言中。在阅读和执行这些示例之前,请阅读 如何构建你的清单 (inventory)。
为什么要使用 ad hoc 命令?
ad hoc 命令非常适合那些极少重复的任务。例如,如果你在度假时想要关闭实验室中的所有机器,你可以直接在 Ansible 中执行一条简单的单行命令,而无需编写 playbook。一条 ad hoc 命令看起来像这样:
$ ansible [pattern] -m [module] -a "[module options]"
-a 选项接受通过 key=value 语法提供的选项,或者对于更复杂的选项结构,可以使用以 { 开始并以 } 结束的 JSON 字符串。你可以在其他页面详细了解 模式 (patterns) 和 模块 (modules)。
ad hoc 任务的使用场景
ad hoc 任务可用于重启服务器、复制文件、管理软件包和用户等。你可以在 ad hoc 任务中使用任何 Ansible 模块。ad hoc 任务与 playbooks 一样,采用声明式模型,计算并执行达到指定最终状态所需的动作。它们通过在开始前检查当前状态,并且仅在当前状态与指定最终状态不同时才执行操作,从而实现一种幂等性。
重启服务器
ansible 命令行工具的默认模块是 ansible.builtin.command 模块。你可以使用 ad hoc 任务调用 command 模块,每次 10 台地重启亚特兰大 (Atlanta) 的所有 Web 服务器。在 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 运行任何命令时(与使用 Playbooks 不同),请特别注意 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 拥有管理许多平台软件包的模块。如果你的软件包管理器没有对应的模块,你可以使用 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"
收集事实
事实 (Facts) 代表关于系统的已发现变量。你可以使用事实来实现任务的条件执行,也可以仅仅用来获取系统的 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 命令中使用模式进行限制),请参阅 模式 (patterns) 文档。
现在你已经了解了 Ansible 执行的基本元素,你可以开始学习如何使用 Ansible Playbooks 来自动化重复性任务了。
另请参阅
- 配置 Ansible
关于 Ansible 配置文件的一切
- 集合索引
浏览现有的集合、模块和插件
- 使用 Playbook
使用 Ansible 进行配置管理与部署
- 交流方式
有疑问?需要帮助?想分享你的想法?请访问 Ansible 通信指南