2017-07-06 259 views
1

我將使用Ansible將兩個MySQL數據庫的權限授予不同IP的用戶。我現在得: 瓦爾:在Ansible中遍歷列表和變量

#users 
root_user: 'root' 
root_password: 'root' 
prosody_user: 'prosody' 
prosody_password: 'prosody' 

#databases 
oauth_db: "oauth" 

#hosts 
prosody_hosts: ['10.0.1.4', '10.0.1.5'] 

任務:

- name: add or update mysql user prosody 
    mysql_user: 
    name: "{{ prosody_user }}" 
    host: "{{ item.host }}" 
    password: "{{ prosody_password }}" 
    login_user: "{{ root_user }}" 
    login_password: "{{ root_password }}" 
    check_implicit_admin: yes 
    append_privs: yes 
    priv: "{{ item.database }}.*:ALL,GRANT" 
    with_items: 
    - { host: "{{ prosody_hosts[0] }}", database: "{{ oauth_db }}" } 
    - { host: "{{ prosody_hosts[1] }}", database: "{{ oauth_db }}" } 
    - { host: "{{ prosody_hosts[0] }}", database: "{{ prosody_db }}" } 
    - { host: "{{ prosody_hosts[1] }}", database: "{{ prosody_db }}" } 

數組元素的直接調用看起來並不很漂亮。我只是想遍歷prosody_hosts陣列with_item指令,сonsidering是數據庫不是一個數組。

目標是要得到的東西是這樣的:提前

... 
with_items 
- { host: "{{ prosody_hosts }}", database: "{{ oauth_db }}" } 
- { host: "{{ prosody_hosts }}", database: "{{ prosody_db }}" } 

謝謝!

回答

0

你需要的是嵌套循環。 請參閱Ansible documentation

基本上你最終會得到類似的東西。把你的數據庫放在一個名爲'數據庫'的列表中,就像你對主機做的一樣這將爲每個主機和每個數據庫執行任務。
我沒有測試過,但它應該非常接近。

- name: add or update mysql user prosody 
    mysql_user: 
    name: "{{ prosody_user }}" 
    host: "{{ item[0] }}" 
    password: "{{ prosody_password }}" 
    login_user: "{{ root_user }}" 
    login_password: "{{ root_password }}" 
    check_implicit_admin: yes 
    append_privs: yes 
    priv: "{{ item[1] }}.*:ALL,GRANT" 
    with_nested: 
    - "{{ prosody_hosts }}" 
    - "{{ databases }}"