使用多个角色可变的var文件

问题描述:

我的角色之一有两种不同的变量类型。一个是公共的(比如软件包版本和其他良性信息)。这些可以致力于SCM而不用担心。它还需要一些私人信息(例如API密钥和其他秘密信息)。我使用ansible-vault加密秘密信息。我的解决方案是将vars/main.yaml用于pulic,vars/vault.yml用于加密的私人信息。使用多个角色可变的var文件

我遇到了一个问题,我不确定什么是最佳实践或实际解决方案。看起来只有加载vars/main.yml文件。当然,我不想加密公共信息,所以我寻找解决方案。到目前为止,我提出的唯一解决方案(在IRC上建议)是创建group_vars/all/vault.yml并在角色名称前加上所有变量。这是可行的,因为ansible似乎递归加载group_vars下的所有内容。这是行得通的,但在组织上似乎不正确,因为变量是针对特定的角色,而不是“全球普遍真实”。我也试图把include: vars/vault.yml纳入vars/main.yml,但那并不奏效。

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

作为您角色的首要任务,您可以有一个include_vars task

- include_vars: vault.yml 

我从来没有尝试过,但according to the docs金库加密的文件可以与include_vars模块一起使用。

保险库功能可以加密Ansible使用的任何结构化数据文件。这可以包括“group_vars /”或“host_vars /”库存变量,变量通过“include_vars”或“vars_files”装[...]

+0

你是否同意el_whictels下面的回答关于这样的事情不应该包含在角色本身中? – ahawkins

+0

不一定,这取决于你角色的目的是什么。如果你只是用它来构造你的规则,我想它是可以的。很可能这个API密钥不会改变,其他人(如在你的项目或公司之外)不会使用这个角色。如果它是被其他人使用的一般角色,那么当然在角色中对API密钥进行硬编码是没有意义的。但是,在角色中保存Vault文件也是没有意义的,因为任何运行它的人都需要知道密码,因此可以对其进行解码。 – udondan

+0

不过,人们可能会认为角色不应该持有任何实施配置。我大部分也在那列火车上。但是,如果你的主要目的是给你的Ansible规则一个结构,那么这也是一个很好的论点。 – udondan

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

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

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

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

所以金库加密变量的处理是对剧本水平。这是一个不应该扮演角色的实现细节。