在 Ansible AWX 中,我创建了一个 Vault 凭证(名为:user-pw)。现在我想在剧本中使用该密码。但这不起作用。
我创建了一个模板,添加 Vault 凭证(在凭证输入处)。在剧本中,我在密码应该在的地方使用了变量“{{ user-pw }}”。
我做错了什么?如何获取剧本中的 AWX Vault 密码作为变量?
这是测试手册:
---
- name: Vaulttest
hosts: win
tasks:
- name: View user pw
debug:
msg: "{{ user-pw }}"
提前致谢!
找到了!我以错误的方式使用了自定义凭据。
我创建了一个全新的自定义凭据(在管理 - 凭据类型下)。
输入配置:
fields:
- id: pass
type: string
label: password
secret: true
required:
- pass
喷油器配置:
extra_vars:
pass: '{{pass}}'
然后我使用自定义凭据创建了凭据。已填写密码。
在剧本中使用密码变量,如下所示:
- name: Test
module:
username: testuser
password: "{{ pass }}"
最后,将自定义凭证添加到模板中。
根据最简单的描述,这似乎是使用Credentials,甚至Vault的正确方法。
调试自定义凭证类型我通常使用
- hosts: localhost
gather_facts: yes
tasks:
- name: Get environment
debug:
msg: "{{ ansible_env }}"
产生
的输出TASK [Get environment] *********************************************************
ok: [localhost] => {
"msg": [
{
...
"TEST_ACCOUNT_PASSWORD": "test_password",
"TEST_ACCOUNT_NAME": "test_account",
...
}
...
如果配置了此类自定义测试凭证。这适用于 AWX/Tower。然后您可以跟进
您可以滥用 AWX 将凭据传递到 playbook 的方式。每当它在 playbook 运行时的前 10 秒内看到已知的预期提示时,它就会用相应的秘密进行响应。但请注意,这被视为 AWX 中的错误,并且可能会得到修复。不过,我希望在修复之前,AWX UI 能够获得一个特殊的功能,可以使用任何选定的保管库凭证来加密任何任意文本,而无需编写特殊的剧本
从技术上讲,您可以发出一个
vars_prompt
提示,该提示看起来与 ansible-playbook 在需要保管库机密时发出的问题相同,并且 AWX 会将其粘贴到那里。甚至没有检查它是否是第二次执行此操作:) 当然,如果使用一个并且看起来与原始的完全一样,则此提示需要包含正确的保管库 ID。否则你的剧本将冻结,你需要取消该作业。
只是一本没有Vault-id的Vault PoC剧本,但你可以找出一个带有id的:
- name: Encrypt with Vault
hosts: localhost
gather_facts: false
vars_prompt:
- name: vault_pass
prompt: Vault password
tasks:
- ansible.builtin.debug:
msg: "{{ extravar | ansible.builtin.vault(vault_pass) | indent(10, true)"
只需在与未指定保管库 ID 的单个保管库凭证关联的 AWX 作业模板中启动此剧本,您在
extravar
额外变量中输入的所有内容都将使用该特定保管库机密进行加密,甚至无需向您显示。您可以使用密码类型的调查字段,而不会将额外的内容暴露在任何地方。
这个bug能修复吗... 还有一个替代方案!创建保管库机密时,对其自身进行加密并存储在您的剧本中。当开始使用链接的保管库凭证时,您将能够解密...保管库秘密本身。
因此,基本上考虑到您的超安全保管库秘密是“V@ultS3cret!”除了将其存储为凭证之外,还准备
{{ 'V@ultS3cret!' | ansible.builtin.vault('V@ultS3cret!') }}
的结果并将其与 playbook 一起保存。每个有权访问这两者的人 - 此加密内容和凭证本身都将能够获得保管库秘密的明文。