首页 > 解决方案 > Ansible 循环遍历从 dict 中提取的列表

问题描述

我在 RHEL 7.7 上使用 Ansible 2.9,我正在尝试遍历一个列表,该列表是来自 dict 元素的值。到目前为止,我有这个 var 文件并播放:

ssh_keys:
  account: blah
  permissions: 600
  keys:
    - qa-publickeys['1']
    - qa-publickeys['2']
    - qa-publickeys['3']

表演:

- name: Traversing ssh keys 
  debug:
    msg: "Here's: {{ item }}"
  loop: "{{ ['keys'] | map('extract', ssh_keys) | list }}"

问题是,msg"msg": "Here's: [u\"qa-publickeys['1']\", u\"qa-publickeys['2']\", u\"qa-publickeys['3']\"]"

为什么它不给我三个输出,Here's: qa-publickeys['1']作为第一个输出,Here's: qa-publickeys['2']作为第二个输出,最后一个Here's: qa-publickeys['3']

我在这部剧中呈现给 的列表loop并没有被循环,它只是在一个块中迭代一次。

标签: ansible

解决方案


您似乎无缘无故地让自己变得非常复杂。
Ansible 中的字典可以通过.点表示法或[]方括号表示法访问。

现在因为.keys()确实是 Python 中字典的内置方法,所以不能使用第一种表示法,但可以使用后一种表示法。

鉴于剧本:

- hosts: all
  gather_facts: no

  tasks:
    - debug:
        msg: "Here's: {{ item }}"
      loop: "{{ ssh_keys['keys'] }}"
      vars:
        ssh_keys:
          account: blah
          permissions: 600
          keys:
            - qa-publickeys['1']
            - qa-publickeys['2']
            - qa-publickeys['3']

这产生了回顾:

PLAY [all] *******************************************************************************************************

TASK [debug] *****************************************************************************************************
ok: [localhost] => (item=qa-publickeys['1']) => 
  msg: 'Here''s: qa-publickeys[''1'']'
ok: [localhost] => (item=qa-publickeys['2']) => 
  msg: 'Here''s: qa-publickeys[''2'']'
ok: [localhost] => (item=qa-publickeys['3']) => 
  msg: 'Here''s: qa-publickeys[''3'']'

PLAY RECAP *******************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

推荐阅读