术语表
以下是 Ansible 文档其他部分中所使用的术语定义列表(及重新解释)。
请查阅文档主页以获取完整文档并查看这些术语的上下文,但这应能作为检验您对 Ansible 组件的了解以及理解它们如何协同工作的一个良好资源。您可以在复习时阅读,或者当某个术语出现在 Ansible 论坛 上时查阅。
- 动作 (Action)
动作是任务 (task) 的一部分,用于指定要运行的模块以及要传递给该模块的参数。每个任务只能有一个动作,但可以包含其他参数。
- 即时任务 (Ad Hoc)
指使用 /usr/bin/ansible 来执行一些快速命令,而不是使用 编排 语言(即 /usr/bin/ansible-playbook)。即时命令的一个例子可能是重启基础设施中的 50 台机器。任何可以即时执行的操作都可以通过编写 剧本 (playbook) 来完成,而且剧本还可以将多个其他操作组合在一起。
- Ansible (软件包)
一个包含 ansible-core 和一组精选集合 (collections) 的软件包(Python、deb、rpm 等)。适用于 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 仓库 生成的可安装软件包。包含命令行工具以及基础特性和功能的代码,例如将模块代码复制到托管节点。
ansible-core软件包包含少量模块和插件,并允许您通过安装集合来添加其他模块和插件。- Ansible Galaxy
用于查找和共享 Ansible 社区内容的 在线分发服务器,有时被称为社区 Galaxy。它也是一个命令行工具,允许用户安装单个 Ansible 集合,例如
ansible-galaxy collection install community.crypto。- 异步 (Async)
指配置为在后台运行而不是等待其完成的任务。如果您有一个运行时间可能超过 SSH 超时时间的长时间流程,那么以异步模式启动该任务是有意义的。异步模式可以每隔几秒轮询一次完成情况,也可以配置为“触发即忘”,在这种情况下,Ansible 甚至不会再次检查该任务;它只会启动它并继续执行后续步骤。异步模式适用于 /usr/bin/ansible 和 /usr/bin/ansible-playbook。
- 回调插件 (Callback Plugin)
指用户编写的一些代码,可以拦截来自 Ansible 的结果并对其进行处理。GitHub 项目中提供的一些示例可以执行自定义日志记录、发送电子邮件,甚至播放音效。
- 检查模式 (Check Mode)
指在运行 Ansible 时使用
--check选项,这不会对远程系统进行任何更改,而只是输出如果不加此标志运行命令可能会发生的更改。这类似于其他系统中的所谓“空运行 (dry run)”模式,尽管用户应注意,这并没有考虑到意外的命令失败或级联效应(在其他系统的类似模式中也是如此)。请使用此模式来了解可能会发生什么,但不要将其替代为一个良好的预发布环境。- 集合 (Collection)
一种用于捆绑和分发 Ansible 内容的打包格式,包括插件、角色、模块等。集合独立于其他集合或
ansible-core发布,因此用户可以更快地使用新功能。一些集合随 Ansible(2.10 或更高版本)一起打包。您可以使用ansible-galaxy collection install <namespace.collection>安装其他集合(或集合的其他版本)。- 集合名称 (Collection name)
全限定集合名称 (Fully Qualified Collection Name) 的第二部分。集合名称划分了集合命名空间,通常反映了集合内容的功能。例如,
cisco命名空间可能包含cisco.ios、cisco.aci和cisco.nxos,其中包含用于管理 Cisco 维护的各种网络设备的内容。- community.general (集合)
由 Ansible 社区团队管理的特殊集合,包含 Ansible 2.9 中发布的所有没有自己独立集合的模块和插件。参见 Galaxy 上的 community.general。
- community.network (集合)
类似于
community.general,专注于网络内容。参见 Galaxy 上的 community.network。- 连接插件 (Connection Plugin)
默认情况下,Ansible 通过可插拔库与远程机器通信。Ansible 使用原生 OpenSSH (SSH (原生)) 或名为 paramiko 的 Python 实现。如果您使用的是较新版本,建议使用 OpenSSH,它还启用了 Kerberos 和跳转主机等功能。这在 入门部分 中有介绍。还有其他连接类型,如
accelerate模式,它必须通过基于 SSH 的连接类型之一进行引导,但速度非常快,以及在本地系统上运行的本地模式。用户也可以编写自己的连接插件。- 条件判断 (Conditionals)
条件是一个计算结果为真或假的表达式,它决定是否在给定机器上执行给定的任务。Ansible 的条件判断由 'when' 语句提供支持,该语句在 使用剧本 中有讨论。
- 声明式 (Declarative)
一种完成任务的方法,它使用最终状态的描述,而不是实现该状态所需的步骤序列的描述。举个现实生活中的例子,任务的声明式规范是:“让我待在加利福尼亚州”。根据您当前的位置,到达加利福尼亚的步骤序列可能会有所不同,如果您已经在加利福尼亚,则根本不需要做任何事情。Ansible 的资源是声明式的;它会找出实现最终状态所需的步骤。它还会让您知道是否需要采取任何步骤才能达到最终状态。
- 差异模式 (Diff Mode)
可以将
--diff标志传递给 Ansible,以显示支持此功能的模块发生了哪些变化。您可以将其与--check结合使用以获得良好的“空运行”效果。文件差异通常采用统一差异格式。- 分发服务器 (Distribution server)
一种服务器(如 Ansible Galaxy 或 Red Hat Automation Hub),您可以在其中分发您的集合并允许其他人访问这些集合。有关分发服务器类型的列表,请参见 分发集合。某些 Ansible 功能仅在特定的分发服务器上可用。
- 执行器 (Executor)
Ansible 的一个核心软件组件,是直接运行 /usr/bin/ansible 背后的动力——并对应于 剧本 中每个任务的调用。执行器是 Ansible 开发人员可能会谈论的内容,但它实际上并不是用户层面的词汇。
- 事实 (Facts)
事实简单来说就是关于远程节点发现的信息。虽然它们可以像变量一样在 剧本 和模板中使用,但事实是推断出来的,而不是预设的。Ansible 在运行 play 时,通过在远程节点上执行内部 setup 模块 自动发现事实。您无需明确调用 setup 模块,它会自动运行;如果不需要,可以将其禁用以节省时间,或者您可以通过
gather_subset:选项告知 Ansible 仅收集全部事实的一个子集。为了方便从其他配置管理系统切换过来的用户,如果安装了 ohai 和 facter 工具,fact 模块也会从这些工具中提取事实。这些分别是来自 Chef 和 Puppet 的事实库。(它们也可以通过gather_subset:禁用)- 过滤插件 (Filter Plugin)
大多数用户永远不需要理解过滤插件。它们允许创建新的 Jinja2 过滤器,这些过滤器或多或少仅对那些知道什么是 Jinja2 过滤器的人有用。如果您需要它们,可以在 API 文档部分 学习如何编写它们。
- 并行进程 (Forks)
Ansible 并行与远程节点通信,并行度可以通过传递
--forks或编辑配置文件中的默认值来设置。默认值是非常保守的 5 个并行进程,尽管如果您有大量的 RAM,您可以轻松将其设置为像 50 这样的值以增加并行性。- 全限定集合名称 (Fully Qualified Collection Name - FQCN)
托管在集合内的模块、插件或角色的完整定义,格式为 <命名空间.集合.内容名称>。允许剧本以明确的方式引用来自特定来源的特定模块或插件,例如
community.grafana.grafana_dashboard。当您需要指定插件的精确来源时,需要 FQCN。例如,如果多个集合包含一个名为user的模块插件,FQCN 将指定给定任务要使用哪一个。当您安装了多个集合时,FQCN 始终是指示为每个任务搜索正确插件的明确且权威的标识符。- 收集事实 (布尔值) (Gather Facts (Boolean))
上面提到了 事实。有时在运行多 play 的 剧本 时,如果某些 play 不需要利用任何这些值,则希望不必费心进行事实计算。在剧本上设置
gather_facts: False允许跳过这种隐式事实收集。- 全局匹配 (Globbing)
全局匹配是一种基于通配符而不是主机的名称或它们所在组的名称来选择多个主机的方法。例如,可以匹配
ww*以匹配所有以www开头的主机。这个概念直接取自 Func,这是 Michael DeHaan(Ansible 的创始人之一)较早的项目之一。除了基本的全局匹配外,还可以进行各种集合操作,例如“在这个组中但不在另一个组中的主机”等等。- 组 (Group)
一个组由分配到一个池中的多个主机组成,可以方便地将它们作为目标一起处理,并为它们提供共享的通用变量。
- 组变量 (Group Vars)
group_vars/文件是位于清单文件旁边目录中的文件,文件名可选地以每个组的名称命名。这是一个放置提供给给定组的变量(特别是复杂数据结构)的方便地方,这样就不必将这些变量嵌入到 清单 文件或 剧本 中。- 处理程序 (Handlers)
处理程序就像 Ansible 剧本 中的常规任务(参见 任务),但只有在任务包含
notify关键字并且表明它更改了某些内容时才会运行。例如,如果配置文件发生更改,则引用配置文件模板操作的任务可以通知服务重启处理程序。这意味着仅在需要重启时才能重启服务。处理程序可以用于服务重启以外的其他用途,但服务重启是最常见的用途。- 主机 (Host)
主机仅仅是 Ansible 管理的远程机器。可以为它们分配单独的变量,也可以将它们组织成组。所有主机都有一个可以联系到的名称(即 IP 地址或域名),如果它们不在默认的 SSH 端口上访问,则可选地还有一个端口号。
- 主机指定符 (Host Specifier)
Ansible 中的每个 Play 将一系列 任务(定义系统的角色、目的或命令)映射到一组系统。
每个 play 中的这个
hosts:关键字通常被称为主机指定符。它可以选择一个系统、多个系统、一个或多个组,甚至是一些在一个组中但明确不在另一个组中的主机。
- 主机变量 (Host Vars)
就像 组变量 一样,清单文件旁边名为
host_vars/的目录可以包含以清单文件中每个主机名命名的文件,格式为 YAML。这提供了一个方便的地方,可以向主机分配变量,而无需将它们嵌入到 清单 文件中。主机变量文件还可用于定义无法在清单文件中表示的复杂数据结构。- 幂等性 (Idempotency)
如果执行一次操作的结果与在没有任何干预操作的情况下重复执行它的结果完全相同,则该操作是幂等的。
- 包含 (Includes)
这个概念是指 剧本 文件(只不过是 play 的列表)可以包含其他 play 列表,任务列表可以外部化其他文件中的 任务 列表,处理程序 也是如此。包含可以是参数化的,这意味着加载的文件可以传递变量。例如,用于设置 WordPress 博客的包含 play 可以采用名为
user的参数,并且该 play 可以被包含多次,以便为alice和bob创建博客。- 清单 (Inventory)
描述 Ansible 中 主机 和 组 的文件(默认情况下,Ansible 使用简单的 INI 格式)。清单也可以通过 清单脚本(有时称为“外部清单脚本”)提供。
- 清单脚本 (Inventory Script)
一个非常简单的程序(或复杂的程序),它从外部资源(无论是 SQL 数据库、CMDB 解决方案还是像 LDAP 这样的东西)查找 主机、主机的 组 成员身份和变量信息。这个概念改编自 Puppet(它被称为“外部节点分类器”),工作方式大致相同。
- Jinja2
Jinja2 是 Ansible 模板模块的首选模板语言。它是一种非常简单的 Python 模板语言,通常易于阅读和编写。
- JSON
Ansible 使用 JSON 作为远程模块的返回数据。这允许用任何语言(不仅仅是 Python)编写模块。
- 关键字 (Keyword)
构成 Ansible 的主要表达式,适用于剧本对象(Play、Block、Role 和 Task)。例如,‘vars:’ 是一个关键字,允许您在应用它的剧本对象范围内定义变量。
- 惰性求值 (Lazy Evaluation)
通常,Ansible 会在最后一刻计算 剧本 内容中的任何变量,这意味着如果您定义一个数据结构,该数据结构本身可以在其中定义变量值,并且一切都会按照您的预期“正常工作”。这也意味着变量字符串可以在这些字符串中包含其他变量。
- 库 (Library)
提供给 /usr/bin/ansible 或 Ansible 剧本 的模块集合。
- 限制组 (Limit Groups)
通过将
--limit somegroup传递给 ansible 或 ansible-playbook,可以将命令限制为 主机 的子集。例如,这可用于运行通常针对整套服务器的 剧本 到特定的服务器。- 本地动作 (Local Action)
此关键字是
delegate_to: localhost的别名。当您想将操作从远程重定向到在控制节点本身上执行时使用。- 本地连接 (Local Connection)
通过在 剧本 中使用
connection: local,或将-c local传递给 /usr/bin/ansible,这表明我们正在执行本地分叉,而不是在远程机器上执行。您可能更想要local_action或delegate_to: localhost,因为这仅更改连接,而不更改执行的其他上下文。- 查找插件 (Lookup Plugin)
查找插件是一种将外部世界的数据获取到 Ansible 中的方法。查找插件是 Jinja2 的扩展,可以在模板中访问,例如
{{ lookup('file','/path/to/file') }}。这就是with_items等功能的实现方式。还有一些查找插件,如file(它从文件中加载数据)以及用于查询环境变量、DNS 文本记录或键值存储的插件。- 循环 (Loops)
总的来说,Ansible 不是一种编程语言。它倾向于更具声明性,尽管像
loop这样的各种结构允许特定任务在列表中重复多次。某些模块(如 yum 和 apt)实际上直接接受列表,并且可以在单个事务中安装这些列表中给出的所有包,从而显著加快总配置时间,因此它们可以在没有循环的情况下使用。- 模块 (Modules)
模块是 Ansible 分发到远程机器的工作单元。模块由 /usr/bin/ansible 或 /usr/bin/ansible-playbook(多个任务结合使用多个不同的模块)启动。模块可以用任何语言实现,包括 Perl、Bash 或 Ruby——但如果用 Python 编写,可以利用一些有用的社区库代码。模块只需返回 JSON。一旦模块在远程机器上执行,它们就会被移除,因此不使用长时间运行的守护进程。Ansible 将可用模块的集合称为 库。
- 多层 (Multi-Tier)
IT 系统不是一次管理一个系统,而是通过多个系统和系统组之间以定义明确的顺序进行的交互来管理的概念。例如,Web 服务器可能需要在数据库服务器之前更新,而 Web 服务器上的某些部分可能需要在 该 数据库服务器之后更新,并且可能需要联系各种负载均衡器和监控服务器。Ansible 对整个 IT 拓扑和工作流程进行建模,而不是从“一次一个系统”的角度看待配置。
- 命名空间 (Namespace)
全限定集合名称的第一部分,命名空间通常反映功能内容类别。示例:在
cisco.ios.ios_config中,cisco是命名空间。命名空间由 Red Hat 自行决定保留和分发。许多(但不是所有)命名空间将与供应商名称对应。有关命名空间要求,请参阅 Galaxy 文档站点上的 Galaxy 命名空间。- 通知 (Notify)
任务 注册更改事件并通知 处理程序 任务需要在 play 结束时运行另一个 动作 的行为。如果处理程序被多个任务通知,它仍然只会运行一次。处理程序按列出的顺序运行,而不是按通知它们的顺序运行。
- 编排 (Orchestration)
许多软件自动化系统使用这个词来表示不同的含义。Ansible 使用它,就像指挥家指挥管弦乐队一样。数据中心或云架构中充满了许多系统,扮演着许多角色——Web 服务器、数据库服务器,也许还有负载均衡器、监控系统、持续集成系统等。在执行任何流程时,必须以特定的顺序接触系统,通常是为了模拟滚动更新或正确部署软件。某个系统可能执行某些步骤,然后是其他系统,然后之前已经处理过的系统可能需要执行更多步骤。在此过程中,可能需要发送电子邮件或联系 Web 服务。Ansible 编排就是关于模拟那种流程。
- paramiko
Ansible 可以使用名为
paramiko的 Python SSH 实现。paramiko 库通常速度快且易于管理。要使用 paramiko,您需要在 剧本 中指定连接类型,或者使用-c paramiko标志。- 剧本 (Playbooks)
剧本是 Ansible 用于编排、配置、管理或部署系统的语言。它们被称为剧本的部分原因是它是一个体育类比,而且使用它们应该很有趣。它们不是工作簿 :)
- Plays
剧本 是 play 的列表。play 至少是主机指定符选择的 主机 集合(通常由 组 选择,有时由主机名 全局匹配 选择)与在这些主机上运行以定义这些系统将执行的角色所需的 任务 之间的映射。一个剧本中可以有一个或多个 play。
- 拉取模式 (Pull Mode)
默认情况下,Ansible 以 推送模式 运行,这允许它非常细粒度地控制何时与每个系统通话。提供拉取模式是为了当您更愿意让节点按特定时间表每 N 分钟签入一次时使用。它使用名为 ansible-pull 的程序,也可以使用推送模式的 剧本 进行设置(或重新配置)。大多数 Ansible 用户使用推送模式,但拉取模式包含在内是为了多样性以及拥有选择的便利。
ansible-pull 的工作方式是从 crontab 上的 Git 检出配置顺序,然后使用 本地连接 插件在本地管理机器。
- Pulp 3 Galaxy
基于 GalaxyNG 代码库 的自托管分发服务器,基于 Pulp 版本 3。使用它来查找和共享您自己策划的内容集。您可以使用
ansible-galaxy collection命令访问您的内容。- 推送模式 (Push Mode)
推送模式是 Ansible 的默认模式。事实上,它根本不是一种模式——当你没考虑它时,它就是 Ansible 的工作方式。推送模式允许 Ansible 细粒度并引导节点通过复杂的编排过程,而无需等待它们签入。
- 注册变量 (Register Variable)
在 Ansible 中运行任何 任务 的结果都可以存储在变量中,以便在模板或条件语句中使用。用于定义变量的关键字称为
register,其名称取自汇编编程中寄存器的概念(尽管 Ansible 永远不会让人感觉像汇编编程)。您可以用于注册的变量名称有无限多种。- 资源模型 (Resource Model)
Ansible 模块以资源的形式工作。例如,文件模块 将选择一个特定文件并确保该资源的属性与特定模型匹配。作为一个例子,如果
/etc/motd的所有者尚未设置为root,我们可能希望将其更改为root,或者如果其模式尚未设置为0644,则将其设置为0644。资源模型是 幂等的,这意味着更改命令不会运行,除非需要,并且 Ansible 将使系统回到所需状态,而不考虑实际状态——而不是您必须告诉它如何达到该状态。- 角色 (Roles)
角色是 Ansible 中的组织单元。将角色分配给一组 主机(或一组 组,或 主机模式 等)意味着它们应该实现特定的行为。角色可能包括应用某些变量值、某些 任务 和某些 处理程序——或者仅这些事物中的一个或多个。由于与角色相关联的文件结构,角色成为可重新分发的单元,允许您在 剧本 之间共享行为——甚至与其他用户共享。
- 滚动更新 (Rolling Update)
一次处理组中 N 个节点的行为,以避免一次性更新它们并将系统脱机。例如,在一个处理极大流量的 500 个节点的 Web 拓扑中,一次更新 10 或 20 台机器可能是合理的,完成后再移动到接下来的 10 或 20 台机器。Ansible 剧本 中的
serial:关键字控制滚动更新池的大小。默认值是一次性处理所有批次大小,所以这是您必须选择加入的功能。OS 配置(例如确保配置文件正确)通常不需要使用滚动更新模型,但如果需要可以这样做。- Serial
另请参阅
- Sudo
Ansible 不需要 root 登录,由于它是无守护进程的,因此肯定不需要 root 级守护进程(在敏感环境中这可能是一个安全问题)。Ansible 可以登录并执行封装在 sudo 命令中的许多操作,并且可以同时使用无密码和基于密码的 sudo。一些通常不适用于 sudo 的操作(如 scp 文件传输)可以在以 sudo 模式运行时通过 Ansible 的 copy、template 和 fetch 模块来实现。
- SSH (原生) (SSH (Native))
原生 OpenSSH 作为 Ansible 传输方式是通过
-c ssh(或配置文件,或 剧本 中的关键字)指定的,如果您想通过 Kerberized SSH 登录或使用 SSH 跳转主机等,这将很有用。在 1.2.1 中,如果控制机器上的 OpenSSH 二进制文件足够新,则默认将使用ssh。此前,Ansible 默认选择paramiko。建议使用支持ControlMaster和ControlPersist的客户端以获得最大性能——如果您没有该功能并且不需要 Kerberos、跳转主机或其他功能,paramiko是一个不错的选择。如果 Ansible 没有检测到 ControlMaster/ControlPersist 功能,它会向您发出警告。- 标签 (Tags)
Ansible 允许在 剧本 中用任意关键字标记资源,然后仅运行与这些关键字对应的剧本部分。例如,可能有一个完整的操作系统配置,并将某些步骤标记为
ntp,然后仅运行ntp步骤以在远程主机上重新配置时间服务器信息。- 任务 (Task)
剧本 的存在是为了运行任务。任务将 动作(模块及其参数)与名称以及可选的其他关键字(如 循环关键字)结合在一起。处理程序 也是任务,但它们是一种特殊的任务,除非当任务报告远程系统上的底层更改时按名称通知它们,否则它们不会运行。
- 任务 (Tasks)
任务 的列表。
- 模板 (Templates)
Ansible 可以轻松地将文件传输到远程系统,但通常需要替换其他文件中的变量。变量可能来自 清单 文件、主机变量、组变量 或 事实。模板使用 Jinja2 模板引擎,也可以包含逻辑结构,如循环和 if 语句。
- 传输 (Transport)
Ansible 使用 连接插件 来定义可用传输类型的类型。它们仅仅是 Ansible 将如何联系受管系统的方式。包含的传输有 paramiko、ssh(使用 OpenSSH)和 local。
- When
附加到 任务 的可选条件语句,用于确定任务是否应该运行。如果
when:关键字后面的表达式计算结果为 false,则该任务将被忽略。- 变量 (Vars (Variables))
与 事实 相反,变量是值(它们可以是简单的标量值——整数、布尔值、字符串)或复杂值(字典/哈希、列表)的名称,可在模板和 剧本 中使用。它们是声明性的东西,而不是从远程系统的当前状态或性质中推断出来的东西(这是事实)。
- YAML
Ansible 不想强迫人们编写编程语言代码来自动化基础设施,因此 Ansible 使用 YAML 来定义 剧本 配置语言以及变量文件。YAML 很不错,因为它只有最少的语法,并且非常干净,易于人们浏览。它是一种适用于配置文件和人类的良好数据格式,但也适用于机器可读。Ansible 对 YAML 的使用源于 Michael DeHaan 大约在 2006 年在 Cobbler 中首次使用它。YAML 在动态语言社区中相当流行,并且该格式有可用于许多语言(Python、Perl、Ruby 等)序列化的库。
另请参阅
- 常见问题
常见问题解答
- 使用 Playbook
Playbook 简介
- Ansible 提示与技巧
Playbook 的提示与技巧
- 交流方式
有疑问?需要帮助?想分享你的想法?请访问 Ansible 通信指南