术语表
以下是 Ansible 文档中其他部分所使用术语的定义(及详细解释)列表。
如需查阅完整文档并在上下文中查看这些术语,请访问文档主页。此术语表有助于您检验对 Ansible 组件的掌握程度,并理解它们是如何协同工作的。您可以在复习时阅读,或者在 Ansible 论坛 遇到某个术语时进行查阅。
- Action(动作)
动作(Action)是任务(Task)的一部分,它指定要运行哪个模块以及传递给该模块的参数。每个任务只能有一个动作,但也可以包含其他参数。
- Ad Hoc(即席命令)
指使用 /usr/bin/ansible 运行 Ansible 来执行某些快速命令,而不是使用 编排(Orchestration) 语言(即 /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 超时的长进程,以异步模式启动该任务是有意义的。异步模式可以配置为每隔几秒轮询一次完成情况,或者配置为“即发即弃”(fire and forget);在后一种情况下,Ansible 甚至不会再次检查该任务,只是启动它并继续执行后续步骤。异步模式适用于 /usr/bin/ansible 和 /usr/bin/ansible-playbook。
- Callback Plugin(回调插件)
指由用户编写的一些代码,可以拦截来自 Ansible 的结果并对其进行处理。GitHub 项目中提供了一些示例,可以执行自定义日志记录、发送电子邮件甚至播放音效。
- Check Mode(检查模式)
指使用
--check选项运行 Ansible。该模式不会对远程系统进行任何更改,仅输出如果不在该标志下运行命令可能发生的更改。这类似于其他系统中的所谓“试运行”(dry run)模式,但用户应注意,它不会考虑意外的命令失败或连锁效应(其他系统的类似模式也是如此)。使用此模式可以了解可能发生的情况,但不要用它来替代完善的测试环境。- Collection(集合)
一种用于打包和分发 Ansible 内容(包括插件、角色、模块等)的格式。集合独立于其他集合或
ansible-core发布,因此用户可以更快地使用新功能。一些集合随 Ansible(2.10 或更高版本)一起打包。您可以使用ansible-galaxy collection install <namespace.collection>安装其他集合(或集合的其他版本)。- Collection name(集合名称)
完全限定集合名称(FQCN)的第二部分。集合名称划分了集合命名空间,通常反映集合内容的功能。例如,
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 (Native)) 或名为 paramiko 的 Python 实现。如果您使用较新版本,推荐使用 OpenSSH,它还支持 Kerberos 和跳转主机等功能。这在 入门章节 中有介绍。还有其他连接类型,例如
accelerate模式(必须通过基于 SSH 的连接类型之一引导,但速度非常快)以及本地模式(在本地系统上执行)。用户还可以编写自己的连接插件。- Conditionals(条件判断)
条件判断是一个计算结果为 true 或 false 的表达式,决定了给定的任务是否在指定的机器上执行。Ansible 的条件判断由 ‘when’ 语句驱动,在 Working with playbooks 中有详细讨论。
- Declarative(声明式)
一种任务实现方法,它使用对最终状态的描述,而不是实现该状态所需的步骤序列。举个现实生活中的例子,声明式任务描述是:“把我送到加利福尼亚”。根据您当前的位置,到达加利福尼亚的步骤顺序可能有所不同;如果您已经在加利福尼亚,则根本无需采取任何行动。Ansible 的资源是声明式的;它会自动找出达到最终状态所需的步骤。它还会让您知道是否需要采取任何步骤来达到最终状态。
- Diff Mode(差异模式)
可以将
--diff标志传递给 Ansible,以显示支持此功能的模块上发生了什么变化。您可以将其与--check结合使用以进行良好的“试运行”。文件差异通常以统一的 diff 格式显示。- Distribution server(分发服务器)
一个服务器(如 Ansible Galaxy 或 Red Hat Automation Hub),您可以在其中分发集合并允许他人访问这些集合。有关分发服务器类型的列表,请参阅 分发集合。某些 Ansible 功能仅在特定的分发服务器上可用。
- Executor(执行器)
Ansible 的核心软件组件,直接驱动 /usr/bin/ansible 的功能——并对应于 剧本 中每个任务的调用。执行器是 Ansible 开发人员谈论的内容,但它实际上并不是用户日常使用的词汇。
- Facts(事实)
事实(Facts)仅仅是关于远程节点所发现的信息。虽然它们可以在 剧本 和模板中像变量一样使用,但事实是推断出来的,而不是预先设置的。当运行 Play 时,Ansible 会通过在远程节点上执行内置的 setup 模块 来自动发现事实。您无需显式调用 setup 模块,它会自动运行。如果不使用,可以禁用它以节省时间,或者通过
gather_subset:选项只收集完整事实的子集。为了方便从其他配置管理系统迁移的用户,fact 模块也会在安装了 ohai 和 facter 工具时提取来自它们的事实。这些分别是 Chef 和 Puppet 的事实库。(也可以通过gather_subset:禁用这些功能)- Filter Plugin(过滤器插件)
过滤器插件是大多数用户永远不需要理解的内容。它们允许创建新的 Jinja2 过滤器,这基本只对了解 Jinja2 过滤器的人有用。如果您需要使用它们,可以在 API 文档部分 学习如何编写它们。
- Forks(并发/分支)
Ansible 并行地与远程节点通信,并行级别可以通过传递
--forks或编辑配置文件中的默认值来设置。默认值是非常保守的五 (5) 个进程,但如果您有足够的内存,可以轻松将其设置为 50 等数值以提高并行度。- Fully Qualified Collection Name (FQCN,完全限定集合名称)
集合中托管的模块、插件或角色的完整定义,格式为 <namespace.collection.content_name>。允许 Playbook 以明确的方式引用特定来源的特定模块或插件,例如
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/文件位于库存(inventory)文件旁边的目录中,并使用以每个组命名的一个可选文件。这是存放给定组变量(尤其是复杂数据结构)的方便位置,这样就不必将这些变量嵌入到 库存 文件或 剧本 中。- 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 默认使用简单的 INI 格式),用于描述 Ansible 中的 主机 和 组。库存也可以通过 库存脚本(有时称为“外部库存脚本”)提供。
- 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(限制组)
通过向 ansible 或 ansible-playbook 传递
--limit somegroup,可以将命令限制在 主机 的子集中。例如,这可用于运行通常针对整个服务器集的 剧本,但仅针对一台特定的服务器。- Local Action(本地动作)
此关键字是
delegate_to: localhost的别名。用于希望将远程动作重定向到控制节点自身执行时。- Local Connection(本地连接)
通过在 剧本 中使用
connection: local,或向 /usr/bin/ansible 传递-c local,表明我们正在执行本地分支,而不是在远程机器上执行。您可能更希望使用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 用于编排、配置、管理或部署系统的语言。之所以叫“剧本”(playbooks),部分原因是这是一个体育类比,而且使用它们应该很有趣。它们不是工作簿 :)
- Plays(Play/剧幕)
剧本 是 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:关键字控制滚动更新池的大小。默认是一次处理整个批次大小,因此这是您必须手动启用的功能。操作系统配置(例如确保配置文件正确)通常不必使用滚动更新模型,但如果需要也可以使用。- Serial(序列)
另请参阅
- Sudo
Ansible 不需要 root 登录,而且由于它是无守护进程的,绝对不需要 root 级守护进程(这在敏感环境中可能是一个安全隐患)。Ansible 可以登录并执行许多包装在 sudo 命令中的操作,并且可以与无密码和基于密码的 sudo 配合使用。一些通常不适用于 sudo 的操作(如 scp 文件传输)可以在以 sudo 模式运行时通过 Ansible 的 copy、template 和 fetch 模块实现。
- SSH (Native,原生 SSH)
Ansible 原生 OpenSSH 传输通过
-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 通信指南