所以我有点陷入了一个问题。本质上,我想使用列表和字典运行一个嵌套循环,但我似乎不知道如何操作。
我的用例是运行一个 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/>/.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这样我就可以遍历目录结构。下面的代码是我想要做什么的粗略想法,但我找不到一种方法来获取带嵌套使用列表和字典。
- 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] 没有元素“值”。我想这是因为 with_nested 应该使用列表,而不是字典。
所以基本上:有没有一种方法可以让 with_nested 处理字典和列表,以便我可以引用列表的元素,同时也引用字典中的项目?如果没有,我是否可能让这变得太复杂并且有更简单的方法?提前致谢!