关于 hashi_vault 查找

此页面解释了 hashi_vault 查找插件 的过去、现在和未来。

hashi_vault 查找是 Ansible 中最早的与 Vault 相关的内容。它包含在预集合 Ansible(<2.10)中。因此,它是使用最广泛的 Vault 插件,也是大多数人最熟悉的插件。

目前,我们建议使用集合中较新的内容,并且我们认为 hashi_vault 的所有用例都已被较新的插件覆盖。要了解历史,请继续阅读本文档。如需迁移方面的帮助,hashi_vault 迁移指南 可以帮到您。

概要

简短总结是

  • hashi_vault 查找执行多个任务,并使用一些我们想要更改但根深蒂固的模式。

  • community.hashi_vault 集合正在开发和发布新的插件和模块,这些插件和模块的范围更紧凑,并将为 hashi_vault 查找一直使用的许多用例提供单独的覆盖。

  • 目前,没有计划弃用 hashi_vault 查找,但它也不太可能收到特定于该查找的新功能(会自动包含新身份验证方法等共享代码的改进)。

  • 随着集合中发布更多插件,我们将在本页面中添加包含示例的特定迁移指南。

长篇故事

hashi_vault 查找注意事项

由于 hashi_vault 查找插件的历史,它可以执行许多任务。它用途广泛,但有时不直观。

hashi_vault 查找插件执行三个主要任务

  • 身份验证,接受各种登录类型的参数,执行登录,并获取一个令牌,该令牌可用于对 Vault 进行其他调用。

  • 通用读取操作,允许它读取任何类型的 Vault 路径,而无需专门为该类型的路径编写。

  • 将看起来像 kv2 响应的响应转换为类似于 kv1 响应的更简单的响应。

读取机密是最常见的用例,Vault 中内置的 kv(键/值)存储是迄今为止最常见的机密存储。大多数实现都使用 v2 版本的 kv 存储。为了方便读取 v2 kv 机密,查找插件会假定您可能正在尝试读取 kv 机密,并尝试推断响应是否来自 kv2,因为版本 2 的响应包含元数据,并且机密值还被包装在另一个结构中。查找插件旨在使 kv2 响应看起来更像版本 1 的响应。

由于 kv 存储在每个机密中都有一个或多个键/值对,因此查找还支持其路径中非标准的后缀,该后缀可以通过 :keyname 语法访问属于一个特定键的值。虽然这对于提供一种紧凑的方式来访问单个机密值非常有用(诚然,这是一个非常常见的用例),但它使实现复杂化,并导致不良习惯。

例如,人们经常看到使用许多具有相同路径的查找调用,每个调用具有不同的 :keyname,以访问单个机密中的多个值,但这非常浪费,因为它会进行单独的登录和机密查找,所有这些都只为了返回相同的值,并且键取消引用是在客户端完成的。此外,可以在 Jinja 中直接进行取消引用,这样可以更清楚地了解正在发生的事情,使用 .key['key'] 语法。

该插件的最后一个特性是它支持在 term 字符串中提供其所有参数。这看起来很紧凑,但它大大复杂化了插件选项的处理。在该查找创建时,许多其他查找允许在 term 字符串中提供选项,但此后它被认为是一种反模式,并且已从核心插件中弃用/删除。

另一个缺点是,当提供多个术语字符串(直接提供或通过 with_community.hashi_vault.hashi_vault 提供)时,它会阻止我们有效地重用身份验证令牌,因此,这种用法会导致每个术语都进行新的登录。在新版本的查找中,我们可以利用单次登录执行多个操作。

所有这些考虑在上下文中都是有意义的,但这在某种程度上混淆了查找的目的

  • 如果来自完全不同端点的响应看起来像 kv2 响应,它将返回意外的结果。

  • 如果您尝试直接给出 kv2 密钥的路径,它将无法工作,除非您在路径中插入一个 /data/ 组件,以便与API 路径匹配,而不是人们通常熟悉的路径。

  • 如果您想要随 kv2 响应一起返回的元数据,则无法获取。

  • kv2 的其他功能(如密钥版本控制)不能直接使用,除非您修改 URL,这容易出错且不直观。

  • 无法访问内部登录创建的令牌以便重用它。

我们如何解决这些考虑事项

内置的身份验证支持将保留,事实上,它已移动到集合中的共享实用程序中,以便所有插件和模块都可以共享该功能并保持一致地工作。这使得测试新的和现有的身份验证方法更容易,添加新的方法也更容易(这些方法会自动成为所有现有内容的一部分),并且添加新内容也更容易,因为不需要重新实现身份验证。

此外,现在可以通过 community.hashi_vault.vault_login 模块查找插件 直接执行登录并返回令牌,以供通用重用。

通用读取(不是 kv 特定的)仍然是重要的功能,因此我们提供了 community.hashi_vault.vault_read 模块查找插件 来提供该功能,而无需尝试推断响应是否来自特定后端。

由于从 kv 存储读取是迄今为止最常见的用例,因此我们为此提供了专用内容

  • community.hashi_vault.vault_kv1_get 模块

  • community.hashi_vault.vault_kv2_get 模块

  • community.hashi_vault.vault_kv1_get 查找

  • community.hashi_vault.vault_kv2_get 查找

通过 :keyname 语法进行的字典解引用在其他内容中将不受支持。这将在 Jinja 中通过以下方式实现:

  • 点语法 .keyname

  • 查找语法 ['keyname']

  • 在某些情况下使用专门的过滤器,例如 vault_login_token 过滤器

通过术语字符串传递参数在其他查找中将不受支持。核心开发人员不鼓励使用它,并且已经在核心中采取了步骤来删除仍然存在的功能,但是为了向后兼容,它将保留在 hashi_vault 插件中,并且因为它很可能仍然在许多地方使用。

hashi_vault 查找的未来

目前没有计划弃用或删除 hashi_vault 插件。 它很可能会无限期地保留下来,以实现向后兼容,并且因为许多功能已移至共享代码,所以几乎不需要维护即可保持其正常运行。 如果情况发生变化,可能会重新考虑此决定。

也就是说,我们将鼓励使用范围更窄、有望在适当时候收到更新和增强功能的新内容。

除了那些“免费”提供的功能(如新的身份验证方法)之外,不太可能在 hashi_vault 查找中添加或接受新功能(这些功能无需更改插件本身的代码)。