У меня есть VPC с некоторыми маршрутами и подсетями. Я хочу получить доступ к нему для работы, но не вижу способа связать подсеть с идентификатором таблицы маршрутов. Я использовал модули ec2_vpc_route_table_facts, ec2_vpc_subnet_facts и ec2_vpc_net_facts, но, если я чего-то не упускаю, ни один из них не сообщает мне, какая подсеть связана с какой таблицей маршрутов.
TASK [ec2_vpc_route_table_facts] ***********************************************
ok: [localhost]
TASK [display routes] **********************************************************
ok: [localhost] => {
"msg": {
"changed": false,
"route_tables": [
{
"id": "rtb-83fd25e7",
"routes": [
{
"destination_cidr_block": "172.31.0.0/16",
"gateway_id": "local",
"instance_id": null,
"interface_id": null,
"origin": "CreateRouteTable",
"state": "active",
"vpc_peering_connection_id": null
},
{
"destination_cidr_block": "0.0.0.0/0",
"gateway_id": "igw-6f792c0a",
"instance_id": null,
"interface_id": null,
"origin": "CreateRoute",
"state": "active",
"vpc_peering_connection_id": null
}
],
"tags": {},
"vpc_id": "vpc-e749a683"
},
{
"id": "rtb-abf02bcf",
"routes": [
{
"destination_cidr_block": "172.31.0.0/16",
"gateway_id": "local",
"instance_id": null,
"interface_id": null,
"origin": "CreateRouteTable",
"state": "active",
"vpc_peering_connection_id": null
}
],
"tags": {},
"vpc_id": "vpc-e749a683"
}
]
}
}
TASK [ec2_vpc_subnet_facts] ****************************************************
ok: [localhost]
TASK [display subnets] *********************************************************
ok: [localhost] => {
"msg": {
"changed": false,
"subnets": [
{
"availability_zone": "eu-west-1b",
"available_ip_address_count": 4091,
"cidr_block": "172.31.16.0/20",
"default_for_az": "true",
"id": "subnet-3ac33c4c",
"map_public_ip_on_launch": "true",
"state": "available",
"tags": {},
"vpc_id": "vpc-e749a683"
},
{
"availability_zone": "eu-west-1c",
"available_ip_address_count": 4091,
"cidr_block": "172.31.32.0/20",
"default_for_az": "true",
"id": "subnet-4efbef17",
"map_public_ip_on_launch": "true",
"state": "available",
"tags": {},
"vpc_id": "vpc-e749a683"
},
{
"availability_zone": "eu-west-1a",
"available_ip_address_count": 4091,
"cidr_block": "172.31.0.0/20",
"default_for_az": "true",
"id": "subnet-9a3deafe",
"map_public_ip_on_launch": "true",
"state": "available",
"tags": {},
"vpc_id": "vpc-e749a683"
}
]
}
}
Единственный способ, которым я могу добиться этой работы, - это включить в маршрут теги с разумным значением (например, идентификатором подсети). Но для этого все равно нужно, чтобы кто-то вручную обновлял его, нет способа автоматизировать это из Ansible, не так ли?
Я думаю, что в этой ситуации вам может помочь хорошо расположенный плагин фильтра. Например, если вам известен идентификатор таблицы маршрутов, вы можете написать простую функцию Python для получения списка идентификаторов subnet_id, связанных с идентификатором таблицы маршрутов. Вы поместите этот фильтр в корень вашего доступного каталога.
Пример ниже .... filter_plugins / example.py
def get_all_subnet_ids_in_route_table(route_table_id, region=None):
"""
Args:
route_table_id (str): The route table id you are retrieving subnets for.
Kwargs:
region (str): The aws region in which the route table exists.
Basic Usage:
>>> get_all_subnet_ids_in_route_table("rtb-1234567", "us-west-2")
['subnet-1234567', 'subnet-7654321']
Returns:
List of subnet ids
"""
subnet_ids = list()
client = boto3.client('ec2', region_name=region)
params = {
'RouteTableIds': [route_table_id]
}
routes = client.describe_route_tables(**params)
if routes:
for route in routes['RouteTables']:
for association in route['Associations']:
if association.get('SubnetId', None):
subnet_ids.append(association['SubnetId'])
return subnet_ids
else:
raise errors.AnsibleFilterError(
"No subnets were found for {0}".format(route_table_id)
)
class FilterModule(object):
''' Ansible core jinja2 filters '''
def filters(self):
return {
'get_all_subnet_ids_in_route_table': get_all_subnet_ids_in_route_table
}
Если вы хотите использовать этот фильтр, это будет так же просто, как сделать следующее.
route_table_id: rtb-1234567
aws_region: eu-west-1
subnet_ids_for_example_rt: "{{ route_table_id | get_all_subnet_ids_in_route_table(aws_region) }}"
Похоже, это исправлено в Ansible 2.3 (https://github.com/ansible/ansible/commit/90002e06ae0ab255d71e6976d7e5d23e93850cd3).
Теперь, когда ты звонишь ec2_vpc_route_table_facts
, в дополнение к routes
список, каждая возвращенная таблица маршрутов также имеет associations
список, который содержит любые связанные subnet_id (s)
{
"associations": [
{
"id": "rtbassoc-02cf4c00",
"main": false,
"route_table_id": "rtb-7051d400",
"subnet_id": "subnet-3099da00"
}
],
"id": "rtb-7051d400",
"routes": [
{
"destination_cidr_block": "52.123.123.123/32",
"gateway_id": "igw-96298400",
"instance_id": null,
"interface_id": null,
"state": "active",
"vpc_peering_connection_id": null
},
{
"destination_cidr_block": "52.123.123.124/32",
"gateway_id": "igw-96298400",
"instance_id": null,
"interface_id": null,
"state": "active",
"vpc_peering_connection_id": null
},
{
"destination_cidr_block": "10.69.123.0/24",
"gateway_id": "local",
"instance_id": null,
"interface_id": null,
"state": "active",
"vpc_peering_connection_id": null
}
],
"tags": {
"Name": "test-gmd-b-routes"
},
"vpc_id": "vpc-c5439a00"
}