如果不存在 VAULT_ADDR,则写入 Vault 秘密路径

问题描述 投票:0回答:1

使用 group_vars 中的 Hashicorp Vault 查找插件解决多个秘密。如果剧本在构建管道中运行,目标是解决秘密。如果剧本在本地环境中运行,则应返回秘密路径。目标是能够输出每个主机的所有变量并对 group_var 更改执行差异。

最初的想法是这样的:

top_secret: "{% set secret='secret/top_secret/key:value' %}{{ lookup('hashi_vault', 'secret=secret') if VAULT_ADDR else secret }}"

因此,如果环境变量“VAULT_ADDR”存在,那么它应该解析秘密“secret/top_secret/key:value”,如果不存在,则使用字符串“secret/top_secret/key:value”。遗憾的是这是不可能的,因为 Jinja2 无法解析 group_var 文件。

有效的是:

top_secret: "{{ lookup('hashi_vault', 'secret=secret/top_secret/key:value') if VAULT_ADDR is none else 'secret/top_secret/key:value' }}"

我不喜欢的是秘密路径是重复的。

实现这个目标还有其他选择吗?

ansible jinja2 ansible-inventory
1个回答
0
投票

遗憾的是这是不可能的,因为 Jinja2 无法解析 group_var 文件。

我不完全确定你的意思是什么,但你绝对可以在任何组变量中使用 Jinja2。我尝试了您的两个模板,将

hashi_vault
查找替换为
env
,因为我没有设置保险库,并且它们工作不正确,直到我修复了您的条件表达式。但从概念上讲,它们都在起作用:

vault_addr: "{{ lookup('env', 'VAULT_ADDR') }}"
top_secret: "{% set secret='secret/top_secret/key:value' %}{{ lookup('env', 'SOMETHING') if vault_addr is defined and vault_addr else secret }}"
secret_path: secret/top_secret/key:value
non_top_secret: "{{ lookup('env', 'SOMETHING') if vault_addr is defined and vault_addr else secret_path }}"

未设置

VAULT_ADDR
时:

"top_secret": "secret/top_secret/key:value"
"non_top_secret": "secret/top_secret/key:value"

设置

VAULT_ADDR
时:

"top_secret": "something"
"non_top_secret": "something"

所以一般来说它是有效的。但是,正如您所看到的,可读性不太好。如果您决定使用多行 YAML 修复它,则必须处理奇怪的空格和换行符。这是可能的,但太难而且没有必要。

更干净的方法是使用三元过滤器:

---
vault_addr: "{{ lookup('env', 'VAULT_ADDR') }}"
secret_path: secret/top_secret/key:value
top_secret: "{{ vault_addr is defined and vault_addr | ternary(lookup('env', 'SOMETHING'), secret_path) }}"

请注意,我还以老式方式检查

vault_addr
的长度,因为我没有使用 Ansible 2.13 中添加的
default
查找的
env
关键字。如果您确定这对您的情况来说不是问题,则可以省略。

在查看文档时,我刚刚注意到三元过滤器也有

none_val
关键字参数,因此实现起来可能更简单。不过我还没玩过。

© www.soinside.com 2019 - 2024. All rights reserved.