临时命令简介
Ansible 临时命令使用 /usr/bin/ansible 命令行工具在一个或多个受管节点上自动化单个任务。临时命令快速简便,但不可重用。那么为什么学习临时命令呢?临时命令展示了 Ansible 的简单性和强大功能。您在此处学到的概念将直接应用于剧本语言。在阅读和执行这些示例之前,请阅读 如何构建您的库存。
为什么要使用临时命令?
临时命令非常适合您很少重复的任务。例如,如果您想在圣诞假期关闭实验室中的所有机器,您可以在 Ansible 中执行一个简单的单行命令,而无需编写剧本。临时命令看起来像这样
$ ansible [pattern] -m [module] -a "[module options]"
-a
选项接受通过 key=value
语法或以 {
开头并以 }
结尾的 JSON 字符串来传递选项,用于更复杂的选项结构。您可以了解更多关于 模式 和 模块 的信息,它们在其他页面上。
临时任务的用例
临时任务可用于重新启动服务器、复制文件、管理软件包和用户等等。您可以在临时任务中使用任何 Ansible 模块。临时任务(像剧本一样)使用声明式模型,计算并执行达到指定最终状态所需的动作。它们通过在开始之前检查当前状态并仅在当前状态与指定最终状态不同时才执行操作来实现一种幂等性形式。
重新启动服务器
ansible
命令行实用程序的默认模块是 ansible.builtin.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/etc)。
注意
command 模块 不支持扩展的 shell 语法,如管道和重定向(尽管 shell 变量始终有效)。如果您的命令需要特定于 shell 的语法,请改为使用 shell 模块。
到目前为止,我们所有的示例都使用了默认的“command”模块。要使用其他模块,请使用 -m
传递模块名称。例如,要使用 ansible.builtin.shell 模块
$ ansible raleigh -m ansible.builtin.shell -a 'echo $TERM'
在使用 Ansible 临时 CLI 运行任何命令时(与 剧本 相反),请特别注意 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 模块中,因为它们不是一般软件包管理的一部分。
要确保安装软件包而不会更新它
$ 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 模块安装软件包,或者为您的软件包管理器创建模块。
管理用户和组
您可以使用临时任务在受管节点上创建、管理和删除用户帐户
$ 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 通讯指南