我在使用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_id
和lookup: id
的事实,它没有更新现有的表,但它基本上是重新创建它,试图删除原始(过程中的main
路由表)。
如何将其他路线附加到现有的main
路线表?
到目前为止,我能够使用的唯一解决方法是通过command: ...
方法调用EC2 CLI,但这显然不太理想。
我们正在Ansible 2.3.0 (devel 14a2757116)
非常感谢任何帮助!
答案 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尝试从主路由表中删除默认子网关联时,您将收到错误。