所以我有点困在一个问题上。基本上,我想用列表和字典运行嵌套循环,我似乎无法弄清楚如何。
我的用例是运行一个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使用字典和列表,这样我可以引用列表的元素同时引用字典中的项目?如果没有,我是否可能使这个过于复杂,这是一个更简单的方法?提前谢谢!
答案 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 }}"