Ansible

使用 ansible 模板文件以獲取不同主機的不同變數部分(通過其索引)

  • March 29, 2021

我正在嘗試將證書分發到其相應的主機(我將僅給出私鑰任務的範例):

- 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 }}

引用自:https://serverfault.com/questions/1058550