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

重要

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

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

运行 playbook 使用 ansible-playbook

ansible-playbook route_table_create.yml

将路由表关联到子网

本节中的操作手册代码:

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

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

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

子网和路由表具有一对多关系。 可以使用没有关联的路由表或一个路由表来定义子网。 路由表可以与无、一个或多个子网相关联。

来自子网的流量根据以下情况进行路由:

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

虚拟网络必须连接到 Azure 虚拟网络网关。 使用 BGP 的情况下,网关可以是 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 }}"

运行 playbook 使用 ansible-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"

运行 playbook 使用 ansible-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. 不能在路由表中复制前缀。

运行 playbook 使用 ansible-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

运行 playbook 使用 ansible-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]

运行 playbook 使用 ansible-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

运行 playbook 使用 ansible-playbook

ansible-playbook route_table_delete.yml

后续步骤