术语表
以下是 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 会自动发现事实。您永远不需要显式调用设置模块,它只会运行,但如果不需要,可以将其禁用以节省时间,或者可以通过
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,这是 Michael DeHaan(Ansible 的创始人之一)的早期项目之一。除了基本的通配符匹配之外,还支持各种集合操作,例如“在该组中且不在另一个组中的主机”等等。- 组
组由分配到一个池中的多个主机组成,可以方便地将这些主机一起作为目标,以及提供它们共享的变量。
- 组变量
group_vars/
文件是位于清单文件旁的目录中的文件,具有可选的文件名,该文件名以每个组的名称命名。这是一个方便的位置,可以在其中放置提供给给定组的变量,尤其是复杂的数据结构,这样这些变量就不需要嵌入到 清单 文件或 剧本 中。- 处理器
处理器就像 Ansible 剧本 中的常规任务一样(请参阅 任务),但只有在任务包含
notify
关键字并且也指示它更改了一些内容时才会运行。例如,如果更改了配置文件,则引用配置文件模板操作的任务可能会通知服务重启处理器。这意味着服务只有在需要重启时才会重启。处理器可以用于除服务重启之外的其他用途,但服务重启是最常见的用法。- 主机
主机只是一个 Ansible 管理的远程机器。它们可以分配有单独的变量,也可以组织到组中。所有主机都有一个可以访问到的名称(它是一个 IP 地址或域名)以及一个可选的端口号(如果它们不是在默认的 SSH 端口上访问的)。
- 主机指定符
Ansible 中的每个 剧本 都将一系列 任务(定义系统的角色、目的或顺序)映射到一组系统。
每个剧本中的
hosts:
关键字通常称为主机指定符。它可以选择一个系统、多个系统、一个或多个组,甚至可以选择在一个组中且明确不在另一个组中的某些主机。
- 主机变量
就像 组变量 一样,清单文件旁名为
host_vars/
的目录可以包含一个以清单文件中每个主机名命名的文件,文件格式为 YAML 格式。这提供了一个方便的位置,可以在其中为主机分配变量,而无需将它们嵌入到 清单 文件中。主机变量文件也可以用于定义无法在清单文件中表示的复杂数据结构。- 幂等性
如果执行一次操作的结果与在没有任何中间操作的情况下重复执行该操作的结果完全相同,则该操作是幂等的。
- 包含
指的是 剧本 文件(只不过是 剧本 的列表)可以包含其他剧本列表,以及任务列表可以将任务列表外部化到其他文件中,处理器列表也是如此。包含可以进行参数化,这意味着加载的文件可以传递变量。例如,用于设置 WordPress 博客的包含剧本可以接受名为
user
的参数,并且该剧本可以包含多次以分别为alice
和bob
创建博客。- 清单
一个文件(默认情况下,Ansible 使用简单的 INI 格式),它描述了 Ansible 中的 主机 和 组。清单也可以通过 清单脚本(有时称为“外部清单脚本”)提供。
- 清单脚本
一个非常简单的程序(或者一个复杂的程序),它可以查找 主机、组 主机成员资格以及来自外部资源(无论是 SQL 数据库、CMDB 解决方案还是像 LDAP 这样的东西)的变量信息。这个概念改编自 Puppet(在 Puppet 中称为“外部节点分类器”),并且或多或少以完全相同的方式工作。
- Jinja2
Jinja2 是 Ansible 模板模块的首选模板语言。它是一种非常简单的 Python 模板语言,通常易于阅读和编写。
- JSON
Ansible 使用 JSON 来从远程模块返回数据。这使得模块可以用任何语言编写,而不仅仅是 Python。
- 关键字
构成 Ansible 的主要表达式,这些表达式应用于剧本对象(Play、Block、Role 和 Task)。例如,'vars:' 是一个关键字,允许你在它应用到的剧本对象的范围内定义变量。
- 延迟计算
总的来说,Ansible 会在最后一刻对 剧本 内容中的任何变量进行计算,这意味着如果你定义了一个数据结构,那么该数据结构本身就可以在其中定义变量值,并且一切都如你所预期的那样“正常工作”。这也意味着变量字符串可以包含这些字符串中的其他变量。
- 库
提供给 /usr/bin/ansible 或 Ansible 剧本 的模块集合。
- 限制组
通过将
--limit somegroup
传递给 ansible 或 ansible-playbook,命令可以限制在 主机 的子集中执行。例如,这可以用来运行一个 剧本,该剧本通常针对一组服务器,但现在只针对一台特定的服务器。- 本地操作
这个关键字是
delegate_to: localhost
的别名。当你想要将操作从远程重定向到控制节点本身执行时使用。- 本地连接
在 剧本 中使用
connection: local
,或者将-c local
传递给 /usr/bin/ansible,这表示我们正在执行本地分叉,而不是在远程机器上执行。你可能希望使用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 的 复制、模板 和 获取 模块在 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:
连接 插件
来定义可用传输的类型。这些只是 Ansible 将如何联系受管系统。包含的传输包括 paramiko、ssh(使用 OpenSSH)和 本地。- 何时
附加到 任务 的可选条件语句,用于确定是否应运行该任务。如果
when:
关键字后面的表达式计算结果为假,则该任务将被忽略。- 变量(变量)
与 事实 相反,变量是值的名称(它们可以是简单的标量值 - 整数、布尔值、字符串)或复杂的变量(字典/哈希、列表),可以用于模板和 剧本。它们是声明的东西,而不是从远程系统的当前状态或性质推断出来的东西(这就是事实)。
- YAML
Ansible 不想强迫人们编写编程语言代码来自动化基础设施,因此 Ansible 使用 YAML 来定义 剧本 配置语言以及变量文件。YAML 很棒,因为它语法最少,非常干净,人们很容易浏览。对于配置文件和人类来说,它是一种很好的数据格式,但也机器可读。Ansible 使用 YAML 是因为 Michael DeHaan 在 2006 年左右在 Cobbler 中首次使用它。YAML 在动态语言社区中非常流行,这种格式的库可以在许多语言(Python、Perl、Ruby 等)中用于序列化。
另请参阅
- 常见问题解答
常见问题解答
- 使用剧本
剧本简介
- Ansible 小技巧
剧本的技巧
- 沟通
有问题吗?需要帮助吗?想分享您的想法吗?请访问 Ansible 沟通指南