aha*_*ins 12 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,但没有奏效.
有没有正确的方法来做到这一点?
作为角色中的第一项任务,您可以include_vars完成任务.
- include_vars: vault.yml
Run Code Online (Sandbox Code Playgroud)
我从来没有尝试过,但根据docs vault加密文件可以与include_vars模块一起使用.
保管库功能可以加密Ansible使用的任何结构化数据文件.这可以包括"group_vars /"或"host_vars /"库存变量,由"include_vars"或"vars_files" 加载的变量 [...]
小智 6
In case anyone is still trying to do that, instead of having the following structure:
vars/main.yml
vars/vault.yml
Run Code Online (Sandbox Code Playgroud)
which won't work like you saw, you can instead organise your role like this:
vars/main/vars.yml
vars/main/vault.yml
Run Code Online (Sandbox Code Playgroud)
Every vars file in the 'main' dir will be loaded by your role and you can encrypt your 'vault.yml' file only.
小智 5
使用保险柜是个好主意。但是您不应该在角色中这样做。
原因是,您的角色仅声明了一个变量及其默认值。剧本将使用此值或设置其一个值。如果变量是私有的,则应根据需要声明该变量,但没有默认值。因此,如果有人在使用您的角色,则必须声明该变量才能使其运行。
一个要求必需变量的解决方案是一个简单的条件:
- fail: msg="Variable foo is required"
when: foo is not defined
Run Code Online (Sandbox Code Playgroud)
因此,库加密变量的处理在剧本级别上进行。这是一个实现细节,不应发挥作用。