在ansible角色中使用多个var文件

时间:2016-03-21 15:01:40

标签: ansible ansible-vault

我的一个角色有两种不同的变量类型。一个是公开的(诸如包版本和其他良性信息之类的东西)。这些可以毫无顾虑地致力于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,但这不起作用。

有没有正确的方法呢?

3 个答案:

答案 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' 文件。