2017-03-06 3 views
3

Ich habe eine Variable wie folgt strukturiert. Ich habe erfolgreich diese mit with_dict mit einem einzigen Schlüssel in der das mysql_db ansible Modul, wie dies mit angewendet Dies wird accessible_fromIterate eine Liste in einem Wörterbuch in ansible

vars: 
    mysql_dbs: 
    db1: 
     user: db1_user 
     pass: "password" 
     accessible_from: localhost 
    db2: 
     user: db2_user 
     pass: "password2" 
     accessible_from: '%' 

verwendet:

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

würde ich accessible_from mag die Fähigkeit zu haben, zu sein eine Liste. Dabei spielt es keine Rolle, ob es hat eine Liste zu sein, aber ein einzelner Schlüssel/Wert-Paar ist nicht genug :) So zum Beispiel:

vars: 
    mysql_dbs: 
    db1: 
     user: db1_user 
     pass: "password" 
     accessible_from: 
     - server1 
     - server2 
     - localhost 
    db2: 
     user: db2_user 
     pass: "password" 
     accessible_from: 
     - '%' 

So - das Ziel ist, alle DBs zu erstellen und Benutzer in einem Spiel. Ich habe versucht, mit with_subelements herum zu spielen, ohne Erfolg. Ist das tatsächlich möglich? Oder ist es notwendig, die Daten neu zu strukturieren oder das Spiel neu zu schreiben? Ich werde das tun, wenn ich muss, aber ich habe mich gefragt, ob es einen anderen Weg gibt.

Antwort

0

Try this:

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

Ich nehme diese ' "{{mysql_dbs | default ('localhost')}}"' string wird standardmäßig 'localhost', wenn ganze' mysql_dbs' Objekt ist nicht definiert. .. –

+0

Falsch ausschneiden und einfügen. Standard entfernt Danke, @KonstantinSuvorov – gile

1

Erstens: Sie können Ihre mysql_dbs in Liste Refactoring (weil in with_subelements Sie können keine Elemente Schlüssel beziehen), wie:

mysql_dbs: 
    - name: db1 
    user: db1_user 
    pass: "password" 
    accessible_from: 
     - server1 
     - server2 
     - localhost 
    - name: db2 
    user: db2_user 
    pass: "password2" 
    accessible_from: 
     - '%' 

und Benutzer 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 

Aber das wird fehlschlagen, wenn accessible_from für irgendeine db undefiniert ist. Sie können skip_missing verwenden, aber dies wird gesamte db überspringen. Sie können also accessible_from in diesem Fall nicht weglassen.

Zweitens: Sie Helfer set_fact verwenden können mit Schlüssel und Wert eine Liste zu bilden, auch accessible_from zu localhost säumigen. Dies funktioniert ohne Ihre Daten Refactoring:

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