2016-12-13 12 views
2

У меня возникли проблемы с добавлением дополнительных маршрутов к вновь созданной таблице маршрутов VPC по умолчанию в сценарии NAT с использованием Ansible и модуля ec2_vpc_route_table. Соответствующие выдержки из моей Playbook являются ...Как добавить маршруты в таблицу по умолчанию/основной маршрут VPC с помощью Ansible ec2_vpc_route_table?

Создание 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, анзибль выдает следующее сообщение об ошибке ...

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>"} 

Эта ошибка делает это звучит как, dispite тот факт, что я явно обеспечивая route_table_id, и lookup: id, что он не обновляет существующую таблицу, но в основном воссоздает ее, пытаясь удалить исходный код (который является таблицей маршрутов main).

Как добавить дополнительные маршруты к существующей таблице маршрутов main?

До сих пор единственным обходным решением, которое я смог использовать, является вызов EC2 CLI с помощью метода command: ..., но это, очевидно, не идеально.

Мы на Ansible 2.3.0 (devel 14a2757116)

Любая помощь будет принята с благодарностью!

+0

В исходном коде есть некоторые [примечания] (https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/cloud/amazon/ec2_vpc.py#L585), в которых указано, что _boto может Пока не устанавливаем основную таблицу. Не уверен, что он все еще действительный оператор. –

+0

@ KonstantinSuvorov Спасибо, что указали, что это немного объясняет. Проблема в том, что я на самом деле не пытаюсь ее удалить, я пытаюсь добавить к ней, но, похоже, поведение заключается в удалении и перестройке. – oucil

ответ

1

От http://docs.ansible.com/ansible/ec2_vpc_route_table_module.html#options

Посмотрите таблицу маршрутов, либо путем тегов или маршрутным ИД таблицы. Неисключительный поиск тегов не удастся. Если теги не указаны, то поиск существующей таблицы маршрутов не выполняется, и будет создана новая таблица маршрутов. Чтобы изменить теги таблицы маршрутов или удалить таблицу маршрутов, вы должны искать по id.

Попробуйте lookup: tag вместо lookup: id. Это должно сработать.

0

Мне удалось обновить таблицу основных маршрутов, просмотрев ее, а затем используя 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 }}" 

Примечания: Вам нужно отключить очищение подсетей в противном случае вы получите сообщение об ошибке, когда анзибль пытается удалить ассоциацию подсети по умолчанию из главного route_table.