教程:使用 Ansible 配置 Azure 路由表
重要
运行本文中的示例 playbook 需要 Ansible 2.8(或更高版本)。
Azure 自动在 Azure 子网、虚拟网络与本地网络之间路由流量。 如果需要提高对环境路由的控制,则可创建路由表。
在本文中,学习如何:
创建路由表 创建虚拟网络和子网 将路由表与子网关联 从子网中取消关联路由表 创建和删除路由 查询路由表 删除路由表
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
安装 Ansible - 执行以下任一选项:
- 在 Linux 虚拟机上安装和配置 Ansible
- 配置 Azure Cloud Shell,另外,如果无法访问 Linux 虚拟机,请使用 Ansible 创建虚拟机。
创建路由表
本部分中的 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