使用多个角色可变的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”装[...]
使用Vault是一个好主意。但是你不应该在一个角色中这样做。
原因是,您的角色只是声明一个变量及其默认值。剧本将使用这个或设置它的一个值。 如果一个变量是私人的,你应该根据需要声明变量,但没有默认值。所以如果有人使用你的角色,他必须声明变量才能使其运行。
一个解决方案,要求所需的变量是一个简单的条件:
- fail: msg="Variable foo is required"
when: foo is not defined
所以金库加密变量的处理是对剧本水平。这是一个不应该扮演角色的实现细节。
你是否同意el_whictels下面的回答关于这样的事情不应该包含在角色本身中? – ahawkins
不一定,这取决于你角色的目的是什么。如果你只是用它来构造你的规则,我想它是可以的。很可能这个API密钥不会改变,其他人(如在你的项目或公司之外)不会使用这个角色。如果它是被其他人使用的一般角色,那么当然在角色中对API密钥进行硬编码是没有意义的。但是,在角色中保存Vault文件也是没有意义的,因为任何运行它的人都需要知道密码,因此可以对其进行解码。 – udondan
不过,人们可能会认为角色不应该持有任何实施配置。我大部分也在那列火车上。但是,如果你的主要目的是给你的Ansible规则一个结构,那么这也是一个很好的论点。 – udondan