如何使用Ansible ec2_vpc_route_table将路由添加到VPC的默认/主路由表?

时间:2016-12-13 21:00:29

标签: amazon-ec2 routing ansible ansible-playbook ansible-2.x

我在使用Ansible和ec2_vpc_route_table模块在NAT场景中向新创建的VPC默认路由表添加其他路由时遇到了麻烦。我的Playbook的相关摘录是......

制作VPC

- name: Create Production VPC
  ec2_vpc:
    region: "{{ aws.region }}"
    aws_access_key: "{{ aws.access_key }}"
    aws_secret_key: "{{ aws.secret_key }}"
    state: present
    cidr_block: 10.0.0.0/16
    resource_tags: { "Name":"Production" }
    internet_gateway: yes
    dns_hostnames: yes
    dns_support: yes
    subnets: 
      - cidr: 10.0.10.0/24
        resource_tags: { "Name":"A - NAT" }
      - cidr: 10.0.20.0/24
        resource_tags: { "Name":"B - Public" }
      - cidr: 10.0.30.0/24
        resource_tags: { "Name":"C - Private" }
    wait: yes
  register: prod_vpc

收集事实并添加新路线

- name: Gather default Route Table facts
  ec2_vpc_route_table_facts:
    region: "{{ aws.region }}"
    filters:
      vpc-id: "{{ prod_vpc.vpc.id }}"
  register: vpc_default_route

- name: Add NAT routes
  ec2_vpc_route_table:
    aws_access_key: "{{ aws.access_key }}"
    aws_secret_key: "{{ aws.secret_key }}"
    vpc_id: "{{ prod_vpc.vpc.id }}"
    region: "{{ aws.region }}"
    route_table_id: "{{ vpc_default_route.route_tables[0].id }}"
    lookup: id
    tags:
      Name: NAT
    subnets: 
      - '10.0.10.0/24'
    routes:
      - dest: 0.0.0.0/0
        gateway_id: igw

首先,我尝试在ec2_vpc任务中包含路由的创建,但实际上最终创建了第二个路由表而不是在默认表中包含路由。

首先,为什么会创建第二个表而不是将路由添加到默认值?

因为在vpc创建中包含它不起作用我回过头来看,它只是标识默认值,或main路由表。现在的问题是,当我尝试使用ec2_vpc_route_table添加NAT路由时,Ansible失败并出现以下错误...

fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Unable to associate subnets for route table RouteTable:rtb-..., error: EC2ResponseError: 400 Bad Request\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response><Errors><Error><Code>InvalidParameterValue</Code><Message>cannot disassociate the main route table association rtbassoc-...</Message></Error></Errors><RequestID>...</RequestID></Response>"}

这个错误听起来像是,我明确提供了route_table_idlookup: id的事实,它没有更新现有的表,但它基本上是重新创建它,试图删除原始(过程中的main路由表)。

如何将其他路线附加到现有的main路线表?

到目前为止,我能够使用的唯一解决方法是通过command: ...方法调用EC2 CLI,但这显然不太理想。

我们正在Ansible 2.3.0 (devel 14a2757116)

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

来自http://docs.ansible.com/ansible/ec2_vpc_route_table_module.html#options

  

通过标签或路由表ID查找路由表。非唯一标记查找将失败。 如果未指定任何标记,则不会执行现有路由表的查找,并且将创建新的路由表。要更改路由表的标记或删除路由表,必须按id查找

尝试使用lookup: tag代替lookup: id。 这应该有用。

答案 1 :(得分:2)

我设法通过查找主路由表来更新主路由表,然后使用route_table_id进行修改。

- name: Lookup VPC facts
  ec2_vpc_net_facts:
    region: "{{ region }}"
    filters:
      "tag:Name": "{{ vpc_name }}"
  register: vpc_group

- name: Create vgw 
  ec2_vpc_vgw:
    region: "{{ region }}"
    vpc_id: "{{ vpc_group.vpcs[0].id }}"
    name: "{{ vpc_name }}"
    type: ipsec.1
    state: present
    validate_certs: no
  register: vpc_vgw

- name: Create igw 
  ec2_vpc_igw:
    region: "{{ region }}"
    vpc_id: "{{ vpc_group.vpcs[0].id }}"
    state: present
    validate_certs: no
  register: igw 

- name: Lookup route tables
  ec2_vpc_route_table_facts:
    region: "{{ region }}"
    filters:
      vpc-id: "{{ vpc_group.vpcs[0].id }}"
  register: vpc_route_tables

- name: Setup route tables
  ec2_vpc_route_table:
    region: "{{ region }}"
    vpc_id: "{{ vpc_group.vpcs[0].id }}"
    lookup: id
    purge_subnets: false
    route_table_id: "{{ vpc_route_tables.route_tables[0].id }}"
    subnets: "{{ subnet_ids }}"
    routes:
      - dest: 10.0.0.0/8
        gateway_id: "{{ vpc_vgw.vgw.id }}"
      - dest: 0.0.0.0/0
        gateway_id: "{{ igw.gateway_id }}"

注意:您需要禁用清除子网,否则当ansible尝试从主路由表中删除默认子网关联时,您将收到错误。