Take the Ansible Project Survey 2024!

We want to hear from you! Help us gain insights into the state of the Ansible ecosystem.

词汇表

以下是 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 的连接类型之一进行引导,但速度非常快,以及本地模式,该模式作用于本地系统。用户还可以编写自己的连接插件。

条件

条件是一个计算结果为真或假的表达式,它决定是否在给定的机器上执行给定的任务。Ansible 的条件由“when”语句提供支持,这些语句在 使用 playbook 中进行了讨论。

声明式

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

差异模式

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

分发服务器

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

执行器

Ansible 的核心软件组件,是 /usr/bin/ansible 直接背后的驱动力——并且对应于 playbook 中每个任务的调用。执行器是 Ansible 开发人员可能会谈论的内容,但它并不是真正的用户端词汇。

事实

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

过滤器插件

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

并行进程

Ansible 并行地与远程节点通信,并且可以通过传递 --forks 或编辑配置文件中的默认值来设置并行级别。默认值是一个非常保守的五个 (5) 个并行进程,但是如果您有很多 RAM,可以轻松地将其设置为 50 等值以提高并行性。

完整限定集合名称 (FQCN)

模块、插件或角色在集合中托管的完整定义,格式为 <namespace.collection.content_name>。允许剧本以明确的方式引用来自特定来源的特定模块或插件,例如 community.grafana.grafana_dashboard。当您想要指定插件的精确来源时,需要使用 FQCN。例如,如果多个集合包含一个名为 user 的模块插件,则 FQCN 指定了对给定任务使用哪个插件。当您安装了多个集合时,FQCN 始终是明确且权威的指示器,指示哪个集合搜索每个任务的正确插件。

收集事实 (布尔值)

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

通配符

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

一个组由分配到一个池中的多个主机组成,这些主机可以方便地一起作为目标,以及赋予它们共享的变量。

组变量

group_vars/ 文件是位于清单文件旁边目录中的文件,每个组都有一个可选的文件名。这是一个方便的地方来放置提供给给定组的变量,尤其是复杂的数据结构,这样这些变量就不必嵌入到清单文件或剧本中。

处理器

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

主机

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

主机指定符

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

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

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

主机变量

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

幂等性

如果执行一次操作的结果与在没有任何干预操作的情况下重复执行该操作的结果完全相同,则该操作是幂等的。

包含

的想法是剧本文件(只不过是剧本列表)可以包含其他剧本列表,任务列表可以将任务列表外部化到其他文件中,以及处理器类似。包含可以参数化,这意味着加载的文件可以传递变量。例如,用于设置 WordPress 博客的包含剧本可以接受一个名为 user 的参数,并且该剧本可以包含多次以分别为 alicebob 创建博客。

清单

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

清单脚本

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

Jinja2

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

JSON

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

关键字

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

延迟求值

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

提供给/usr/bin/ansible或 Ansible 剧本的一组模块。

限制组

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

本地操作

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

本地连接

通过在剧本中使用connection: local,或将-c local传递给/usr/bin/ansible,这表示我们正在执行本地分支,而不是在远程机器上执行。您可能需要改为使用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 命名空间

通知

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

编排

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

paramiko

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

剧本

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

剧目

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

拉取模式

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

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

Pulp 3 Galaxy

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

推送模式

推送模式是 Ansible 的默认模式。实际上,它根本不是一种模式——它只是 Ansible 在您不考虑它时工作的方式。推送模式允许 Ansible 细粒度地控制节点并通过复杂的编排流程引导节点,而无需等待它们签入。

注册变量

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

资源模型

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

角色

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

滚动更新

一次更新一部分节点(例如,每次更新 N 个节点),而不是一次性更新所有节点,从而避免使整个系统离线。例如,在处理大量数据的 500 个节点的 Web 架构中,可以考虑每次更新 10 或 20 台机器,完成后再继续更新接下来的 10 或 20 台。Ansible 剧本 中的 serial: 关键字控制滚动更新池的大小。默认情况下,一次性更新所有批次,因此需要主动选择此选项。操作系统配置(例如确保配置文件正确)通常不需要使用滚动更新模型,但如果需要也可以使用。

串行

另请参阅

滚动更新

Sudo

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

SSH(原生)

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

标签

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

任务

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

任务

一个 任务 列表。

模板

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

传输

Ansible 使用 :term:连接 插件 来定义可用传输的类型。这些插件简单地定义了 Ansible 如何连接到被管理的系统。包含的传输方式有 paramikossh(使用 OpenSSH)和 本地

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

变量

事实 相反,变量是值的名称(它们可以是简单的标量值 - 整数、布尔值、字符串)或复杂的值(字典/哈希、列表),可用于模板和 剧本。它们是声明的事物,而不是从远程系统的当前状态或特性推断出的事物(事实就是如此)。

YAML

Ansible 不希望人们编写编程语言代码来自动化基础设施,因此 Ansible 使用 YAML 来定义 剧本 配置语言以及变量文件。YAML 很不错,因为它语法最少,非常简洁易读。它是一种适合配置文件和人类使用的良好数据格式,但也易于机器读取。Ansible 使用 YAML 的起源可以追溯到 Michael DeHaan 大约在 2006 年在 Cobbler 中首次使用它。YAML 在动态语言社区中相当流行,并且该格式有许多语言的序列化库可用(Python、Perl、Ruby 等)。

另请参阅

常见问题解答

常见问题

使用剧本

剧本简介

Ansible 提示和技巧

剧本技巧

沟通

有问题?需要帮助?想分享你的想法?请访问 Ansible 沟通指南