重要
需要 Ansible 2.8(或更高版本)才能运行本文中示例的 playbooks。
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 }}"
运行 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