词汇表

以下是在 Ansible 文档其他地方使用的术语定义的列表(和重新解释)。

请参阅文档主页以获取完整的文档,并在上下文中查看这些术语,但这应该是一个很好的资源来检查您对 Ansible 组件的了解,并了解它们如何组合在一起。您可能希望阅读它以进行复习,或者当某个术语在 Ansible 论坛 上出现时进行查阅。

操作

操作是任务的一部分,它指定要运行哪个模块以及要传递给该模块的参数。每个任务只能有一个操作,但它也可能具有其他参数。

临时命令

指使用 /usr/bin/ansible 运行 Ansible 以执行一些快速命令,而不是使用 编排 语言(即 /usr/bin/ansible-playbook)。临时命令的一个例子可能是重启基础设施中的 50 台机器。您可以使用临时命令完成的任何操作都可以通过编写 playbook 来完成,并且 playbook 还可以将其他几个操作粘合在一起。

Ansible(软件包)

一个软件包(Python、deb、rpm 等),其中包含 ansible-core 和一组精选的集合。使用 Ansible 2.9 的 playbook 应该仍然可以使用 Ansible 2.10 软件包。请参阅 ansible-build-data 中特定于版本的目录下的 ansible-<version>.build 文件,以获取 Ansible 中包含的集合列表以及包含的 ansible-core 版本。

ansible-base

仅用于 2.10 版本。从 ansible/ansible 存储库 生成的可安装软件包(RPM/Python/Deb 软件包)。请参阅 ansible-core

ansible-core

从 2.11 版本开始使用的名称。从 ansible/ansible 存储库 生成的可安装软件包(RPM/Python/Deb 软件包)。包含命令行工具和基本特性和功能的代码,例如将模块代码复制到受管节点。ansible-core 软件包包含一些模块和插件,并允许您通过安装集合来添加其他模块和插件。

Ansible Galaxy

用于查找和共享 Ansible 社区内容的 在线分发服务器,有时也称为社区 Galaxy。此外,它还是一个命令行实用程序,允许用户安装单独的 Ansible 集合,例如 ansible-galaxy collection install community.crypto

异步

指配置为在后台运行而不是等待完成的任务。如果您有一个长时间运行的进程,其运行时间超过 SSH 超时,那么以异步模式启动该任务是合理的。异步模式可以每隔几秒轮询一次完成情况,也可以配置为“即发即弃”,在这种情况下,Ansible 甚至不会再次检查该任务;它只会启动它并继续执行后续步骤。异步模式适用于 /usr/bin/ansible/usr/bin/ansible-playbook

回调插件

指一些用户编写的代码,可以拦截 Ansible 的结果并对其进行处理。GitHub 项目中提供的一些示例执行自定义日志记录、发送电子邮件,甚至播放声音效果。

检查模式

指使用 --check 选项运行 Ansible,该选项不会对远程系统进行任何更改,而只输出如果命令在没有此标志的情况下运行可能会发生的更改。这类似于其他系统中所谓的“试运行”模式,但应警告用户,这没有考虑意外的命令失败或级联效应(其他系统中的类似模式也是如此)。使用此选项可以了解可能会发生什么,但不能替代良好的暂存环境。

集合

用于捆绑和分发 Ansible 内容的打包格式,包括插件、角色、模块等。集合的发布独立于其他集合或 ansible-core,因此用户可以更快地获得功能。一些集合与 Ansible(2.10 或更高版本)打包在一起。您可以使用 ansible-galaxy collection install <namespace.collection> 安装其他集合(或其他版本的集合)。

集合名称

完全限定集合名称的第二部分。集合名称分隔集合命名空间,通常反映集合内容的功能。例如,cisco 命名空间可能包含 cisco.ioscisco.acicisco.nxos,其中包含用于管理 Cisco 维护的不同网络设备的内容。

community.general(集合)

由 Ansible 社区团队管理的特殊集合,其中包含 Ansible 2.9 中随附的所有模块和插件,这些模块和插件没有自己的专用集合。请参阅 Galaxy 上的 community.general

community.network(集合)

类似于 community.general,专注于网络内容。 Galaxy 上的 community.network

连接插件

默认情况下,Ansible 通过可插拔库与远程计算机通信。Ansible 使用原生 OpenSSH(SSH(原生))或名为 paramiko 的 Python 实现。如果您使用的是最新版本,则首选 OpenSSH,它还启用了一些功能,如 Kerberos 和跳转主机。这在 入门部分 中进行了介绍。还有其他连接类型,如 accelerate 模式,必须通过基于 SSH 的连接类型之一进行引导,但速度非常快,以及在本地系统上运行的本地模式。用户还可以编写自己的连接插件。

