所以我有点困在一个问题上 . 本质上,我想运行一个包含列表和字典的嵌套循环,我似乎无法弄清楚如何 .
我的用例是运行一个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 回答
有一个hack out:你可以使用
dictsort
过滤器从dict创建一个列表: