带有列表和字典的嵌套循环

时间:2016-12-05 21:33:26

标签: ansible

所以我有点困在一个问题上。基本上,我想用列表和字典运行嵌套循环,我似乎无法弄清楚如何。

我的用例是运行一个Playbook,它将通过使用主体列表对公钥进行签名来生成SSH证书。

我有一个充当跳转主机的主机列表(名为bastionHosts的组)。这些主机上有最终用户及其SSH密钥对。

[bastionHosts]
10.100.0.10
10.100.0.11

我还有一个用户及其SSH主体的字典。字典看起来像这样:

users:
   webuser01: "webservers-principal"
   dbuser01: "dbservers-principal"
   webadmin01: "webservers-principal"

我使用fetch模块为每个用户下载公钥(" id_ecdsa.pub"这会创建一个看起来像这样的目录结构:" / tmp / public_keys /<> / home /<< username>> / .ssh / id_ecdsa.pub

例如,在堡垒10.100.0.10上获取webuser01的公钥会将密钥放入ansible主机上的/tmp/public_keys/10.100.0.10/home/webuser01/.ssh/id_ecdsa.pub。

我的目标是递归到这个目录结构并使用适当的主体签署每个公钥,但我无法弄清楚如何做到这一点。

如果我只提取一组文件并且它是一个平面提取(即每个主机的目录结构未被使用),下面的代码将起作用。 item.key是用户名,item.value是主体集。

 - name: create signed certificates with appropriate principals
   command: ssh-keygen -s /etc/ssh/CA/CA -I {{ item.key }} -n {{ item.value }} -V +1d /tmp/public_keys/{{ item.key }}.pub
   with_dict:
   "{{ users }}"

我还需要一种方法来从内置的 groups.bastionHosts 中指定主机,以便我可以遍历目录结构。下面的代码粗略地概括了我的内容。我希望找到一种方法来获取 with_nested 来处理列表和字典。

- name: create signed certificates with appropriate principals
  command: ssh-keygen -s /etc/ssh/CA/CA -I {{ item.key }} -n {{ item[1].value }} -V +1d /tmp/public_keys/{{ item[0] }}/home/{{ item[1].key }}/.ssh/id_ecdsa.pub
  with_nested:
  - "{{ groups.bastionHosts }}
   - "{{ users }}"

基本上,如果上述工作正常,它将向下遍历每个堡垒主机(item0)和用户(item [1] .key)的每个目录,并使用相应的主体(item [1] .value)签署密钥。但是,这不起作用。我得到错误,项目[1]没有元素"值。"我想这是因为with_nested应该与列表一起使用,而不是字典。

所以基本上:有没有办法让with_nested使用字典和列表,这样我可以引用列表的元素同时引用字典中的项目?如果没有,我是否可能使这个过于复杂,这是一个更简单的方法?提前谢谢!

1 个答案:

答案 0 :(得分:3)

有一个黑客攻击:你可以使用dictsort过滤器从dict制作一个列表:

- hosts: localhost
  gather_facts: no
  vars:
    bastionHosts:
      - 10.100.0.10
      - 10.100.0.11
    users:
       webuser01: "webservers-principal"
       dbuser01: "dbservers-principal"
       webadmin01: "webservers-principal"
  tasks:
    - debug: msg="Host={{item.0}} User.Key={{item.1}} User.Value={{item.2}}"
      with_nested:
        - "{{ bastionHosts }}"
        - "{{ users | dictsort }}"