通过ec2_instance_facts结果的Ansible循环-差异输出调试与set_fact

时间:2019-03-25 20:02:07

标签: loops ansible

在调试与set_fact中使用相同的方法得到的输出不同。

      - name: Get EC2 instances
        ec2_instance_facts:
          filters:
            "tag:Name": "{{ item }}"
        loop:
          - value
          - value
        register: servers

      - debug:
          msg: "{{ item.instances | map(attribute='private_ip_address') | list }}"
        loop:  "{{ servers.results }}"

      - name: Set the private IPs list
        set_fact:
          private_ips: "{{ item.instances | map(attribute='private_ip_address') | list }}"
        loop: "{{ servers.results }}"

      - debug:
          var: private_ips

在初始ec2_instance_facts循环中,输出6个实例。在获取专用IP的调试循环期间,所有6个IP均被输出,尽管在2个单独的块中(我猜是从初始循环开始-在第一个块中输出2个,然后输出其余4个)。

但是,当使用set_fact时,我只能获得前2个IP。我想我正在使它变得比原来更困难,并且必须正确地使用第一个循环,但是我被卡住了。

1 个答案:

答案 0 :(得分:0)

我认为可以将其关闭。我发现this answer是直接从this PR中提取的。由于提交的代码在Ansible 2.x中不再起作用,因此PR最终被关闭,并且解决方法(在答案中发布)被接受。

为清楚起见,答案基本上是,如果您使用循环运行set_fact,则需要将该事实传递给后续 set_fact,然后根据先前设置的事实创建一个列表,并通过通过map jinja过滤器。

由于我的初始循环运行了2x,因此我现在有2个列表,但这是另一回事。