ansible 之 Ad-Hoc 命令简介

本贴最后更新于 1692 天前,其中的信息可能已经东海扬尘

Ad-Hoc 命令简介

话题

以下示例显示如何使用/ usr / bin / ansible 运行即席任务。

什么是 ad-hoc 命令?

ad-hoc 命令是您可以键入的内容,可以非常快速地执行某些操作,但不希望以后再保存。

这是一个开始理解 Ansible 在学习 playbooks 语言之前可以做的基础知识的好地方 - ad-hoc 命令也可以用来做快速的事情,你可能不一定想写一个完整的剧本。

一般来说,Ansible 的真正力量在于剧本。为什么你会使用临时任务而不是剧本?

例如,如果您想在圣诞假期关闭所有实验室电源,您可以在 Ansible 中执行快速单行程,而无需编写剧本。

但是,对于配置管理和部署,您需要使用'/ usr / bin / ansible-playbook' - 您将在此处学习的概念将直接移植到 playbook 语言。

(有关这些内容的更多信息,请参阅使用 Playbooks

如果您还没有阅读使用库存,请先查看一下,然后我们就会开始。

并行和 Shell 命令

任意的例子。

让我们使用 Ansible 的命令行工具重启亚特兰大的所有 Web 服务器,一次 10 个。首先,让我们设置 SSH 代理,以便它能记住我们的凭据:

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

如果您不想使用 ssh-agent 并希望使用密码而不是密钥进行 SSH,则可以使用 --ask-pass-k),但最好只使用 ssh-agent。

现在在组中的所有服务器上运行该命令,在本例中为 atlanta,以 10 个并行分叉运行:

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

/ usr / bin / ansible 将默认从您的用户帐户运行。如果您不喜欢此行为,请传入“-u username”。如果要以不同的用户身份运行命令,它看起来像这样:

$ ansible atlanta -a "/usr/bin/foo" -u username

通常,您不希望仅从您的用户帐户执行操作。如果要通过权限提升运行命令:

$ ansible atlanta -a "/usr/bin/foo" -u username --become [--ask-become-pass]

如果您没有使用无密码权限提升方法(sudo / su / pfexec / doas / etc),请使用 --ask-become-pass-K)。这将以交互方式提示您输入密码。使用无密码设置可以使事情更容易自动化,但这不是必需的。

使用以下内容也可以成为 root 之外的用户 --become-user

$ ansible atlanta -a "/usr/bin/foo" -u username --become --become-user otheruser [--ask-become-pass]

注意

很少有一些用户拥有安全规则,他们将 sudo / pbrun / doas 环境限制为仅运行特定的命令路径。这不适用于 Ansible 的无引导理念和数百个不同的模块。如果这样做,请从没有此约束的特殊帐户使用 Ansible。在没有共享访问未授权用户的情况下执行此操作的一种方法是使用 Red Hat Ansible Tower 控制 Ansible ,它可以保留 SSH 凭据,并允许某些组织的成员代表他们使用它而无需直接访问。

好的,所以这些都是基础知识。如果您还没有阅读有关模式和组的信息,请返回并阅读使用模式

的上述指定 10 个同时处理的用法来使用。您也可以在配置 Ansible 中进行设置,以避免再次进行设置。默认值实际上是 5,这非常小而且保守。你可能想要与更多的同步主机进行交流,所以请随意提出这个问题。如果您拥有的主机数多于为 fork 计数设置的值,Ansible 将与他们交谈,但需要更长的时间。随意将此值推到系统可以处理的最高值!-f 10

您还可以选择要运行的 Ansible“模块”。通常命令也采用 -m for 模块名称,但默认模块名称为'command',因此我们不需要一直指定。我们将 -m 在后面的示例中使用其他一些使用模块

注意

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

使用 shell 模块如下所示:

ansible raleigh -m shell -a 'echo TERM'

使用 Ansible ad hoc CLI(而不是 Playbooks)运行任何命令时,请特别注意 shell 引用规则,因此本地 shell 在传递给 Ansible 之前不会使用变量。例如,在上面的示例中使用双引号而不是单引号将评估您所在框中的变量。

到目前为止,我们一直在演示简单的命令执行,但大多数 Ansible 模块不是简单的命令式脚本。相反,他们使用声明性模型,计算并执行达到指定最终状态所需的操作。此外,它们通过在开始之前检查当前状态来实现一种幂等形式,并且如果当前状态与指定的最终状态匹配,则什么都不做。但是,我们也认识到运行任意命令可能很有价值,因此 Ansible 很容易支持这两种命令。

文件传输

这是/ usr / bin / ansible 命令行的另一个用例。Ansible 可以将大量文件并行地存储到多台机器上。

要将文件直接传输到许多服务器:

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

如果您使用 playbooks,您还可以利用该 template 模块,这将进一步迈出这一步。(参见模块和剧本文档)。

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

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

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

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

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

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

管理包

有适用于 yum 和 apt 的模块。以下是 yum 的一些例子。

确保已安装软件包,但不要更新它:

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

确保将软件包安装到特定版本:

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

确保包装是最新版本:

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

确保未安装包:

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

Ansible 具有用于在许多平台下管理包的模块。如果您的软件包管理器没有模块,您可以使用命令模块安装软件包,或者(更好!)为软件包管理器提供一个模块。请在邮件列表中查看信息/详细信息。

用户和组

“用户”模块允许轻松创建和操作现有用户帐户,以及删除可能存在的用户帐户:

$ ansible all -m user -a "name=foo password="

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

有关所有可用选项的详细信息,请参阅“ 使用模块”部分,包括如何操作组和组成员身份。

从源代码控制部署

直接从 git 部署 webapp:

$ ansible webservers -m git -a "repo=https://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

由于 Ansible 模块可以通知更改处理程序,因此可以告诉 Ansible 在更新代码时运行特定任务,例如直接从 git 部署 Perl / Python / PHP / Ruby,然后重新启动 apache。

管理服务

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

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

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

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

确保服务已停止:

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

时间有限的后台操作

长时间运行的操作可以在后台运行,以后可以检查它们的状态。例如,要 long_running_operation 在后台异步执行,超时为 3600 秒(-B),并且没有轮询(-P):

$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"

如果您确定稍后要检查作业状态,则可以使用 async_status 模块,并在后台运行原始作业时返回的作业 ID:

$ ansible web1.example.com -m async_status -a "jid=488359678239.2844"

轮询是内置的,看起来像这样:

$ ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"

上面的例子说“最多运行 30 分钟(-B 30 * 60 = 1800),-P 每 60 秒轮询状态()”。

轮询模式很智能,因此在任何机器上开始轮询之前,所有作业都将启动。--forks 如果您希望快速启动所有工作,请务必使用足够高的值。在时间限制(以秒为单位)用完(-B)后,远程节点上的进程将终止。

通常,您只需要运行长时间运行的 shell 命令或软件升级。后台复制模块不执行后台文件传输。 Playbooks 还支持轮询,并为此提供简化的语法。

收集事实

事实在 playbooks 部分中描述,并代表有关系统的已发现变量。这些可用于实现任务的条件执行,但也可用于获取有关系统的临时信息。你可以看到所有事实:

$ ansible all -m setup

也可以过滤此输出以仅导出某些事实,有关详细信息,请参阅“设置”模块文档。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...