私はいくつかの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のように思えるかもしれませんが、私はキー/インデックスの配列を持っていることを前提としています。
魅力的な作品です!あなたの例とhttp://jp.pocoo.org/docs/dev/templates/#builtin-filtersにあるドキュメントを読むまで、 'map'がどのように動作することになっていたのか、私はかなり分かりませんでした。また、 'list'アドバイスのために+1してください。 – amacleod
私は複数の場所でIPの配列を使用しているので、私は 'set_fact:ec2_ips = {{ec2.results |マップ(属性= "インスタンス")|マップ( "最初")|マップ(attribute = "private_ip")|リスト}} '。 – amacleod