2016-07-28 1 views
2

Ansible!の辞書に関するもう1つの質問です。不可能 - 辞書からキーを取得する(ただしループはありません)

便宜上、with_dictを使用してループして正常に動作する、mysqlデータベースの特定の値が辞書に保持されています。

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

しかし、私は別のタスク内の辞書の1からキーを使用したいが、私は辞書をループにしたくない、私は唯一の希望一度に1つずつ使用する。どのように私は辞書を説明するキーをつかむだろう(申し訳ありませんが、用語については不明)?

問題タスク:ansible目で

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

がエラー:何であるか

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 [' – larsks

+0

申し訳ありませんが、私は十分な質問をしていないと思います。辞書の値ではなく、例えば 'db1'や' db2'をレンダリングしたいと思います: '' db1''や ' – ticktockhouse

関連する問題