18

我的角色之一有两种不同的变量类型。一种是公开的(例如软件包版本和其他良性信息)。这些可以毫无顾虑地提交给 SCM。它还需要一些私人信息(如 API 密钥和其他秘密信息)。我ansible-vault用来加密秘密信息。我的解决方案是vars/main.yaml公开和vars/vault.yml加密的私人信息。

我遇到了一个问题,我不确定这里的最佳实践或实际解决方案是什么。似乎 ansible 只加载vars/main.yml文件。我自然不想加密公共信息,所以我寻找解决方案。到目前为止,我想出的唯一解决方案(在 IRC 上建议)是group_vars/all/vault.yml使用角色名称创建所有变量并为其添加前缀。这是可行的,因为 ansible 似乎递归地加载了group_vars. 这确实有效,但在组织上似乎不正确,因为变量是针对特定角色的,而不是“全局普遍正确的”。我也尝试投入include: vars/vault.ymlvars/main.yml但没有奏效。

有没有合适的方法来做到这一点?

4

3 回答 3

12
于 2016-03-21T15:18:23.227 回答
7

如果有人仍在尝试这样做,而不是具有以下结构:

vars/main.yml
vars/vault.yml

这不会像你看到的那样工作,你可以像这样组织你的角色:

vars/main/vars.yml
vars/main/vault.yml

'main' 目录中的每个 vars 文件都将由您的角色加载,您只能加密您的 'vault.yml' 文件。

于 2021-01-18T15:57:58.867 回答
5

使用 Vault 是个好主意。但是你不应该在一个角色中这样做。

原因是,您的角色只是声明了一个变量及其默认值。剧本将使用它或设置它的一个值。如果变量是私有的,您应该根据需要声明该变量,但没有默认值。因此,如果有人使用您的角色,他必须声明该变量以使其运行。

要求所需变量的一种解决方案是一个简单的条件:

- fail: msg="Variable foo is required"
  when: foo is not defined

所以保管库加密变量的处理是在剧本级别的。这是一个不应该扮演角色的实现细节。

于 2016-03-21T19:35:31.100 回答