管理 Vault 密码
如果您制定了管理 Vault 密码的策略,则管理加密内容会更容易。Vault 密码可以是您选择的任何字符串。没有特殊的命令来创建 Vault 密码。但是,您需要跟踪您的 Vault 密码。每次使用 Ansible Vault 加密变量或文件时,都必须提供密码。当您在命令或 playbook 中使用加密的变量或文件时,您必须提供用于加密它的同一密码。要制定管理 Vault 密码的策略,请从两个问题开始
您是想用相同的密码加密所有内容,还是为不同的需求使用不同的密码?
您想在哪里存储密码或密码?
选择使用单个密码还是多个密码
如果您有一个小型团队或少量敏感值,则可以使用单个密码来加密您使用 Ansible Vault 加密的所有内容。如下所述,将您的 Vault 密码安全地存储在文件或秘密管理器中。
如果您有一个较大的团队或许多敏感值,则可以使用多个密码。例如,您可以为不同的用户或不同的访问级别使用不同的密码。根据您的需求,您可能需要为每个加密文件、每个目录或每个环境使用不同的密码。您可能有一个 playbook,其中包括两个 vars 文件,一个用于开发环境,另一个用于生产环境,使用两个不同的密码加密。当您运行 playbook 时,您可以使用 Vault ID 为您定位的环境选择正确的 Vault 密码。
使用 Vault ID 管理多个密码
如果您使用多个 Vault 密码,您可以使用 Vault ID 来区分密码。您可以通过三种方式使用 Vault ID
在您创建加密内容时,将其与
--vault-id
一起传递给 ansible-vault 命令将其包含在您存储该 Vault ID 密码的任何位置(请参阅 存储和访问 Vault 密码)
当您运行使用使用该 Vault ID 加密的内容的 playbook 时,将其与
--vault-id
一起传递给 ansible-playbook 命令
当您将 Vault ID 作为选项传递给 ansible-vault 命令时,您将标签(提示或昵称)添加到加密内容中。此标签记录了您用于加密它的密码。加密的变量或文件在其标头中以纯文本形式包含 Vault ID 标签。Vault ID 是加密内容之前的最后一个元素。例如
my_encrypted_var: !vault | $ANSIBLE_VAULT;1.2;AES256;dev 30613233633461343837653833666333643061636561303338373661313838333565653635353162 3263363434623733343538653462613064333634333464660a663633623939393439316636633863 61636237636537333938306331383339353265363239643939666639386530626330633337633833 6664656334373166630a363736393262666465663432613932613036303963343263623137386239 6330
除了标签之外,您还必须为相关密码提供来源。来源可以是提示、文件或脚本,具体取决于您存储 Vault 密码的方式。该模式如下所示
--vault-id label@source
如果您的 playbook 使用多个使用不同密码加密的加密变量或文件,则在运行该 playbook 时必须传递 Vault ID。您可以单独使用 --vault-id
,或与 --vault-password-file
或 --ask-vault-pass
一起使用。该模式与创建加密内容时相同:包括标签和匹配密码的来源。
有关使用 Vault ID 加密内容以及使用使用 Vault ID 加密的内容的示例,请参见下文。 --vault-id
选项适用于与 Vault 交互的任何 Ansible 命令,包括 ansible-vault、ansible-playbook 等。
Vault ID 的限制
Ansible 不会强制您每次使用特定的 Vault ID 标签时都使用相同的密码。您可以使用相同的 Vault ID 标签但不同的密码加密不同的变量或文件。当您在提示符下输入密码并犯错时,通常会发生这种情况。您可以故意使用具有相同 Vault ID 标签的不同密码。例如,您可以将每个标签用作对一类密码的引用,而不是单个密码。在这种情况下,您必须始终知道在上下文中要使用哪个特定的密码或文件。但是,您更有可能错误地使用相同的 Vault ID 标签和不同的密码加密两个文件。如果您意外地使用相同的标签但不同的密码加密了两个文件,则可以 重新加密 一个文件来解决该问题。
强制 Vault ID 匹配
默认情况下,Vault ID 标签只是一个提示,用于提醒您用于加密变量或文件的密码。Ansible 不会检查加密内容标头中的 Vault ID 是否与您在使用内容时提供的 Vault ID 匹配。Ansible 会解密您的命令或 playbook 调用的所有文件和变量,这些文件和变量使用您提供的密码加密。要检查加密内容并仅当其包含的 Vault ID 与您使用 --vault-id
提供的 Vault ID 匹配时才解密,请设置配置选项 DEFAULT_VAULT_ID_MATCH。当您设置 DEFAULT_VAULT_ID_MATCH 时,每个密码仅用于解密使用相同标签加密的数据。这既高效又可预测,并且可以减少使用不同密码加密不同值时出现的错误。
注意
即使启用了 DEFAULT_VAULT_ID_MATCH 设置,Ansible 也不会强制您每次使用特定的 Vault ID 标签时都使用相同的密码。
存储和访问 Vault 密码
您可以记住您的 Vault 密码或手动从任何来源复制 Vault 密码并将其粘贴到命令行提示符下,但大多数用户会安全地存储它们,并根据需要在 Ansible 中访问它们。您有两个用于在 Ansible 中存储 Vault 密码的选项:文件或第三方工具(例如系统密钥环或秘密管理器)。如果将密码存储在第三方工具中,则需要一个 Vault 密码客户端脚本才能从 Ansible 中检索它们。
将密码存储在文件中
要将 Vault 密码存储在文件中,请将密码作为字符串输入到文件中的单行上。确保文件的权限适当。请勿将密码文件添加到源代码控制中。
当您运行使用文件中存储的 Vault 密码的 playbook 时,请在 --vault-password-file
标志中指定该文件。例如
ansible-playbook --extra-vars @secrets.enc --vault-password-file secrets.pass
使用 Vault 密码客户端脚本将密码存储在第三方工具中
您可以将您的 Vault 密码存储在系统密钥环、数据库或秘密管理器中,并使用 Vault 密码客户端脚本从 Ansible 中检索它们。将密码作为字符串输入到单行上。如果您的密码具有 Vault ID,请以与您的密码存储工具兼容的方式存储它。
要创建 Vault 密码客户端脚本
创建一个名称以
-client
或-client.EXTENSION
结尾的文件使文件可执行
- 在脚本本身中
将密码打印到标准输出
接受一个
--vault-id
选项如果脚本提示输入数据(例如数据库密码),则将提示显示到 TTY。
当你运行使用存储在第三方工具中的 vault 密码的 playbook 时,请在 --vault-id
标志中指定脚本作为源。例如
ansible-playbook --vault-id dev@contrib-scripts/vault/vault-keyring-client.py
Ansible 执行客户端脚本时会带上 --vault-id
选项,以便脚本知道你指定的 vault ID 标签。例如,从密钥管理器加载密码的脚本可以使用 vault ID 标签来选择 'dev' 或 'prod' 密码。上面的示例命令会导致以下客户端脚本的执行
contrib-scripts/vault/vault-keyring-client.py --vault-id dev
有关从系统密钥环加载密码的客户端脚本示例,请参阅 vault-keyring-client 脚本。