我正在尝试将证书分发到其相应的主机(我将仅给出私钥任务的示例):
- name: create certificate private key
community.crypto.openssl_privatekey:
path: "/root/client/{{ item }}.key"
type: Ed25519
backup: yes
return_content: yes
register: privatekey
loop: "{{ ansible_play_hosts_all }}"
when: "'prometheus1' in inventory_hostname"
我可以像这样为其他主机调用变量:
{{ hostvars['prometheus1']['privatekey']['results'][0]['privatekey'] }}
索引指向某个键,因此 0 将是第一个主机 ( prometheus1
),1 将是第二个主机,依此类推。
我想模板化是要走的路,但我根本不知道如何编写模板。我认为ansible_play_hosts_all
是解决方案的关键,因为它的索引对应于私钥的索引,例如:
ansible_play_hosts_all[2]
-->hostvars['prometheus1']['privatekey']['results'][2]['privatekey']
但逻辑是:
for i in index of ansible_play_hosts_all
add the hostvars['prometheus1']['privatekey']['results'][i]['privatekey']
if ansible_play_hosts_all[i] in inventory_hostname
我想有这样的效果:) 非常感谢任何帮助。
更新
也许更准确一些:
{% for i in ansible_play_hosts_all|length) %}
{{ hostvars['prometheus1']['privatekey']['results'][i]['privatekey'] }}
{% endfor %}
并在其中添加条件:
{% if ansible_play_hosts_all[i] in inventory_hostname %}
使用委托来创建密钥会更简单,
prometheus1
同时将已注册的变量与正确的主机关联。然后你可以privatekey.privatekey
在你的模板中使用。如果你真的想坚持你当前的结构,你可以通过检查
item
结果中的值来找到当前主机对应的列表元素,其中包含item
来自该循环的迭代。使用数据创建字典,例如给定库存
剧本
为除prometheus1之外的每个主机生成私钥,将密钥存储在文件中,并根据注册的数据创建主机及其密钥的字典
然后,您可以继续播放并将密钥复制到主机,例如
根据您的需求调整路径并设置所有权和权限。
我终于能够想出解决方案:
这按预期工作。我正在遍历 ansible_play_hosts_all 的长度(以了解运行角色的主机数量),并在循环内添加索引需要与清单中的主机名相对应的条件。
if 条件中的
-%
and%-
去除空格的输出。没有它们,每个文件都会添加一个空行(在这种情况下似乎不会打扰 openssl,当然没有它会更好)模板任务本身如下: