带有ansible的动态变量名称

Dynamic variable names with ansible

我在 Hashicorp Vault 中有一堆 key=value 形式的 ssh 密钥,我已经设置了 Ansible 以便能够解决。

我正在尝试使用我存储的密钥设置一些新用户,但失败了。基本信息(用户名、组等)在我创建的字典列表中,名为 linux_users。

以下是我获取全部秘密的方法:

- name: set the required secret as fact
  set_fact:
    secret: "{{ lookup('hashi_vault', 'secret=/secret/data/Exploit/PAM url={{ vault_url }} token={{ vault_token.token.auth.client_token }}') }}"
  no_log: true
  delegate_to: localhost

然后我使用 vars 查找来尝试获取我想要的 ssh 密钥:

- debug:
    msg: "{{ lookup('vars', 'secret.data.' + item.name) }}"
  loop: "{{ linux_users }}"

结果是 Ansible 告诉我变量不存在:

fatal: [localhost]: FAILED! => {}

MSG:

The task includes an option with an undefined variable. The error was: No variable found with this name: secret.data.pamlogon

The error appears to be in '/home/ansible/test/pamuser.yml': line 19, column 5, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


  - debug:
    ^ here

然而,如果我按名称调试 var,我会得到正确的答案:

ok: [localhost] => {
    "secret.data.pamlogon": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA...[abridged for security purposes]"
}

变量刚刚命名secretsecret.data.pamlogon 是在 Jinja 中访问该变量字段的另一种方式,并且(大部分)等同于 secret['data']['pamlogon']。您根本不需要 vars 查找,因为您使用的是单个静态变量名称。只需使用正常的访问器语法:

  msg: "{{ secret.data[item.name] }}"

  msg: "{{ secret['data'][item.name] }}"