Ansible
使用 ansible 模板文件以獲取不同主機的不同變數部分(通過其索引)
我正在嘗試將證書分發到其相應的主機(我將僅給出私鑰任務的範例):
- 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
在你的模板中使用。- name: create certificate private key community.crypto.openssl_privatekey: path: /root/client/{{ inventory_hostname }}.key type: Ed25519 backup: yes return_content: yes register: privatekey delegate_to: prometheus1
如果你真的想堅持你目前的結構,你可以通過檢查
item
結果中的值來找到目前主機對應的列表元素,其中包含item
來自該循環的迭代。{{ (hostvars['prometheus1']['privatekey']['results'] | selectattr('item', '==', inventory_hostname) | list | first).privatekey }}