教程:使用 Ansible 配置 Azure 路由表

重要

运行本文中的示例 playbook 需要 Ansible 2.8(或更高版本)。

Azure 自动在 Azure 子网、虚拟网络与本地网络之间路由流量。 如果需要提高对环境路由的控制,则可创建路由表

在本文中,学习如何:

创建路由表 创建虚拟网络和子网 将路由表与子网关联 从子网中取消关联路由表 创建和删除路由 查询路由表 删除路由表

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。

创建路由表

本部分中的 playbook 代码将创建一个路由表。 有关路由表限制的信息,请参阅 Azure 限制

将以下 playbook 保存为 route_table_create.yml

- hosts: localhost
  vars:
    route_table_name: myRouteTable
    resource_group: myResourceGroup
  tasks:
    - name: Create a route table
      azure_rm_routetable:
        name: "{{ route_table_name }}"
        resource_group: "{{ resource_group }}"

使用 ansible-playbook 运行 playbook

ansible-playbook route_table_create.yml

将路由表关联到子网

本部分中的 playbook 代码:

  • 创建虚拟网络
  • 在虚拟网络中创建子网
  • 将路由表关联到子网

路由表不是与虚拟网络关联, 而是与虚拟网络的子网关联。

虚拟网络和路由表必须共存于同一 Azure 位置和订阅中。

子网和路由表具有一对多关系。 可使用没有关联的路由表或一个路由表定义子网。 路由表可以与一个或多个子网关联,也可以不与任何子网关联。

来自子网的流量基于以下路径进行路由:

  • 路由表中定义的路由
  • 默认路由
  • 从本地网络传播的路由

虚拟网络必须连接到 Azure 虚拟网络网关。 如果将 BGP 与 VPN 网关一起使用,则网关可为 ExpressRoute 或 VPN。

将以下 playbook 保存为 route_table_associate.yml

- hosts: localhost
  vars:
    subnet_name: mySubnet
    virtual_network_name: myVirtualNetwork 
    route_table_name: myRouteTable
    resource_group: myResourceGroup
  tasks:
    - name: Create virtual network
      azure_rm_virtualnetwork:
        name: "{{ virtual_network_name }}"
        resource_group: "{{ resource_group }}"
        address_prefixes_cidr:
        - 10.1.0.0/16
        - 172.100.0.0/16
        dns_servers:
        - 127.0.0.1
        - 127.0.0.3
    - name: Create a subnet with route table
      azure_rm_subnet:
        name: "{{ subnet_name }}"
        virtual_network_name: "{{ virtual_network_name }}"
        resource_group: "{{ resource_group }}"
        address_prefix_cidr: "10.1.0.0/24"
        route_table: "{{ route_table_name }}"

使用 ansible-playbook 运行 playbook

ansible-playbook route_table_associate.yml

从子网取消关联路由表

本部分中的 playbook 代码将取消路由表与子网的关联。

当取消路由表与子网的关联时,请将子网的 route_table 设置为 None

将以下 playbook 保存为 route_table_dissociate.yml

- hosts: localhost
  vars:
    subnet_name: mySubnet
    virtual_network_name: myVirtualNetwork 
    resource_group: myResourceGroup
  tasks:
    - name: Dissociate a route table
      azure_rm_subnet:
        name: "{{ subnet_name }}"
        virtual_network_name: "{{ virtual_network_name }}"
        resource_group: "{{ resource_group }}"
        address_prefix_cidr: "10.1.0.0/24"

使用 ansible-playbook 运行 playbook

ansible-playbook route_table_dissociate.yml

创建路由

本部分中的 playbook 代码在路由表中路由。

将以下 playbook 保存为 route_create.yml

- hosts: localhost
  vars:
    route_name: myRoute
    route_table_name: myRouteTable
    resource_group: myResourceGroup
  tasks:
    - name: Create route
      azure_rm_route:
        name: "{{ route_name }}"
        resource_group: "{{ resource_group }}"
        next_hop_type: virtual_network_gateway
        address_prefix: "10.1.0.0/16"
        route_table_name: "{{ route_table_name }}"

运行 playbook 之前,请参阅以下说明:

  • virtual_network_gateway 定义为 next_hop_type。 有关 Azure 如何选择路由的详细信息,请参阅路由概述
  • address_prefix 定义为 10.1.0.0/16。 前缀在路由表中不能重复。

使用 ansible-playbook 运行 playbook

ansible-playbook route_create.yml

删除路由

本部分中的 playbook 代码从路由表中删除路由。

将以下 playbook 保存为 route_delete.yml

- hosts: localhost
  vars:
    route_name: myRoute
    route_table_name: myRouteTable
    resource_group: myResourceGroup
  tasks:
    - name: Remove route
      azure_rm_route:
        name: "{{ route_name }}"
        resource_group: "{{ resource_group }}"
        route_table_name: "{{ route_table_name }}"
        state: absent

使用 ansible-playbook 运行 playbook

ansible-playbook route_delete.yml

获取路由表信息

本部分中的 playbook 代码使用 Ansible 模块 azure_rm_routetable_facts 来检索路由表信息。

将以下 playbook 保存为 route_table_facts.yml

- hosts: localhost
  vars:
    route_table_name: myRouteTable
    resource_group: myResourceGroup
  tasks: 
    - name: Get route table information
      azure_rm_routetable_facts:
         resource_group: "{{ resource_group }}"
         name: "{{ route_table_name }}"
      register: query
    
    - debug:
         var: query.route_tables[0]

使用 ansible-playbook 运行 playbook

ansible-playbook route_table_facts.yml

删除路由表

本部分中的 playbook 代码删除路由表。

删除路由表时,会同时删除所有其路由。

如果路由表与子网关联,则无法删除此路由表。 尝试删除路由表之前,请取消路由表与任何子网的关联

将以下 playbook 保存为 route_table_delete.yml

- hosts: localhost
  vars:
    route_table_name: myRouteTable
    resource_group: myResourceGroup
  tasks:
    - name: Create a route table
      azure_rm_routetable:
        name: "{{ route_table_name }}"
        resource_group: "{{ resource_group }}"
        state: absent

使用 ansible-playbook 运行 playbook

ansible-playbook route_table_delete.yml

后续步骤