Ansible:为ENI中的每个新的辅助私有IP分配多个EIP

时间:2017-09-27 09:42:03

标签: amazon-web-services amazon-ec2 ansible

今天我正在尝试将多个弹性IP分配给多个不同的私有IP地址。

注意:IP地址是假的,我写这些是为了让你明白我想做什么。

这是我迄今取得的成就:

Server 1

  Elastic Network Interface
    Private IP 172.x.x.1 (public IP: 55.x.x.1)
    Secondary Private IP 
      172.x.x.2 (public IP: NONE SET)
      172.x.x.3 (public IP: NONE SET)

Server 2

  Elastic Network Interface
    Private IP 174.x.x.1 (public IP: 57.x.x.1)
    Secondary Private IP 
      174.x.x.2 (public IP: NONE SET)
      174.x.x.3 (public IP: NONE SET)

这就是我想要实现的目标:

Server 1

  Elastic Network Interface
    Private IP 172.x.x.1 (public IP: 55.x.x.1)
    Secondary Private IP 
      172.x.x.2 (public IP: 55.x.x.2)
      172.x.x.3 (public IP: 55.x.x.3)

Server 2

  Elastic Network Interface
    Private IP 174.x.x.1 (public IP: 57.x.x.1)
    Secondary Private IP 
      174.x.x.2 (public IP: 57.x.x.2)
      174.x.x.3 (public IP: 57.x.x.3)

这是我到目前为止写的Ansible剧本:

{{ platform }}是通过CLI传递的额外var。

- name: Provision a set of Edge instances
  ec2:
     key_name: ec2user
     group: "launch-wizard-1"
     instance_type: "m4.2xlarge"
     image: "ami-xxxxxxx"
     region: "eu-west-1"
     wait: true
     exact_count: 2
     count_tag:
        PlatformName: "{{ platform }}"
        Role: Edge
     instance_tags:
        Name: "{{ platform }}::Edge"
        PlatformName: "{{ platform }}"
        Role: Edge
        LongName: "Edge server for {{ platform }}'s platform"
        Groups: common,server,rabbitmq,memcache,stats,cache-manager,media,content,icecast
  register: edge_ec2

- name: Find ENIs created for Edge instances
  ec2_eni_facts:
    region: "eu-west-1"
    filters:
      attachment.instance-id: "{{ item }}"
  with_items: "{{ edge_ec2.instance_ids }}"  
  register: edge_enis

- name: Adds an additional private IP to the Edge ENIs
  ec2_eni:
    region: "eu-west-1"
    eni_id: "{{ item.interfaces[0].id }}"
    subnet_id: "{{ item.interfaces[0].subnet_id }}"
    state: present
    secondary_private_ip_address_count: 2
  register: created_ips
  with_items: "{{ edge_enis.results }}"

- name: Adds additional elastic IPs to the Edge ENIs
  ec2_eip:
    device_id: "{{ item.0.interface.attachment.instance_id }}"
    region: "eu-west-1"
    private_ip_address: "{{ item.1.private_ip_address }}"
    in_vpc: true
  register: eips
  with_subelements: 
    - "{{ created_ips.results }}"
    - interface.private_ip_addresses

为什么不将新分配的弹性IP分配给辅助私有IP,而只分配给主要IP,即使我明确指示将其分配给辅助私有IP?

1 个答案:

答案 0 :(得分:0)

我不知道为什么Ansible ec2_eip模块无法创建新的弹性IP并将其分配给指定的辅助私有IP地址,但我确实发现了一种解决方法。

我遇到了同样的问题 - 在我看来private_ip_address选项被忽略了。这是我的代码片段无效:

- name: try to create an EIP and associate it in one pass
  ec2_eip:
    device_id: "{{ item.network_interfaces[0].network_interface_id }}"
    private_ip_address: "{{ item.network_interfaces[0].private_ip_addresses[1].private_ip_address }}"
    region: ap-southeast-2
    in_vpc: true 
  with_items: "{{ servers.results[0].instances }}"

我的解决方法是预先创建弹性IP,然后在单独的任务中将它们与私有IP相关联。

- name: "allocate a new elastic IP for each server without associating it with anything"
  ec2_eip:
    state: 'present'
    region: ap-southeast-2
  register: eip2
  with_items: "{{ servers.results[0].instances }}" 

- name: Associate elastic IPs with the first interface attached to each instance
  ec2_eip:
    public_ip: "{{ eip2.results[item.0].public_ip }}"
    device_id: "{{ item.1.network_interfaces[0].network_interface_id }}"
    private_ip_address: "{{ item.1.network_interfaces[0].private_ip_addresses[1].private_ip_address }}"
    region: ap-southeast-2
    in_vpc: true 
  with_indexed_items: "{{ servers.results[0].instances }}"

我的主要发现是,如果您提供public_ip,则private_ip_address选项开始被识别。