条件

条件是一个求值为 true 或 false 的表达式,它决定是否在给定机器上执行给定任务。Ansible 的条件由“when”语句提供支持,该语句在 使用 playbook 中讨论。

声明式

一种实现任务的方法,它使用对最终状态的描述,而不是对实现该状态所需的步骤序列的描述。对于一个真实的例子,对任务的声明式规范将是:“把我放在加利福尼亚州”。根据您当前的位置,将您带到加利福尼亚的步骤序列可能会有所不同,如果您已经在加利福尼亚,则无需执行任何操作。Ansible 的资源是声明式的;它会计算出实现最终状态所需的步骤。它还会让您知道是否需要采取任何步骤才能达到最终状态。

差异模式

可以将 --diff 标志传递给 Ansible,以显示支持它的模块上发生了哪些更改。您可以将其与 --check 结合使用,以获得良好的“试运行”。文件差异通常采用统一差异格式。

分发服务器

一个服务器,例如 Ansible Galaxy 或 Red Hat Automation Hub,您可以在其中分发您的集合并允许其他人访问这些集合。有关分发服务器类型的列表,请参阅 分发集合。某些 Ansible 功能仅在某些分发服务器上可用。

执行器

Ansible 的核心软件组件,它是 /usr/bin/ansible 直接运行的幕后力量,并对应于 playbook 中每个任务的调用。执行器是 Ansible 开发人员可能会讨论的内容,但它并不是用户领域的词汇。

事实

事实是指关于远程节点被发现的信息。虽然它们可以像变量一样在Playbook和模板中使用,但事实是被推断出来的,而不是被设置的。当 Ansible 通过在远程节点上执行内部的setup 模块来运行剧本时,会自动发现事实。您永远不必显式调用 setup 模块,它会自动运行,但如果不需要它可以被禁用以节省时间,或者您可以通过 gather_subset: 选项告知 Ansible 仅收集完整事实的子集。为了方便从其他配置管理系统切换过来的用户,如果安装了 ohaifacter 工具,事实模块也会从中提取事实。这些分别是来自 Chef 和 Puppet 的事实库。(这些也可以通过 gather_subset: 禁用)

过滤器插件

过滤器插件是大多数用户永远不需要理解的东西。它们允许创建新的Jinja2过滤器,这些过滤器或多或少只对了解 Jinja2 过滤器的人有用。如果您需要它们,您可以在API 文档部分中学习如何编写它们。

分支

Ansible 并行地与远程节点通信,并行级别可以通过传递 --forks 或编辑配置文件中的默认值来设置。默认值是一个非常保守的五 (5) 个分支,但是如果您有大量 RAM,您可以轻松地将其设置为像 50 这样的值以增加并行性。

完全限定集合名称 (FQCN)

集合中托管的模块、插件或角色的完整定义,形式为 <命名空间.集合.内容名称>。允许 Playbook 以明确的方式引用来自特定来源的特定模块或插件,例如 community.grafana.grafana_dashboard。当您想指定插件的确切来源时,需要 FQCN。例如,如果多个集合包含一个名为 user 的模块插件,则 FQCN 指定对给定任务使用哪个。当您安装了多个集合时,FQCN 始终是明确和权威的指示符,指示为每个任务搜索哪个集合中的正确插件。

收集事实 (布尔值)

上面提到了事实。有时,当运行多剧本的剧本时,如果某些剧本不需要利用这些值,则希望这些剧本不需要进行事实计算。在剧本上设置 gather_facts: False 允许跳过这种隐式事实收集。

Globbing

Globbing 是一种基于通配符而不是主机名称或它们所属组的名称来选择多个主机的方法。例如,可以选择 ww* 来匹配所有以 www 开头的主机。这个概念直接来自 Func,这是 Michael DeHaan(Ansible 的创始人之一)的早期项目之一。除了基本的 globbing 之外,还可以进行各种集合操作,例如“这个组中的主机而不是另一个组中的主机”,等等。

一个组由分配到池中的多个主机组成,可以方便地一起定位,并且可以为它们提供共享的公共变量。

组变量

group_vars/ 文件是与清单文件一起存在于目录中的文件,可选的文件名以每个组命名。这是一个方便的地方,可以放置提供给给定组的变量,特别是复杂的数据结构,这样这些变量就不必嵌入到清单文件或剧本中。

处理程序

