词汇表
以下是 Ansible 文档中其他地方使用的术语定义列表(以及重新解释)。
请参阅文档主页以获取完整文档并查看上下文中的术语,但这应该是检查您对 Ansible 组件的了解并理解它们如何协同工作的一个很好的资源。您可能希望在复习时或在Ansible 论坛上出现某个术语时阅读它。
- 操作
操作是任务的一部分,它指定要运行哪个模块以及要传递给该模块的参数。每个任务只能有一个操作,但它也可以有其他参数。
- 临时命令
指使用/usr/bin/ansible运行 Ansible 来执行一些快速命令,而不是使用编排语言(即/usr/bin/ansible-playbook)。临时命令的一个示例可能是重新启动基础设施中的 50 台机器。您可以通过编写剧本来完成任何您可以临时执行的操作,并且剧本还可以将其他几个操作粘合在一起。
- Ansible(软件包)
一个软件包(Python、deb、rpm 等),其中包含 ansible-core 和一组选定的集合。与 Ansible 2.9 一起使用的剧本仍然应该与 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.ios
、cisco.aci
和cisco.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”语句提供支持,在使用剧本中讨论了这些语句。
- 声明式
这是一种实现任务的方法,它使用最终状态的描述,而不是实现该状态所需步骤序列的描述。现实世界的例子是,任务的声明性规范是:“把我送到加利福尼亚州”。根据您当前的位置,到达加利福尼亚州的步骤序列可能会有所不同,如果您已经在加利福尼亚州,则根本不需要做任何事情。Ansible 的资源是声明性的;它会找出实现最终状态所需的步骤。它还会让您知道是否需要采取任何步骤才能达到最终状态。
- 差异模式
可以将
--diff
标志传递给 Ansible 以显示支持它的模块中发生了哪些更改。您可以将其与--check
组合以获得良好的“试运行”。文件差异通常采用统一差异格式。- 分发服务器
一个服务器,例如 Ansible Galaxy 或 Red Hat Automation Hub,您可以在其中分发您的集合并允许其他人访问这些集合。有关分发服务器类型的列表,请参见分发集合。某些 Ansible 功能仅在某些分发服务器上可用。
- 执行器
Ansible 的核心软件组件,它是/usr/bin/ansible 的核心驱动力——对应于剧本中每个任务的调用。执行器是 Ansible 开发人员可能会讨论的内容,但它并不是真正的用户级词汇。
- 事实
事实只是关于远程节点的已发现信息。虽然它们可以在剧本和模板中像变量一样使用,但事实是推断出来的,而不是设置的。Ansible 在运行任务时,通过在远程节点上执行内部setup 模块来自动发现事实。您不必显式调用 setup 模块,它会自动运行,但是如果不需要,可以禁用它以节省时间,或者您可以通过
gather_subset:
选项告诉 Ansible 只收集完整事实的子集。为了方便从其他配置管理系统切换的用户,如果安装了ohai和facter工具,事实模块也会从这些工具中提取事实。这些分别是 Chef 和 Puppet 的事实库。(这些也可以通过gather_subset:
禁用)- 过滤器插件
过滤器插件是大多数用户不需要了解的内容。这些允许创建新的Jinja2过滤器,这些过滤器或多或少只对了解 Jinja2 过滤器的人有用。如果您需要它们,您可以学习如何在API 文档部分中编写它们。
- 并发进程
Ansible 并行地与远程节点通信,并且可以通过传递
--forks
或编辑配置文件中的默认值来设置并行级别。默认值是保守的五个 (5) 个并发进程,但是如果您有大量内存,可以轻松地将其设置为 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
的参数,并且可以多次包含该任务以分别为alice
和bob
创建博客。- 清单
一个文件(默认情况下,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 剧本的模块集合。
- 限制组
通过向ansible或ansible-playbook传递
--limit somegroup
,可以将命令限制为主机的子集。例如,这可以用来运行一个剧本,该剧本通常将目标指向一组服务器中的一个特定服务器。- 本地操作
此关键字是
delegate_to: localhost
的别名。当您要将操作从远程重定向到在控制节点本身执行时使用。- 本地连接
通过在剧本中使用
connection: local
,或向/usr/bin/ansible传递-c local
,这表示我们正在执行本地fork,而不是在远程机器上执行。您可能需要local_action
或delegate_to: localhost
,因为这只会更改连接,而不会更改执行的其他上下文。- 查找插件
查找插件是从外部世界获取Ansible数据的一种方式。查找插件是Jinja2的扩展,可以在模板中访问,例如
{{ lookup('file','/path/to/file') }}
。这就是with_items
等实现方式。还有像file
这样的查找插件,它从文件中加载数据,以及用于查询环境变量、DNS文本记录或键值存储的插件。- 循环
通常,Ansible不是一种编程语言。它更倾向于声明式,尽管像
loop
这样的各种结构允许将特定任务重复应用于列表中的多个项目。某些模块,如yum和apt,实际上直接获取列表,并且可以在单个事务中安装这些列表中给出的所有软件包,从而大大加快配置的总时间,因此它们可以无需循环使用。- 模块
模块是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 的copy、template 和fetch 模块在 sudo 模式下实现。
- SSH(原生)
使用
-c ssh
(或配置文件,或剧本中的关键字)指定原生 OpenSSH 作为 Ansible 传输,如果要通过 Kerberized SSH 登录或使用 SSH 跳板主机等,这将非常有用。在 1.2.1 中,如果控制机器上的 OpenSSH 二进制文件足够新,则默认将使用ssh
。以前,Ansible 选择paramiko
作为默认值。建议使用支持ControlMaster
和ControlPersist
的客户端以获得最佳性能——如果您没有这些功能并且不需要 Kerberos、跳板主机或其他功能,paramiko
是一个不错的选择。如果 Ansible 没有检测到 ControlMaster/ControlPersist 功能,它会发出警告。- 标签
Ansible 允许使用任意关键字在剧本中标记资源,然后仅运行与这些关键字对应的剧本部分。例如,可以有一个完整的操作系统配置,并将某些步骤标记为
ntp
,然后只运行ntp
步骤以重新配置远程主机上的时间服务器信息。- 任务
剧本 用于运行任务。任务将操作(模块及其参数)与名称以及可选的其他关键字(如循环关键字)结合在一起。处理器也是任务,但它们是一种特殊类型的任务,除非在任务报告远程系统上的底层更改时按名称通知它们,否则不会运行。
- 任务
一个任务列表。
- 模板
Ansible 可以轻松地将文件传输到远程系统,但通常希望在其他文件中替换变量。变量可能来自清单文件、主机变量、组变量或事实。模板使用Jinja2模板引擎,还可以包含循环和 if 语句等逻辑结构。
- 传输
Ansible 使用 :term:
Connection Plugins
来定义可用传输的类型。这些只是 Ansible 如何联系受管系统。包含的传输有paramiko、ssh(使用 OpenSSH)和本地。- 当
附加到任务的可选条件语句,用于确定是否应运行该任务。如果
when:
关键字后面的表达式计算结果为假,则将忽略该任务。- 变量
与事实相反,变量是值的名称(它们可以是简单的标量值——整数、布尔值、字符串)或复杂的值(字典/哈希、列表),可用于模板和剧本中。它们是被声明的事物,而不是从远程系统的当前状态或性质推断出来的事物(这就是事实)。
- YAML
Ansible 不想强迫人们编写编程语言代码来自动化基础设施,因此 Ansible 使用 YAML 来定义剧本配置语言以及变量文件。YAML 很棒,因为它语法最少,非常简洁易读。对于配置文件和人类来说,它是一种很好的数据格式,但也易于机器读取。Ansible 使用 YAML 源于 Michael DeHaan 约在 2006 年在 Cobbler 中首次使用它。YAML 在动态语言社区中相当流行,并且该格式有许多语言(Python、Perl、Ruby 等)的序列化库可用。
另请参见
- 常见问题
常见问题
- 使用剧本
剧本简介
- Ansible 提示和技巧
剧本技巧
- 沟通
有问题?需要帮助?想分享你的想法?请访问 Ansible 沟通指南