我的一个角色有两种不同的变量类型。一个是公开的(诸如包版本和其他良性信息之类的东西)。这些可以毫无顾虑地致力于SCM。它还需要一些私人信息(例如API密钥和其他秘密信息)。我正在使用ansible-vault
来加密秘密信息。我的解决方案是将vars/main.yaml
用于pulic,将vars/vault.yml
用于加密的私人信息。
我遇到了一个问题,我不确定这里的最佳做法或实际解决方案是什么。似乎ansible只加载vars/main.yml
文件。当然,我不想加密公共信息,所以我寻找解决方案。到目前为止,我提出的唯一解决方案(在IRC上建议)是创建group_vars/all/vault.yml
并使用角色名称为所有变量添加前缀。这是有效的,因为ansible似乎递归加载group_vars
下的所有内容。这确实有效但似乎在组织上不正确,因为变量是针对特定的角色而不是“全局普遍真实”。我还尝试将include: vars/vault.yml
放入vars/main.yml
,但这不起作用。
有没有正确的方法呢?
答案 0 :(得分:7)
作为您角色中的第一项任务,您可以拥有include_vars
task。
- include_vars: vault.yml
我从未尝试过,但according to the docs保险库加密文件可以与include_vars
模块一起使用。
保险库功能可以加密Ansible使用的任何结构化数据文件。这可以包括“group_vars /”或“host_vars /”库存变量,由“include_vars”或“vars_files”加载的变量[...]
答案 1 :(得分:5)
使用Vault是个好主意。但你不应该扮演这个角色。
原因是,您的角色只声明了一个变量及其默认值。剧本将使用此或设置其一个值。 如果变量是私有的,则应根据需要声明变量,但不应使用默认值。因此,如果有人使用您的角色,他必须声明变量以使其运行。
要求变量所需的一个解决方案是一个简单的条件:
- fail: msg="Variable foo is required"
when: foo is not defined
因此对Vault加密变量的处理是在playbook级别上的。它是一个不应该发挥作用的实现细节。
答案 2 :(得分:3)
如果有人仍在尝试这样做,而不是使用以下结构:
vars/main.yml
vars/vault.yml
这不会像你看到的那样工作,你可以像这样组织你的角色:
vars/main/vars.yml
vars/main/vault.yml
'main' 目录中的每个 vars 文件都将由您的角色加载,您只能加密您的 'vault.yml' 文件。