簡體   English   中英

在ansible中迭代字典中的列表

[英]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_fromaccessible_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM