有没有可能在保险库中使用多个密码?

9

我有一个部署项目,需要与其他团队共享。我已经使用Vault加密了我的秘密信息。 我希望能够使用密码加密生产文件,并使用另一个密码加密暂存文件,以避免其他团队访问生产秘密。

这种做法是否可行?

我已经尝试过这样的操作,我的秘密信息如下:

cat /group_vars/all/vault_production.yml (encrypt with password A)
production_password: 'test1'

cat/group_vars/all/vault_staging.yml (encrypt with password B)
staging_password: 'test2'

我的环境:

cat hosts-production
[all:vars]
env_type=production

cat hosts-staging
[all:vars]
env_type=staging

我的脚本:

- copy:
  content: |
    env PASS={{hostvars[inventory_hostname][env_type + '_password']}}
  ...

我这样启动playbook。

# for production
ansible-playbook  -i hosts-staging test.yml --vault-password-file .password_a
# for staging
ansible-playbook  -i hosts-staging test.yml --vault-password-file .password_b

但是这不起作用,因为有两个不同的密码(错误!解密失败)。

你知道该怎么做吗?

谢谢。

敬礼,

Eric


我的初步感觉是将保险库文件移动到某个不会自动包含它们的地方,并且每次只显式地包含需要的文件,但我还没有验证它是否可行。 - Xiong Chiamiov
2个回答

8
自 Ansible 2.4 起支持多个保险库密码:

Multiple vault passwords

ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml

如果提供了多个保险库密码,默认情况下,Ansible将尝试按照它们在命令行上提供的顺序逐一解密保险库内容。在上述情况下,首先尝试“dev”密码,然后尝试“prod”密码,以防Ansible不知道使用哪个保险库ID来加密某些内容。

4

抱歉,每次运行只允许一个保险库密码。如果您只需要其中一个,最好的方法是根据变量动态加载保险库文件;例如:

- hosts: localhost
  vars_files:
  - secretstuff-{{ env_type }}.yml
  tasks:
  ...

或者

- hosts: localhost
  tasks:
  - include_vars: secretstuff-{{ env_type }}.yml
  ...

根据您需要变量在一次操作还是整个运行期间生存的不同,您可以将它们作为播放变量(play vars)或事实(facts)引入。


谢谢Matt。但是还有一个问题。使用这个include,我无法动态获取变量: 例如: shell: echo {{ hostvars[inventory_hostname][env_type + '_sql_password] }} # 不起作用 shell: echo {{staging_sql_password}} # 起作用 - elhostis
在当前版本的ansible上,这对我来说很好用:hostvars[inventory_hostname][env_type + '_sql_password'],当使用include_vars时。问题是:如果你只加载其中一个,为什么不直接称其为“sql_password”并完成呢? - nitzmahone
哇,你说得完全正确 @Matt David。它像那样很好地运行。非常感谢你。Eric - elhostis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接