[英]Iterate a list within a dictionary in ansible
我有一個像這樣結構的變量。 我已成功將此與with_dict
一起使用,並在accessible_from
使用了一個鍵
vars:
mysql_dbs:
db1:
user: db1_user
pass: "password"
accessible_from: localhost
db2:
user: db2_user
pass: "password2"
accessible_from: '%'
這是使用mysql_db
ansible模塊應用的,如下所示:
- name: Configure mysql users
mysql_user: name={{ item.value.user }} password={{ item.value.pass }} host={{ item.value.accessible_from | default('localhost')}} priv={{ item.key }}.*:ALL state=present
with_dict: "{{ mysql_dbs }}"
我希望accessible_from
能夠成為一個列表。 這不要緊,如果它是一個列表,但單一的鍵/值對是不夠的:)因此,例如:
vars:
mysql_dbs:
db1:
user: db1_user
pass: "password"
accessible_from:
- server1
- server2
- localhost
db2:
user: db2_user
pass: "password"
accessible_from:
- '%'
所以 - 目標是在一個游戲中創建所有數據庫和用戶。 我嘗試過使用with_subelements
,但沒有成功。 實際上可以這樣做嗎? 或者是否有必要重組數據,或重寫播放? 如果必須,我會這樣做,但我想知道是否還有另一種方法。
第一:您可以將mysql_dbs
重構為列表(因為在with_subelements
您不能引用項目的鍵),例如:
mysql_dbs:
- name: db1
user: db1_user
pass: "password"
accessible_from:
- server1
- server2
- localhost
- name: db2
user: db2_user
pass: "password2"
accessible_from:
- '%'
用戶with_subelements
:
- mysql_user: name={{ item[0].user }} password={{ item[0].pass }} host={{ item[1] }} priv={{ item[0].name }}.*:ALL state=present
with_subelements:
- "{{ mysql_dbs }}"
- accessible_from
但是如果對於任何db都未定義accessible_from
則會失敗。 您可以使用skip_missing
,但這將跳過整個數據庫。 所以在這種情況下你不能省略accessible_from
。
第二:你可以使用helper set_fact
來形成一個包含鍵和值的列表,也accessible_from
將accessible_from
默認為localhost
。 這將無需重構您的數據即可運行:
- set_fact:
db_name: "{{ item.key }}"
db_params: "{{ dict(accessible_from=['localhost']) | combine(item.value) }}"
with_dict: "{{ mysql_dbs }}"
register: mysql_dbs_fact
loop_control:
label: "{{ item.key }}"
- debug:
msg: "mysql_user: name={{ item[0].db_params.user }} password={{ item[0].db_params.pass }} host={{ item[1] }} priv={{ item[0].db_name }}.*:ALL state=present"
with_subelements:
- "{{ mysql_dbs_fact.results | map(attribute='ansible_facts') | list }}"
- db_params.accessible_from
loop_control:
label: "{{ item[0].db_name }}->{{ item[1] }}"
試試這個:
vars:
mysql_dbs:
db1:
user: db1_user
pass: "password"
accessible_from:
- acc_from: server1
- acc_from: server2
- acc_from: localhost
db2:
user: db2_user
pass: "password"
accessible_from:
- acc_from: '%'
tasks:
- name: Configure mysql users
debug: msg="{{ item.0.user }} password={{ item.0.pass }} host={{ item.1.acc_from }} priv={{ item.0 }}.*:ALL state=present"
with_subelements:
- "{{ mysql_dbs }}"
- accessible_from
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.