2017-03-06 1 views
3

저는 이와 같이 구성된 변수가 있습니다. 나는 성공적 같이, 이것은 mysql_db ansible 모듈을 사용하여 적용되는 accessible_from사전에있는 목록을 반복적으로 반복하십시오.

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

에 하나의 키와 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' 때 전체 'mysql_dbs' 객체는 정의되지 않습니다. .. –

+0

잘라 내기 및 붙여 넣기가 잘못되었습니다. 제거 된 기본값. 고마워, @ ConstantinSuvorov – gile

1

먼저 :

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_dbs를 리팩토링 할 수있다 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이 임의의 db에 대해 정의되지 않은 경우이 작업은 실패합니다. skip_missing을 사용할 수 있지만 전체 db를 건너 뜁니다. 이 경우 accessible_from을 생략 할 수 없습니다.

둘째 : 또한 localhostaccessible_from을 디폴트, 키와 값 목록을 형성하기 위해 도우미 set_fact를 사용할 수 있습니다. 이 데이터를 리팩토링없이 작동합니다

- 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] }}" 
관련 문제