临时命令简介

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



为什么要使用临时命令?

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



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



您可以在其他页面上了解有关模式模块的更多信息。


临时任务的用例

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



重启服务器

ansible命令行实用程序的默认模块是ansible.builtin.command 模块。您可以使用临时任务调用命令模块并重新启动Atlanta的所有 Web 服务器,一次 10 个。在 Ansible 执行此操作之前,您必须将Atlanta的所有服务器都列在清单中名为 [atlanta] 的组中,并且您必须拥有该组中每台机器的有效 SSH 凭据。要重新启动 [atlanta] 组中的所有服务器:



$ ansible atlanta -a "/sbin/reboot"



默认情况下,Ansible 仅使用 5 个并发进程。如果您的主机数超过为 fork 计数设置的值,Ansible 将与它们对话,但需要更长的时间。要使用 10 个并行分支重新启动 [atlanta] 服务器:



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



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



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



重新启动可能需要权限提升。您可以使用become关键字usernameroot用户身份连接到服务器并以用户身份运行命令:



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



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



command模块不支持管道和重定向这样的扩展shell语法(尽管shell变量会一直工作)。如果您的命令需要特定于shell 的语法,请改用shell模块。在“使用模块”页面上阅读有关差异的更多信息 。



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



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



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

管理文件

临时任务可以利用 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"


管理包

您还可以使用临时任务,使用 yum 等包管理模块在受管节点上安装、更新或删除包。要确保安装软件包而不更新它:



$ 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 具有用于在许多平台下管理包的模块。如果您的包管理器没有模块,您可以使用命令模块安装包或为您的包管理器创建一个模块。



管理用户和组

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



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

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



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


管理服务

确保在所有网络服务器上启动服务:



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



或者,重新启动所有网络服务器上的服务:



$ 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 Playbooks自动执行重复性任务。