2017-07-06 260 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 }}"