Amazon web services 如何让ansible playbook收集所需的AWS EC2信息并正确地包装到文本输出文件中?

Amazon web services 如何让ansible playbook收集所需的AWS EC2信息并正确地包装到文本输出文件中?,amazon-web-services,amazon-ec2,ansible-2.x,Amazon Web Services,Amazon Ec2,Ansible 2.x,我有一本ansible的剧本,基本上已经写好了,包括输出到一个文件。我想从EC2环境中收集几个字段(只需标记:Name;Public-IP,Private-IP)。我有两个小问题,我似乎无法解决,与输出有关 为什么我的调试消息列表收集服务器名称而不是所有的公共和私有IP 如何在各自的公用和专用IP上获得每个名称 我已经找到了各种各样的片段和示例,并将它们结合起来,创建了一个非常基本的入门剧本,稍后我将对其进行扩展 这是我的剧本: --- - name: Test ec2 info hosts

我有一本ansible的剧本,基本上已经写好了,包括输出到一个文件。我想从EC2环境中收集几个字段(只需标记:Name;Public-IP,Private-IP)。我有两个小问题,我似乎无法解决,与输出有关

  • 为什么我的调试消息列表收集服务器名称而不是所有的公共和私有IP

  • 如何在各自的公用和专用IP上获得每个名称

  • 我已经找到了各种各样的片段和示例,并将它们结合起来,创建了一个非常基本的入门剧本,稍后我将对其进行扩展

    这是我的剧本:

    ---
    - name: Test ec2 info
      hosts: local
      connection: local
    
      tasks:
        - name: Get EC2 Info
          ec2_instance_info:
            filters:
              "tag:Name": "SERVER0*"
          register: ec2_name
    
        - name: Get instance IP addresses.
          debug:
              msg: "{{ item.0 }} | {{ item.1 }} | {{ item.2 }}"
          with_together:
            - "{{ ec2_name.instances | map(attribute='tags.Name') | list }}"
            - "{{ ec2_name.instances[0].public_ip_address }}"
            - "{{ ec2_name.instances[0].private_ip_address }}"
    
        - name: Gather and Save Instance Info
          set_fact:
             Tag_Name: "{{ ec2_name.instances | map(attribute='tags.Name') | list }}"
             Pub_IP: "{{ ec2_name.instances[0].public_ip_address }}"
             Pvt_IP: "{{ ec2_name.instances[0].private_ip_address }}"
    
        - local_action:
            copy content="{{ Tag_Name }} | {{ Pub_IP }} | {{ Pvt_IP }}" dest=ec2iptest.txt
    
    以下是屏幕上的调试输出:

    TASK [Get only running instance IP addresses.] *********************************
    ok: [localhost] => (item=['SERVER01', 'xx.xx.xx.xx', '10.1.0.10']) => {
        "msg": "SERVER01 | xx.xx.xx.xx | 10.1.0.10"
    }
    ok: [localhost] => (item=['SERVER02', None, None]) => {
        "msg": "SERVER02 |  | "
    }
    ok: [localhost] => (item=['SERVER03', None, None]) => {
        "msg": "SERVER03 |  | "
    }
    ok: [localhost] => (item=['SERVER04', None, None]) => {
        "msg": "SERVER04 |  | "
    }
    
    TASK [Gather and Save Instance Info] *******************************************
    ok: [localhost]
    
    TASK [copy] ********************************************************************
    changed: [localhost -> localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=1
    
    下面是文本文件的输出:

    ['SERVER01', 'SERVER02', 'SERVER03', 'SERVER04'] | xx.xx.xx.xx | 10.1.0.10
    
    它将所有服务器标记名放在括号中的一行,只提供一个公共IP和一个私有IP

    我希望文本文件的输出(带有管道分隔符)为:

    任何正确收集和包装的帮助都会很好


    谢谢。

    我想您需要的是:

    Pub_IP: "{{ ec2_name.instances[0].network_interfaces[0].association.public_ip }}"
    
    Pvt_IP: "{{ ec2_name.instances[0].network_interfaces[0].private_ip_address }}"
    

    谢谢你的回复,但不幸的是,这对我不起作用。添加
    .network\u interfaces[0]
    会导致错误:
    'dict object'没有属性'public\u ip\u address'
    Pub_IP: "{{ ec2_name.instances[0].network_interfaces[0].association.public_ip }}"
    
    Pvt_IP: "{{ ec2_name.instances[0].network_interfaces[0].private_ip_address }}"