首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以在Ansible play中使用Jinja2 `map` filter从对象数组中获取值?

是否可以在Ansible play中使用Jinja2 `map` filter从对象数组中获取值?
EN

Stack Overflow用户
提问于 2016-12-22 23:08:14
回答 1查看 27.4K关注 0票数 15

我有一个实战手册,可以创建一些EC2实例,然后使用它们做一些事情。相关片段大致如下:

代码语言:javascript
复制
- 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 }}'

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

代码语言:javascript
复制
ips = [r['instances'][0]['private_ip'] for r in ec2['results']]

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

有没有一种方法可以在该剧的YAML中使用J2过滤器来做同样的事情?看起来http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containers可能会有帮助,但我认为前提条件是我有一组键/索引/任何东西。

EN

回答 1

Stack Overflow用户

发布于 2018-07-04 05:26:55

我的示例取自我的剧本,删除一个自动伸缩的ecs集群。我修改了上面的答案,让我的答案正常工作。

代码语言:javascript
复制
- name: get list of instances in ASG
  ec2_instance_facts:
    filters:
      "tag:aws:autoscaling:groupName": "{{item.name}}-{{stack}}-scalinggroup"
  register: asg_host_list

- name: list ecs info
  debug:
    msg: "{{asg_host_list}}"

- name: get just hosts id's
  set_fact:
    hostlist: "{{ asg_host_list.instances | map(attribute='instance_id') | list }}"

对于我的用途,主机列表可以直接提供给ecs_instance,因为它需要一个实例ids列表来处理。

因此,这是经过测试的,并且工作正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41286160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档