首页 文章

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

提问于
浏览
2

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

我的用例是运行一个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)签署密钥 . 但是,这不起作用 . 我得到错误,item [1]没有元素“value” . 我想这是因为with_nested应该与列表一起使用,而不是字典 .

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

1 回答

  • 3

    有一个hack out:你可以使用 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 }}"
    

相关问题