词汇表
以下是 Ansible 文档中其他地方使用的术语定义列表(和重新解释)。
请查阅文档主页以获取完整文档,并查看上下文中的术语,但这应该是一个很好的资源,用于检查您对 Ansible 组件的了解,并了解它们如何组合在一起。当 Ansible 论坛 上出现某个术语时,您可能希望阅读此内容进行复习。
- 动作
动作是任务的一部分,用于指定要运行哪个模块以及要将哪些参数传递给该模块。每个任务只能有一个动作,但也可能具有其他参数。
- Ad Hoc
指使用 /usr/bin/ansible 运行 Ansible 以执行一些快速命令,而不是使用 编排 语言,后者是 /usr/bin/ansible-playbook。Ad hoc 命令的一个示例可能是重新启动基础架构中的 50 台计算机。您可以使用编写 playbook 完成任何 ad hoc 操作,并且 playbook 还可以将其他几个操作粘合在一起。
- Ansible(软件包)
一个软件包(Python、deb、rpm 等),其中包含 ansible-core 和一组选定的集合。使用 Ansible 2.9 的 playbook 应该仍然可以使用 Ansible 2.10 软件包。请参阅 ansible-build-data 中特定于版本的目录中的
ansible-<版本>.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 <命名空间.集合>
安装其他集合(或其他版本的集合)。- 集合名称
完全限定集合名称的第二部分。集合名称分隔集合命名空间,通常反映集合内容的功能。例如,
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 的连接类型之一进行引导,但速度非常快,并且本地模式作用于本地系统。用户还可以编写自己的连接插件。- 条件
条件是计算结果为 true 或 false 的表达式,它决定是否在给定计算机上执行给定任务。Ansible 的条件由“when”语句提供支持,该语句在使用 playbook中讨论。
- 声明式
一种实现任务的方法,它使用最终状态的描述,而不是实现该状态所需的步骤序列的描述。对于一个真实的示例,任务的声明式规范将是:“把我放在加利福尼亚州”。根据您当前的位置,将您带到加利福尼亚州的步骤顺序可能会有所不同,并且如果您已经在加利福尼亚州,则根本不需要执行任何操作。Ansible 的资源是声明式的;它会找出实现最终状态所需的步骤。它还会让您知道是否需要采取任何步骤才能达到最终状态。
- 差异模式
可以将
--diff
标志传递给 Ansible,以显示支持它的模块上发生了哪些更改。您可以将其与--check
结合使用,以获得良好的“试运行”。文件差异通常采用统一差异格式。- 分发服务器
一个服务器,例如 Ansible Galaxy 或 Red Hat Automation Hub,您可以在其中分发您的集合并允许其他人访问这些集合。有关分发服务器类型的列表,请参阅分发集合。某些 Ansible 功能仅在特定的分发服务器上可用。
- 执行器
Ansible 的核心软件组件,是直接支持 /usr/bin/ansible 的幕后力量,并且对应于 playbook 中每个任务的调用。执行器是 Ansible 开发人员可能会谈论的内容,但它实际上不是用户领域的词汇。
- 事实
事实只是关于远程节点被发现的事物。虽然它们可以像变量一样在playbook和模板中使用,但事实是被推断出来的东西,而不是被设置的。当通过在远程节点上执行内部的 setup 模块 运行时,Ansible 会自动发现事实。您永远不必显式调用 setup 模块,它只是运行,但是如果不需要它可以禁用以节省时间,或者您可以通过
gather_subset:
选项告诉 Ansible 只收集完整事实的子集。为了方便从其他配置管理系统切换的用户,如果安装了 ohai 和 facter 工具,事实模块还会从这些工具中提取事实。这些分别是来自 Chef 和 Puppet 的事实库。(这些也可以通过gather_subset:
禁用)- 过滤器插件
过滤器插件是大多数用户永远不需要理解的东西。这些插件允许创建新的 Jinja2 过滤器,这些过滤器或多或少只对了解 Jinja2 过滤器的人有用。如果您需要它们,您可以在 API 文档部分中学习如何编写它们。
- Fork
Ansible 并行与远程节点通信,并行级别可以通过传递
--forks
或在配置文件中编辑默认值来设置。默认值是一个非常保守的五个(5)fork,但是如果您有大量 RAM,您可以轻松地将其设置为像 50 这样的值以提高并行性。- 完全限定的集合名称 (FQCN)
集合中托管的模块、插件或角色的完整定义,格式为 <namespace.collection.content_name>。允许 Playbook 以明确的方式引用来自特定来源的特定模块或插件,例如,
community.grafana.grafana_dashboard
。当您要指定插件的确切来源时,需要 FQCN。例如,如果多个集合包含一个名为user
的模块插件,则 FQCN 指定在给定任务中使用哪个。当您安装了多个集合时,FQCN 始终是明确且权威的指示符,指示在每个任务中搜索哪个集合以查找正确的插件。- 收集事实(布尔值)
上面提到了 事实。有时,在运行多 play playbook 时,希望某些 play 不进行事实计算,因为它们不需要使用任何这些值。在 playbook 上设置
gather_facts: False
允许跳过这种隐式的事实收集。- Globbing
Globbing 是一种基于通配符而不是主机名称或它们所在组的名称来选择多个主机的方法。例如,可以选择
ww*
来匹配所有以www
开头的主机。这个概念直接来自 Michael DeHaan(Ansible 创始人)的早期项目之一 Func。除了基本的 globbing 之外,还可以进行各种集合操作,例如“此组中的主机,但不在此组中的主机”,等等。- 组
组由分配到一个池中的多个主机组成,这些主机可以方便地一起定位,并被赋予它们共同拥有的变量。
- 组变量
group_vars/
文件是与清单文件一起存在于目录中的文件,可选的文件名以每个组命名。这是放置提供给给定组的变量(尤其是复杂的数据结构)的方便位置,以便这些变量不必嵌入到清单文件或playbook中。- 处理器
处理器就像 Ansible playbook 中的常规任务(请参阅任务),但仅当任务包含
notify
关键字并且还指示它更改了某些内容时才运行。例如,如果更改了配置文件,则引用配置文件模板操作的任务可能会通知服务重启处理器。这意味着只有在需要重启服务时才能重启服务。处理器可以用于服务重启以外的其他事情,但服务重启是最常见的用法。- 主机
主机只是 Ansible 管理的远程计算机。可以为它们分配单独的变量,并且也可以组织成组。所有主机都有一个可以访问它们的名称(可以是 IP 地址或域名),以及可选的端口号(如果它们不是在默认 SSH 端口上访问)。
- 主机指定符
Ansible 中的每个Play 都将一系列任务(定义系统的角色、目的或顺序)映射到一组系统。
每个 play 中的
hosts:
关键字通常称为主机指定符。它可以选择一个系统、多个系统、一个或多个组,甚至是一些在一个组中但明确不在另一个组中的主机。
- 主机变量
就像组变量一样,清单文件旁边的一个名为
host_vars/
的目录可以包含一个以清单文件中的每个主机名命名的文件,采用YAML格式。这提供了一个方便的位置来为主机分配变量,而无需将它们嵌入到清单文件中。主机变量文件还可用于定义无法在清单文件中表示的复杂数据结构。- 幂等性
如果执行一次操作的结果与重复执行该操作而没有任何中间操作的结果完全相同,则该操作是幂等的。
- 包含
playbook文件(它们只不过是plays的列表)可以包含其他 plays 列表,并且任务列表可以将其他文件中的任务列表外部化,处理器也是如此。包含可以参数化,这意味着加载的文件可以传递变量。例如,用于设置 WordPress 博客的包含 play 可能需要一个名为
user
的参数,并且可以多次包含该 play,以便为alice
和bob
创建博客。- 清单
一个文件(默认情况下,Ansible 使用简单的 INI 格式)描述了 Ansible 中的 主机和组。清单也可以通过 清单脚本(有时称为“外部清单脚本”)提供。
- 清单脚本
一个非常简单的程序(或复杂的程序),可以从外部资源(无论是 SQL 数据库、CMDB 解决方案还是 LDAP 之类的东西)查找主机、主机的组成员资格和变量信息。这个概念改编自 Puppet(在 Puppet 中称为“外部节点分类器”),其工作方式或多或少完全相同。
- Jinja2
Jinja2 是 Ansible 模板模块的首选模板语言。它是一种非常简单的 Python 模板语言,通常可读且易于编写。
- JSON
Ansible 使用 JSON 从远程模块返回数据。这允许用任何语言编写模块,而不仅仅是 Python。
- 关键字
构成 Ansible 的主要表达式,应用于 playbook 对象(Play、Block、Role 和 Task)。例如,'vars:' 是一个关键字,允许您在应用到的 playbook 对象的范围内定义变量。
- 惰性求值
通常,Ansible 在最后可能的时间评估playbook内容中的任何变量,这意味着如果您定义了一个数据结构,则该数据结构本身可以在其中定义变量值,并且一切都“按预期工作”。这也意味着变量字符串可以包含这些字符串内的其他变量。
- 库
一组可供 /usr/bin/ansible 或 Ansible playbook 使用的模块集合。
- 限制组
通过向 ansible 或 ansible-playbook 传递
--limit somegroup
,可以将命令限制为 主机 的一个子集。例如,这可以用于将通常以整个服务器集为目标的 playbook 限制为一台特定的服务器。- 本地操作
此关键字是
delegate_to: localhost
的别名。当您希望将远程操作重定向到控制节点本身执行时使用。- 本地连接
通过在 playbook 中使用
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 命名空间。- 通知
任务 注册更改事件并通知 处理程序 任务在 play 结束时需要运行另一个 操作 的行为。如果一个处理程序被多个任务通知,它仍然只运行一次。处理程序按照它们列出的顺序运行,而不是按照它们被通知的顺序运行。
- 编排
许多软件自动化系统使用这个词来表示不同的含义。Ansible 将其用作指挥家指挥管弦乐队。一个数据中心或云架构充满了许多系统,扮演着许多角色 – Web 服务器、数据库服务器、可能还有负载均衡器、监控系统、持续集成系统等等。在执行任何流程时,有必要以特定的顺序触及系统,通常是为了模拟滚动更新或正确部署软件。某些系统可能执行一些步骤,然后是其他步骤,然后是已经处理过的先前系统可能需要执行更多步骤。在此过程中,可能需要发送电子邮件或联系 Web 服务。Ansible 编排就是对这种过程进行建模。
- paramiko
Ansible 可以使用一个名为
paramiko
的 Python SSH 实现。paramiko 库通常快速且易于管理。要使用 paramiko,您需要在您的 playbook 中指定连接类型,或使用-c paramiko
标志。- Playbook
Playbook 是 Ansible 用来编排、配置、管理或部署系统的语言。之所以称之为 playbook 部分原因是因为它是一个体育类比,使用它们应该很有趣。它们不是工作簿 :)
- Play
Playbook 是一个 plays 的列表。一个 play 至少是主机规范器(通常由 组 选择,但有时由主机名 glob 选择)选择的一组 主机 与在这些主机上运行以定义这些系统将执行的角色的 任务 之间的映射。一个 playbook 中可以有一个或多个 play。
- 拉取模式
默认情况下,Ansible 在 推送模式 下运行,这使得它可以非常精细地控制何时与每个系统对话。当您希望节点每 N 分钟在特定计划上签入时,提供拉取模式。它使用一个名为 ansible-pull 的程序,也可以使用推送模式 playbook 设置(或重新配置)。大多数 Ansible 用户使用推送模式,但为了多样性和拥有选择,也包含拉取模式。
ansible-pull 的工作原理是从 crontab 上的 Git 中检查配置顺序,然后使用 本地连接 插件在本地管理计算机。
- 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 中的组织单元。将角色分配给一组主机(或一组组,或主机模式等等)意味着它们应该实现特定的行为。一个角色可能包括应用某些变量值、某些任务和某些处理器——或者只是其中一个或多个。由于与角色关联的文件结构,角色成为可重新分发的单元,允许你在剧本之间共享行为,甚至与其他用户共享。
- 滚动更新
滚动更新是指一次处理组 N 中的若干节点,以避免一次更新所有节点并使系统脱机。例如,在处理非常大容量的 500 个节点的 Web 拓扑中,一次更新 10 或 20 台机器可能是合理的,完成后再移至下一个 10 或 20 台。Ansible 剧本中的
serial:
关键字控制滚动更新池的大小。默认情况下,是一次处理所有批次大小,因此你必须选择启用此功能。操作系统配置(例如确保配置文件正确)通常不必使用滚动更新模型,但如果需要,也可以这样做。- 串行
另请参阅
- Sudo
Ansible 不需要 root 登录,而且由于它是无守护进程的,因此绝对不需要 root 级别的守护进程(这在敏感环境中可能是一个安全问题)。Ansible 可以登录并执行许多包装在 sudo 命令中的操作,并且可以使用无密码和基于密码的 sudo。一些通常不适用于 sudo 的操作(如 scp 文件传输)可以使用 Ansible 的 copy、template 和 fetch 模块在 sudo 模式下运行来实现。
- SSH (原生)
作为 Ansible 传输的原生 OpenSSH 使用
-c ssh
(或配置文件,或剧本中的关键字)指定,如果你想通过 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:
连接 插件
来定义可用传输的类型。这些只是 Ansible 将如何访问被管理系统的方式。包含的传输有paramiko、ssh(使用 OpenSSH)和 本地。- 何时
附加到任务的可选条件语句,用于确定是否应运行该任务。如果
when:
关键字之后的表达式的计算结果为 false,则将忽略该任务。- 变量
与事实相反,变量是值的名称(它们可以是简单的标量值 - 整数、布尔值、字符串)或复杂的值(字典/哈希、列表),可以在模板和剧本中使用。它们是声明的东西,而不是从远程系统的当前状态或性质推断出来的东西(这才是事实)。
- YAML
Ansible 不想强迫人们编写编程语言代码来自动化基础架构,因此 Ansible 使用 YAML 来定义剧本配置语言和变量文件。YAML 很好,因为它具有最少的语法,并且对于人们来说非常干净且易于浏览。它是一种适合配置文件和人类的良好数据格式,但也具有机器可读性。Ansible 对 YAML 的使用源于 Michael DeHaan 在 2006 年左右首次在 Cobbler 中使用它。YAML 在动态语言社区中相当流行,并且该格式具有许多语言(Python、Perl、Ruby 等)中可用于序列化的库。
另请参阅
- 常见问题解答
常见问题
- 使用剧本
剧本简介
- Ansible 使用技巧
剧本提示和技巧
- 沟通
有问题?需要帮助?想分享你的想法?请访问 Ansible 通信指南