2017-03-06 28 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] }}"