2016-07-28 60 views
2

有關Ansible字典的另一個問題!Ansible - 從字典中獲取密鑰(但不是循環)

爲了方便起見,我對字典中的mysql數據庫有一定的價值,它可以很好地循環使用with_dict來創建DB和DB用戶。

mysql_dbs: 
    db1: 
    user: db1user 
    pass: "jdhfksjdf" 
    accessible_from: localhost 
    db2: 
    user: db2user 
    pass: "npoaivrpon" 
    accessible_from: localhost 

任務:

- name: Configure mysql users 
    mysql_user: name={{ item.value.user }} password={{ item.value.pass }} host={{ item.value.accessible_from }} priv={{ item.key }}.*:ALL state=present 
    with_dict: "{{ mysql_dbs }}" 

不過,我想用鑰匙從另一個任務的字典之一,但我不想遍歷所有的字典,我只想一次使用一個。我將如何獲取描述字典的關鍵字(對不起,對術語不太確定)?

問題的任務:

- name: Add the db1 schema 
    shell: mysql {{ item }} < /path/to/db1.sql 
    with_items: '{{ mysql_dbs[db1] }}' 

錯誤ansible運行:

fatal: [myhost]: FAILED! => {"failed": true, "msg": "'item' is undefined"} 

我願意相信with_items這裏不是最好的策略,但沒有任何人有任何的想法是什麼正確對象,真愛?

在此先感謝,一直停留在這個現在一段時間...

+0

我想你不小心刪除了你的部分問題?我指的是「我試過」後的神祕空白空間。 – larsks

回答

7

給定一個嵌套的字典...

mysql_dbs: 
    db1: 
    user: db1user 
    pass: "jdhfksjdf" 
    accessible_from: localhost 
    db2: 
    user: db2user 
    pass: "npoaivrpon" 
    accessible_from: localhost 

您可以用點號:

- debug: 
    var: mysql_dbs.db1 

或者你也可以使用更加Python化的語法:

- debug: 
    var: mysql_dbs['db1'] 

看起來你試圖使用一個邪惡的混合:

mysql_dbs[db1] 

在這種情況下,你想提領名爲db1 的變量,這大概不存在,會導致一個「變量 未定義「類錯誤。

更新

你的問題不清楚,因爲在你的榜樣,你有...

with_items: '{{ mysql_dbs[db1] }}' 

...它看起來像你正在嘗試做的正是我在這裏描述。如果你真正想要做的是遍歷mysql_dbs字典的鍵,請記住,這僅僅是一個Python字典,你必須提供所有的標準字典方法,所以:

- debug: 
    msg: "key: {{ item }}" 
    with_items: "{{ mysql_dbs.keys() }}" 

它的輸出會:

TASK [debug] ******************************************************************* 
ok: [localhost] => (item=db1) => { 
    "item": "db1", 
    "msg": "key: db1" 
} 
ok: [localhost] => (item=db2) => { 
    "item": "db2", 
    "msg": "key: db2" 
} 
+0

不幸的是,這似乎給了我從字典中的值: '{u'accessible_from':u'localhost',u'user':u'db1user',u'pass':u'jdhfksjdf'}「' ,有沒有什麼方法可以獲得密鑰? – ticktockhouse

+0

當然,只需添加另一個點;我希望這是明顯的:'mysql_dbs.db1.user','mysql_dbs.db2.pass'等。或者,'mysql_dbs ['' db1'] ['user']'等等。 – larsks

+0

對不起,我不認爲我提出的問題已經足夠清晰了 - 我想呈現例如'db1'或'db2',而不是字典中的值:'用戶'''通過'或'accessible_from'。是否可以? – ticktockhouse