2016-12-22 7 views
2

私はいくつかのEC2インスタンスを作成してから、いくつかのことをするためのプレイブックを持っています。これは、意図したとおりに動作しますが、私はそれがプレイ要約には本当に大きなオブジェクトを示し、部分的にので、item.instances[0].private_ip式で特に満足していないAnjaプレイでJinja2 `map`フィルタを使用して、オブジェクトの配列から値を取得できますか?

- name: create ec2 instances 
    ec2: 
    id: '{{ item.name }}' 
    instance_type: '{{ item.type }}' 
    register: ec2 
    with_items: '{{ my_instance_defs }}' 
- name: wait for SSH 
    wait_for: 
    host: '{{ item.instances[0].private_ip }}' 
    port: 22 
    with_items: '{{ ec2.results }}' 

:関連部分は、およそのようなものです。私は、with_itemsの部分を、オブジェクトの配列を持つオブジェクトの配列ではなく、IPアドレスの配列にしたいと思っています。 Pythonでは、私はちょうどのようなものだろう:

ips = [r['instances'][0]['private_ip'] for r in ec2['results']] 

をそして私は2番目のタスクでwith_items: '{{ ips }}'を使用します。

遊びのYAMLでJ2フィルタを使って同じことをする方法はありますか? http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containersのように思えるかもしれませんが、私はキー/インデックスの配列を持っていることを前提としています。

答えて

3

mapここにあなたの友人をフィルタリングしてください。このような

何か:

with_items: "{{ ec2.results | map(attribute='instances') | map('first') | map(attribute='private_ip') | list }}" 

上記のコードをテストされていません。
debugを最初に試して、徐々にmapを追加して、必要な結果を得ることができます。
| listを最後に入力して地図を読み取り可能にすることを忘れないでください。

+0

魅力的な作品です!あなたの例とhttp://jp.pocoo.org/docs/dev/templates/#builtin-filtersにあるドキュメントを読むまで、 'map'がどのように動作することになっていたのか、私はかなり分かりませんでした。また、 'list'アドバイスのために+1してください。 – amacleod

+0

私は複数の場所でIPの配列を使用しているので、私は 'set_fact:ec2_ips = {{ec2.results |マップ(属性= "インスタンス")|マップ( "最初")|マップ(attribute = "private_ip")|リスト}} '。 – amacleod