2017-03-06 74 views
3

我有一個像這樣的結構變量。我在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模塊應用了一個關鍵成功地使用這種與with_dict,像這樣:

- 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: 
     - '%' 

所以 - 目的是創建所有DB和用戶在一場比賽中。我試過玩with_subelements,沒有成功。實際上可以做到這一點嗎?還是有必要重組數據,或重寫劇本?如果必須的話,我會這樣做,但我想知道是否有其他方法。

回答

0

試試這個:

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 
+0

我想這' 「{{mysql_dbs |默認( 'localhost' 的)}}」'將默認字符串'localhost',當整個'mysql_dbs'對象是不確定的。 .. –

+0

錯誤切割和粘貼。刪除默認。謝謝,@KonstantinSuvorov – gile

1

第一:你可以重構你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 

但是,如果accessible_from未定義任何分貝,這將失敗。您可以使用skip_missing,但這會跳過整個數據庫。所以在這種情況下你不能忽略accessible_from

二:您可以使用輔助set_fact形成具有鍵和值的列表,還拖欠accessible_fromlocalhost。這將不重構你的數據工作:

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