处理程序就像 Ansible 剧本中的常规任务(参见任务),但仅当任务包含 notify 关键字并指示它更改了某些内容时才运行。例如,如果更改了配置文件,则引用配置文件模板操作的任务可能会通知服务重启处理程序。这意味着只有在需要重启时才能重启服务。处理程序可以用于服务重启以外的事情,但服务重启是最常见的用法。

主机

主机只是 Ansible 管理的远程机器。它们可以分配单独的变量,也可以组织在组中。所有主机都有一个可以访问它们的名称(可以是 IP 地址或域名),如果不是在默认 SSH 端口上访问,则可以选择端口号。

主机指定符

Ansible 中的每个Play都将一系列任务(定义系统的角色、目的或顺序)映射到一组系统。

每个 play 中的这个 hosts: 关键字通常称为主机指定符。

它可以选择一个系统、多个系统、一个或多个组,甚至是一些位于一个组中但明确不在另一个组中的主机。

主机变量

就像组变量一样,清单文件旁边的一个名为 host_vars/ 的目录可以包含一个以清单文件中的每个主机名命名的文件,格式为 YAML。这提供了一个方便的地方,可以将变量分配给主机,而无需将它们嵌入到清单文件中。主机变量文件还可以用于定义无法在清单文件中表示的复杂数据结构。

幂等性

如果执行一次操作的结果与重复执行该操作且没有任何中间操作的结果完全相同,则该操作是幂等的。

包含

剧本文件(无非是plays的列表)可以包含其他 plays 列表,任务列表可以将tasks列表外部化到其他文件中,处理程序也是如此。包含可以参数化,这意味着加载的文件可以传递变量。例如,用于设置 WordPress 博客的包含的 play 可以采用名为 user 的参数,并且可以多次包含该 play,以便为 alicebob 创建博客。

清单

一个文件(默认情况下,Ansible 使用简单的 INI 格式)描述了 Ansible 中的主机。清单也可以通过清单脚本提供(有时称为“外部清单脚本”)。

清单脚本

一个非常简单的程序(或复杂的程序),它从外部资源查找主机的主机成员资格和变量信息,无论该资源是 SQL 数据库、CMDB 解决方案还是像 LDAP 这样的东西。这个概念是从 Puppet(在其中称为“外部节点分类器”)改编而来的,并且工作方式或多或少完全相同。

Jinja2

Jinja2 是 Ansible 模板模块首选的模板语言。它是一种非常简单的 Python 模板语言,通常可读且易于编写。

JSON

Ansible 使用 JSON 从远程模块返回数据。这允许用任何语言而不仅仅是 Python 编写模块。

关键字

构成 Ansible 的主要表达式,适用于剧本对象(Play、Block、Role 和 Task)。例如,“vars:” 是一个关键字,允许您在应用它的剧本对象的范围内定义变量。

惰性求值

通常,Ansible 会在最后一秒计算剧本内容中的任何变量,这意味着如果您定义了一个数据结构,则该数据结构本身可以在其中定义变量值,并且一切都会像您期望的那样“正常工作”。这也意味着变量字符串可以包含这些字符串内部的其他变量。

可供 /usr/bin/ansible 或 Ansible Playbook 使用的模块集合。

限制组

通过向 ansibleansible-playbook 传递 --limit somegroup,可以将命令限制为 主机 的子集。例如,这可以用于将通常针对整个服务器集的 playbook 运行到特定的服务器。

本地操作

此关键字是 delegate_to: localhost 的别名。当您希望将远程操作重定向到控制节点本身执行时使用。

本地连接

通过在 playbook 中使用 connection: local,或向 /usr/bin/ansible 传递 -c local,表示我们正在执行本地 fork 而不是在远程计算机上执行。您可能更需要 local_actiondelegate_to: localhost,因为它只更改连接,而不更改执行的其他上下文。

查找插件

查找插件是一种从外部世界获取数据到 Ansible 的方法。查找插件是 Jinja2 的扩展,可以在模板中访问,例如 {{ lookup('file','/path/to/file') }}。诸如 with_items 之类的东西就是通过这种方式实现的。还有一些查找插件,例如 file,它从文件中加载数据,还有一些用于查询环境变量、DNS 文本记录或键值存储的插件。

循环

通常,Ansible 不是一种编程语言。它更倾向于声明式,尽管像 loop 这样的各种构造允许为列表中的多个项目重复执行特定任务。某些模块,例如 yumapt,实际上直接接受列表,并且可以在单个事务中安装这些列表中给出的所有软件包,从而大大加快配置的总时间,因此它们可以在没有循环的情况下使用。

模块

