首页 > 解决方案 > 如何让我的 ansible playbook 收集所需的 AWS EC2 信息并正确包装在文本输出文件中?

问题描述

我有一个几乎写出来的 ansible playbook,包括输出到文件。我有几个我想从我的 EC2 环境中收集的字段(简单的标签:名称;公共 IP,私有 IP)。我有两个与输出有关的小问题,我似乎无法弄清楚。

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

  2. 如何使用各自的公共和私有 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。

我想要的文本文件输出(带有管道分隔符)是:

SERVER_NAME01 | PublicIP | PrivateIP
SERVER_NAME02 | PublicIP | PrivateIP
SERVER_NAME03 | PublicIP | PrivateIP
...

任何有关正确收集和换行的帮助都会很棒。

谢谢你。

标签: amazon-web-servicesamazon-ec2ansible-2.x

解决方案


注册:信息

Pub_IP: "info['instances'][0]['public_ip_address']"
Pvt_IP: "info['instances'][0]['private_ip_address']"

推荐阅读