我可以在Ansible游戏中使用Jinja2`map`过滤器从一组对象中获取值吗?

ama*_*eod 8 jinja2 ansible

我有一个用于创建一些EC2实例的剧本,然后用它们做一些事情.相关部分大致如下:

- 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 }}'
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作,但我对item.instances[0].private_ip表达式并不特别满意,部分原因是它在播放摘要中显示了非常大的对象.我希望这with_items部分只是一个IP地址数组,而不是一个包含对象数组的对象数组.在Python中,我会做类似的事情:

ips = [r['instances'][0]['private_ip'] for r in ec2['results']]
Run Code Online (Sandbox Code Playgroud)

然后我将with_items: '{{ ips }}'在第二个任务中使用.

有没有办法在播放的YAML中使用J2过滤器做同样的事情?似乎http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containers可能会有所帮助,但我认为这预示着我有一系列键/索引/无论如何.

Kon*_*rov 12

地图过滤你的朋友在这里.

像这样的东西:

with_items: "{{ ec2.results | map(attribute='instances') | map('first') | map(attribute='private_ip') | list }}"
Run Code Online (Sandbox Code Playgroud)

上面的代码未经过测试.
您可能想先尝试debug并逐渐添加maps以获得所需的结果.
不要忘记| list最后让你的地图可读.