Ansible 如何忽略解密Vault文件的失败?

Ansible 如何忽略解密Vault文件的失败?,ansible,ansible-playbook,ansible-vault,Ansible,Ansible Playbook,Ansible Vault,我有两个角色,其中一个有一个group\u vars文件是保险存储的,另一个不是。我希望运行不需要任何vault信息的角色,但ansible仍会提示我输入vault密码: $ tree ├── deploy-home-secure.yml ├── deploy-home.yml ├── group_vars │   ├── home │   │   └── unvaulted │   └── home-secure │   ├── unvaulted │   └── vaulte

我有两个角色,其中一个有一个
group\u vars
文件是保险存储的,另一个不是。我希望运行不需要任何vault信息的角色,但ansible仍会提示我输入vault密码:

$ tree
├── deploy-home-secure.yml
├── deploy-home.yml
├── group_vars
│   ├── home
│   │   └── unvaulted
│   └── home-secure
│       ├── unvaulted
│       └── vaulted
├── hosts
└── roles
    ├── home
    │   └── tasks
    │       └── main.yaml
    └── home-secure
        └── tasks
            └── main.yaml

$ ansible-playbook --version
ansible-playbook 1.8.2
  configured module search path = None

$ ansible-playbook -i hosts deploy-home.yml
ERROR: A vault password must be specified to decrypt vaulttest/group_vars/home-secure/vaulted

$ ansible-playbook --vault-password-file=/dev/null -i hosts deploy-home.yml
ERROR: Decryption failed

我有类似的方法来解决这类问题(我的不是不同的角色,而是不同的主持人,但我认为同样的原则适用):

这是简化的文件结构:

group_vars
  development_vars
  staging_vars 
vaulted_vars
  production_vars
这允许您部署开发或登台,而无需Ansible要求您解密生产变量

然后,制作剧本是这样的:

hosts: production
roles:
  - role...
vars_files:
  - vaulted_vars/production_vars
group_vars
├── all
├── prod
├── dev
│   └── vars.yml
└── dev-vault
    └── vault.yml

指定Vault var路径的vars\u文件行是键。

Ansible将尝试为其在资源清册中遇到的任何组加载组vars文件。如果您将清单文件(主机)拆分为一个用于home组,另一个用于home secure,则它不会尝试解密不应该解密的VAR

$ ansible-playbook -i hosts-home deploy-home.yml

$ ansible-playbook --ask-vault-password -i hosts-home-secure deploy-home-secure.yml

如果您并不总是需要Vault中的变量,那么这里还有另一个选项

您可以有如下文件夹结构:

hosts: production
roles:
  - role...
vars_files:
  - vaulted_vars/production_vars
group_vars
├── all
├── prod
├── dev
│   └── vars.yml
└── dev-vault
    └── vault.yml
将vault中的变量存储在该资源清册的'-vault'变体中

那么您的库存可能如下所示:

开发人员:

开发保险库:

[servers]
dev.bla.bla


[dev:children]
servers

[dev-vault:children]
servers
因此,您只需将敏感数据保存在dev vault vars中,如果在大多数情况下您实际上不需要密码等,那么您可以运行playbook,而不需要实际使用的额外选项,或者为了方便起见以明文形式存储vault密码等

因此,“正常”命令可能是:

 ansible-playbook -i dev some.yml
“Vault”命令可以是:

 ansible-playbook -i dev-vault some.yml --extra-vars="use_vault=true"

或者您可以通过标记来管理“包含vault变量”,包括some-vault.yml中的some.yml等

我怀疑Ansible需要阅读
组变量中的所有内容
,以确保它不会遗漏任何内容。如果是这样的话,为什么不将加密的剧本移动到一个单独的“安全”目录中?@Mxx“以确保它不会遗漏任何内容”-我希望正常的未定义变量警告会生效-如果我们无法解密,那么这些变量将不可用。@Mxx“移动加密的剧本”-我不太明白。被保险存储的是
组变量
文件,据我所知,这些文件必须位于与
主机
文件相关的结构中。我不想用不同的密码为每个Vault文件复制我的主机文件。您的清单文件不会以任何方式链接到您的剧本(剧本中引用的主机除外)。因此,您可以为您的库存设置一个中心位置,并为每个剧本设置单独的位置。@Mxx我一定对这里的某些内容有很大的误解。文件
group\u vars/home\u secure/vaulted
是已保险存储的文件。我明白。我希望运行
home\u secure
角色需要密码,但
home
角色不需要密码。我不知道移动我的playbook(
deploy home.yml
)会如何使Ansible无法加载Vault中的
组变量
文件。