模块是 Ansible 发送到远程计算机的工作单元。模块由 /usr/bin/ansible/usr/bin/ansible-playbook 启动(其中多个任务协同使用多个不同的模块)。模块可以使用任何语言实现,包括 Perl、Bash 或 Ruby,但如果使用 Python 编写,则可以利用一些有用的公共库代码。模块只需返回 JSON。一旦模块在远程计算机上执行,它们就会被删除,因此不使用长时间运行的守护程序。Ansible 将可用模块的集合称为

多层

IT 系统不是一次管理一个系统,而是通过多个系统和系统组之间以明确定义的顺序进行的交互进行管理的这一概念。例如,可能需要在数据库服务器之前更新 Web 服务器,并且可能需要在数据库服务器之后更新 Web 服务器上的各个部分,并且可能需要联系各种负载均衡器和监控服务器。Ansible 对整个 IT 拓扑和工作流程进行建模,而不是从“一次一个系统”的角度查看配置。

命名空间

完全限定的集合名称的第一部分,命名空间通常反映功能内容类别。示例:在 cisco.ios.ios_config 中,cisco 是命名空间。命名空间由 Red Hat 保留和分发,由 Red Hat 自行决定。许多(但不是所有)命名空间将与供应商名称对应。有关命名空间要求,请参阅 Galaxy 文档站点上的 Galaxy 命名空间

通知

任务 注册更改事件并通知 处理器 任务需要在 play 结束时运行另一个操作的行为。如果一个处理器被多个任务通知,它仍然只会运行一次。处理器按其列出的顺序运行,而不是按通知的顺序运行。

编排

许多软件自动化系统使用这个词来表示不同的含义。Ansible 将其用作指挥家指挥管弦乐队的方式。数据中心或云架构充满了许多系统,这些系统扮演着许多角色,包括 Web 服务器、数据库服务器、负载均衡器、监控系统、持续集成系统等等。在执行任何流程时,有必要以特定的顺序触及系统,通常是为了模拟滚动更新或正确部署软件。一些系统可能执行一些步骤,然后是其他系统,然后已经处理过的先前系统可能需要执行更多步骤。在此过程中,可能需要发送电子邮件或联系 Web 服务。Ansible 编排的全部意义在于对这种流程进行建模。

paramiko

Ansible 可以使用名为 paramiko 的 Python SSH 实现。paramiko 库通常速度快且易于管理。要使用 paramiko,您需要在 playbook 中指定连接类型,或者使用 -c paramiko 标志。

Playbook

Playbook 是 Ansible 编排、配置、管理或部署系统的语言。之所以称为 playbook,部分原因是因为它是一个体育类比,而且使用它们应该很有趣。它们不是工作簿 :)

Play

playbook 是 play 的列表。play 至少是主机规范符(通常由 选择,但有时按主机名 全局匹配 选择)选择的一组 主机 与在这些主机上运行的 任务 之间的映射,以定义这些系统将执行的角色。一个 playbook 中可以有一个或多个 play。

拉取模式

默认情况下,Ansible 在 推送模式 下运行,这使其可以非常精细地控制何时与每个系统通信。当您希望节点按照特定计划每 N 分钟签入一次时,会提供拉取模式。它使用名为 ansible-pull 的程序,也可以使用推送模式 playbook 进行设置(或重新配置)。大多数 Ansible 用户使用推送模式,但为了多样性和选择性,也包含了拉取模式。

ansible-pull 的工作原理是从 Git 上的 crontab 中检查配置顺序,然后使用 本地连接 插件在本地管理计算机。

Pulp 3 Galaxy

基于 GalaxyNG 代码库的自托管分发服务器,基于 Pulp 版本 3。使用它来查找和共享您自己策划的内容集。您可以使用 ansible-galaxy collection 命令访问您的内容。

推送模式

推送模式是 Ansible 的默认模式。实际上,它根本不是一种模式,它只是当您没有考虑它时 Ansible 的工作方式。推送模式允许 Ansible 精细地控制和引导节点完成复杂的编排流程,而无需等待它们签入。

注册变量

运行 Ansible 中任何 任务 的结果都可以存储在变量中,以便在模板或条件语句中使用。用于定义变量的关键字称为 register,其名称来自汇编编程中寄存器的概念(尽管 Ansible 永远不会像汇编编程那样)。您可以使用无限数量的变量名称进行注册。

资源模型

Ansible 模块根据资源工作。例如,file 模块将选择一个特定的文件,并确保该资源的属性与特定的模型匹配。例如,我们可能希望将 /etc/motd 的所有者更改为 root(如果它尚未设置为 root),或者将其模式设置为 0644(如果它尚未设置为 0644)。资源模型是幂等的,这意味着除非需要,否则不会运行更改命令,并且 Ansible 会将系统恢复到所需的状态,而不管实际状态如何,而不是您必须告诉它如何达到该状态。

角色

角色是 Ansible 中的组织单元。将角色分配给一组 主机 (或一组 ,或 主机模式 等) 意味着它们应该实现特定的行为。一个角色可能包括应用某些变量值、某些 任务 和某些 处理器——或者只是其中的一个或多个。由于与角色相关联的文件结构,角色成为可重新分发的单元,使您可以在 playbook 之间甚至与其他用户共享行为。

滚动更新

一次处理组中 N 个节点的操作,以避免同时更新它们并使系统脱机。例如,在具有 500 个节点处理非常大流量的 Web 拓扑中,一次更新 10 或 20 台机器可能是合理的,并在完成后移动到接下来的 10 或 20 台。Ansible playbook 中的 serial: 关键字控制滚动更新池的大小。默认情况下是一次处理所有批次大小,因此这是您必须选择加入的功能。操作系统配置(例如确保配置文件正确)通常不必使用滚动更新模型,但如果需要,也可以这样做。

串行

另请参阅

滚动更新

Sudo

Ansible 不需要 root 登录,而且由于它是无守护进程的,因此绝对不需要 root 级别的守护进程(这在敏感环境中可能存在安全问题)。Ansible 可以登录并执行许多包装在 sudo 命令中的操作,并且可以使用无密码和基于密码的 sudo。一些通常不适用于 sudo 的操作(例如 scp 文件传输)可以使用 Ansible 的 copytemplatefetch 模块在 sudo 模式下运行时实现。

SSH (原生)

使用 -c ssh (或配置文件,或 playbook 中的关键字) 指定本机 OpenSSH 作为 Ansible 传输,如果想要通过 Kerberized SSH 登录或使用 SSH 跳板主机等,它可能很有用。在 1.2.1 中,如果控制机器上的 OpenSSH 二进制文件足够新,将默认使用 ssh。以前,Ansible 选择 paramiko 作为默认值。建议使用支持 ControlMasterControlPersist 的客户端以获得最佳性能 - 如果您没有该功能并且不需要 Kerberos、跳板主机或其他功能,则 paramiko 是一个不错的选择。如果 Ansible 未检测到 ControlMaster/ControlPersist 功能,它会发出警告。

标签

Ansible 允许使用任意关键字标记 playbook 中的资源,然后仅运行 playbook 中与这些关键字对应的部分。例如,可以拥有整个操作系统配置,并标记某些步骤为 ntp,然后仅运行 ntp 步骤来重新配置远程主机上的时间服务器信息。

任务

Playbook 的存在是为了运行任务。任务将 操作(一个模块及其参数)与名称以及可选的一些其他关键字(如 循环关键字)组合在一起。处理器 也是任务,但它们是一种特殊的任务,除非在任务报告远程系统上的底层更改时按名称通知它们,否则它们不会运行。

任务

任务 的列表。

模板

Ansible 可以轻松地将文件传输到远程系统,但通常需要替换其他文件中的变量。变量可能来自 清单 文件、主机变量组变量事实。模板使用 Jinja2 模板引擎,还可以包括循环和 if 语句等逻辑结构。

传输

Ansible 使用 :term:连接 插件 来定义可用传输的类型。这些只是 Ansible 如何连接到受管系统。包含的传输有 paramikossh(使用 OpenSSH)和 local

何时

附加到 任务 的可选条件语句,用于确定是否应运行该任务。如果 when: 关键字后面的表达式的计算结果为 false,则将忽略该任务。

变量

事实 相反,变量是值的名称(它们可以是简单的标量值 - 整数、布尔值、字符串)或复杂的值(字典/哈希、列表),它们可以在模板和 playbook 中使用。它们是被声明的东西,而不是从远程系统的当前状态或性质推断出的东西(这就是事实)。

YAML

Ansible 不希望强迫人们编写编程语言代码来自动化基础设施,因此 Ansible 使用 YAML 来定义 playbook 配置语言以及变量文件。YAML 的优点在于它具有最少的语法,并且非常简洁,易于人们浏览。它是一种用于配置文件和人类的良好数据格式,但也机器可读。Ansible 对 YAML 的使用源于 Michael DeHaan 在 2006 年左右首次在 Cobbler 中使用它。YAML 在动态语言社区中相当流行,并且该格式具有许多语言(Python、Perl、Ruby 等)可用的序列化库。

另请参阅

常见问题解答

常见问题

使用 playbook

playbook 简介

Ansible 技巧和窍门

playbook 的技巧和窍门

沟通

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