在Ansible中循环遍历列表和变量

时间:2017-07-06 09:38:48

标签: loops ansible

我将使用Ansible将两个MySQL数据库的权限授予用户使用不同的IP。我现在得到了什么: VARS:

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

直接调用数组元素看起来不太好。我只想在 with_item 指令中循环遍历 prosody_hosts 数组,сonsidering数据库不是数组。

目标是得到这样的东西:

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

您需要的是嵌套循环。 请参阅此extended version of openssl

基本上你最终会得到类似的东西。将您的数据库放在名为'数据库'的列表中。就像你对主机一样。这将为每个主机和每个数据库执行任务  我还没有对此进行测试,但它应该非常接近。

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