深入探讨网络自动化中的 VLAN 资源模块
深入探讨网络自动化中的 VLAN 资源模块
2019 年 10 月,作为 Red Hat Ansible Engine 2.9 的一部分,Ansible 网络自动化团队引入了资源模块的概念。这些有明确观点的网络模块使网络自动化更容易,并且对于在生产环境中自动化各种网络平台的人员来说更加一致。资源模块的目标是避免为渲染网络配置创建过于复杂的 Jinja2 模板。这篇博文将介绍适用于 Arista EOS 网络平台的 eos_vlans 模块。我将逐步介绍几个示例,并描述每个状态参数的用例以及我们设想如何在现实场景中使用它们。
在开始之前,让我们快速解释一下网络资源模块命名背后的原理。请注意,对于配置 VLAN 的资源模块,存在单数形式(eos_vlan、ios_vlan、junos_vlan 等)和复数形式(eos_vlans、ios_vlans、junos_vlans)。新的资源模块是我们今天要介绍的复数形式。我们已弃用单数形式。这样做是为了防止使用现有网络模块的用户 Ansible playbook 停止工作,并有足够的时间迁移到新的网络自动化模块。
VLAN 示例
让我们从 eos_vlans 资源模块的示例开始
--- - name: add vlans hosts: arista gather_facts: false tasks: - name: add VLAN configuration eos_vlans: config: - name: desktops vlan_id: 20 - name: servers vlan_id: 30 - name: printers vlan_id: 40 - name: DMZ vlan_id: 50
有一个隐含的状态参数,默认为 merged(即 state: merged)。如果我们运行此 Ansible playbook,VLAN 20、30、40 和 50 将合并到 arista 组中任何设备的运行配置中。新 Arista 交换机上的 show vlan 输出将如下所示
rtr2#show vlan VLAN Name Status Ports ----- -------------------------------- --------- ------------------------------- 1 default active 20 desktops active 30 servers active 40 printers active 50 DMZ active
而运行配置将如下所示
rtr2#show running-config | s vlan vlan 20 name desktops ! vlan 30 name servers ! vlan 40 name printers ! vlan 50 name DMZ
现在让我们手动更改网络配置
rtr2(config)#vlan 100 rtr2(config-vlan-100)#name artisanal_vlan rtr2(config-vlan-100)#end rtr2#wr Copy completed successfully.
如果我重新运行 Ansible playbook,它将返回 changed=0,因为它只关心 VLAN 20、30、40 和 50。它不会删除 VLAN 100,因为我们默认将状态参数设置为 merged,因此它只会合并其知道的DataModel。它只是在执行我发送的 VLAN 的配置策略。
使用“state”参数
如果我将状态参数更改为 replaced 会发生什么?只需将前面的示例更改为以下内容
--- - name: add vlans hosts: arista gather_facts: false tasks: - name: add VLAN configuration eos_vlans: state: replaced config: - name: desktops vlan_id: 20 - name: servers vlan_id: 30 - name: printers vlan_id: 40 - name: DMZ vlan_id: 50
Ansible playbook 就像以前一样运行,changed=0。我们能判断它是否删除了 artisanal_vlan 100 吗?
rtr2#show vlan VLAN Name Status Ports ----- -------------------------------- --------- ------------------------------- 1 default active 20 desktops active 30 servers active 40 printers active 50 DMZ active 100 artisanal_vlan active
不能!资源模块的目标是更新现有资源以匹配现有数据模型。由于我们的数据模型(表示 VLAN 的键值对,通过 playbook 中的 config 参数传递)仅包含 VLAN 20、30、40 和 50,因此 eos_vlans 模块仅更新与这些特定 VLAN 相关的参数。
为什么我要使用它而不是 merged?merged 和 replaced 之间的主要区别在于,merged 仅确保存在数据模型中表示的命令,而 replaced 参数使您的资源与数据模型匹配。让我们看看 eos_vlans 模块以了解它将哪些内容视为 vlans 资源的一部分。
目前有三个参数用于 vlans 资源
- 名称
- 状态(活动或挂起)
- vlan_id(1-4094 之间的范围)
让我们看下面的例子
发送的数据模型
- name: desktops vlan_id: 20
现有的 Arista 配置
vlan 200 state suspend !
这就是 merged 与 replaced 的比较方式
merged
vlan 200 name desktops state suspend !
replaced
vlan 200 name desktops !
replaced 参数对每个配置的 VLAN 强制执行网络设备上的数据模型。在上面的示例中,它将删除 state suspend
,因为它不在数据模型中。换句话说,replaced 参数知道不应该存在的命令以及应该存在的命令。
使用覆盖的状态参数
如果我将状态参数更改为 overridden 会发生什么?只需将原始示例更改为以下内容
--- - name: add vlans hosts: arista gather_facts: false tasks: - name: add VLAN configuration eos_vlans: state: overridden config: - name: desktops vlan_id: 20 - name: servers vlan_id: 30 - name: printers vlan_id: 40 - name: DMZ vlan_id: 50
现在运行 Ansible playbook
Ansible playbook 现在 changed=1。但是它是否删除了 artisanal_vlan 100?
登录到其中一台 Arista 设备可以确认确实删除了!
rtr2#show vlan VLAN Name Status Ports ----- -------------------------------- --------- ------------------------------- 1 default active 20 desktops active 30 servers active 40 printers active 50 DMZ active
overridden 参数将所有 vlans 资源强制执行到数据模型。这意味着它会删除数据模型中未定义的 VLAN。
要点
目前有三种方法可以使用资源模块推送配置。这些是 merged、replaced 和 overridden 参数。这些允许网络工程师以增量步骤采用自动化,从而具有更大的灵活性。我们意识到,大多数用户在熟悉新的资源模块概念时会从 merged 参数开始。随着时间的推移,组织将转向 overridden 参数,因为它们会在其数据模型驻留的任何位置采用标准的 SoT(真相来源)。