网络自动化。 一个生活中的案例

嘿哈布尔!

在本文中,我们想讨论网络基础设施的自动化。 将展示一家小型但非常自豪的公司运营的网络工作图。 所有与真实网络设备的匹配都是随机的。 我们将看一下该网络中发生的一个案例,该案例可能导致企业长期关闭并造成严重的财务损失。 该案例的解决方案非常符合“网络基础设施自动化”的概念。 使用自动化工具,我们将向您展示如何在短时间内有效地解决复杂的问题,并且我们将反思为什么应该以这种方式解决这些问题,而不是其他方式(通过控制台)。

免责声明

我们的主要自动化工具是 Ansible(作为自动化工具)和 Git(作为 Ansible playbook 的存储库)。 我想立即保留这不是一篇介绍性文章,我们在其中讨论 Ansible 或 Git 的逻辑,并解释基本的东西(例如,什么是 RoleTaskiModules、Inventory 文件、Ansible 中的变量,或者当您输入 git push 或 git commit 命令)。 这个故事不是关于如何练习 Ansible 以及如何在设备上配置 NTP 或 SMTP。 这是一个关于如何快速、更好地解决网络问题而不会出现错误的故事。 还建议充分了解网络的工作原理,特别是 TCP/IP、OSPF、BGP 协议栈是什么。 我们还将把 Ansible 和 Git 的选择排除在外。 如果您仍然需要选择特定的解决方案,我们强烈建议您阅读《网络可编程性和自动化》一书。 Jason Edelman、Scott S. Lowe 和 Matt Oswalt 撰写的《下一代网络工程师的技能》。

现在到了这一点。

制定问题

让我们想象一个情况:凌晨3点,你正在熟睡,正在做梦。 电话。 技术总监致电:

- 是吗?
— ###、####、#####,防火墙集群已倒下,不再上升!!!
你揉揉眼睛,试图理解正在发生的事情,并想象这是如何发生的。 电话里你可以听到主任的头发在撕裂,他要求回电,因为将军正在二线给他打电话。

半小时后,你收集了值班的第一张介绍性笔记,叫醒了所有可以叫醒的人。 结果,技术总监并没有说谎,一切都如常,防火墙主簇已经倒塌,基本的身体动作都没有让他回过神来。 该公司提供的所有服务均无效。

选择一个适合你口味的问题,每个人都会记住不同的东西。 例如,在没有重负载的情况下进行了一整夜的更新后,一切都很顺利,每个人都高兴地睡觉了。 由于网卡驱动程序中的错误,流量开始流动,接口缓冲区开始溢出。

成龙可以很好地描述当时的情况。

网络自动化。 一个生活中的案例

谢谢你,杰基。

情况不太愉快,不是吗?

让我们的网络兄弟暂时离开他悲伤的想法吧。

让我们讨论一下事件将如何进一步发展。

我们建议按照以下材料呈现顺序

  1. 让我们看一下网络图,看看它是如何工作的;
  2. 我们将描述如何使用 Ansible 将设置从一台路由器传输到另一台路由器;
  3. 我们来谈谈整个 IT 基础设施的自动化。

组网图及说明

方案

网络自动化。 一个生活中的案例

让我们考虑一下我们组织的逻辑图。 我们不会透露具体设备制造商的名称;就本文而言,这并不重要 (细心的读者一定会猜到用的是什么设备)。 这只是使用 Ansible 的好处之一;在设置时,我们通常不关心它是什么类型的设备。 请注意,这是来自知名供应商的设备,例如 Cisco、Juniper、Check Point、Fortinet、Palo Alto...您可以替换您自己的选项。

我们有两个主要任务来移动流量:

  1. 确保我们的服务得到公开,这是公司的业务;
  2. 提供与分支机构、远程数据中心和第三方组织(合作伙伴和客户)的通信,以及分支机构通过中心办公室访问互联网。

让我们从基本要素开始:

  1. 两个边界路由器(BRD-01、BRD-02);
  2. 防火墙集群(FW-CLUSTER);
  3. 核心交换机(L3-CORE);
  4. 一个将成为生命线的路由器(当我们解决问题时,我们会将网络设置从FW-CLUSTER转移到EMERGENCY)(EMERGENCY);
  5. 用于网络基础设施管理的交换机(L2-MGMT);
  6. 带有 Git 和 Ansible 的虚拟机 (VM-AUTOMATION);
  7. 一台笔记本电脑,用于测试和开发 Ansible 的剧本(笔记本电脑自动化)。

网络配置有动态 OSPF 路由协议,具有以下区域:

  • 区域 0 – 包括负责在 EXCHANGE 区域中传输流量的路由器的区域;
  • 区域 1 – 包括负责公司服务运行的路由器的区域;
  • 区域 2 – 包括负责路由管理流量的路由器的区域;
  • N 区 – 分支网络区域。

在边界路由器上,创建一个虚拟路由器(VRF-INTERNET),在该路由器上安装eBGP全视图以及相应分配的AS。 iBGP 在 VRF 之间配置。 该公司拥有一个在这些 VRF-INTERNET 上发布的白色地址池。 其中一些白色地址直接路由到FW-CLUSTER(公司服务运行的地址),一些通过EXCHANGE区域路由(需要外部IP地址的公司内部服务,以及办公室的外部NAT地址)。 接下来,流量进入在 L3-CORE 上创建的具有白色和灰色地址(安全区域)的虚拟路由器。

管理网络使用专用交换机并代表物理专用网络。 管理网络也分为安全区域。
紧急路由器在物理上和逻辑上复制FW-CLUSTER。 除那些查看管理网络的接口外,其上的所有接口均被禁用。

自动化及其描述

我们弄清楚了网络是如何工作的。 现在让我们一步步看看如何将流量从 FW-CLUSTER 转移到 EMERGENCY:

  1. 我们禁用核心交换机(L3-CORE)上连接到FW-CLUSTER的接口;
  2. 我们禁用 L2-MGMT 内核交换机上将其连接到 FW-CLUSTER 的接口;
  3. 我们配置紧急路由器(默认情况下,除与 L2-MGMT 相关的接口外,所有接口均被禁用):

  • 我们在紧急情况下启用接口;
  • 我们配置 FW 集群上的外部 IP 地址(用于 NAT);
  • 我们生成 gARP 请求,以便将 L3-CORE arp 表中的 poppy 地址从 FW-Cluster 更改为 EMERGENCY;
  • 我们将默认路由注册为静态到 BRD-01、BRD-02;
  • 创建NAT规则;
  • 升至紧急 OSPF 区域 1;
  • 升至紧急 OSPF 区域 2;
  • 我们将1区的路线成本改为10区;
  • 我们将区域1的默认路由的cost改为10;
  • 我们更改与 L2-MGMT 关联的 IP 地址(更改为 FW-CLUSTER 上的 IP 地址);
  • 我们生成 gARP 请求,以便 L2-MGMT arp 表中的 poppy 地址从 FW-CLUSTER 更改为 EMERGENCY。

我们再次回到问题的最初表述。 凌晨三点,压力巨大,任何一个阶段的失误都可能引发新的问题。 准备好通过 CLI 输入命令了吗? 是的? 好吧,至少去洗个脸,喝点咖啡,集中一下意志力吧。
布鲁斯,请帮助大家。

网络自动化。 一个生活中的案例

嗯,我们继续改进我们的自动化。
下面是该剧本如何以 Ansible 术语工作的图表。 这个方案反映了我们上面描述的内容,它只是 Ansible 中的一个具体实现。
网络自动化。 一个生活中的案例

在这个阶段,我们意识到需要做什么,开发了剧本,进行了测试,现在我们准备推出它。

又是一个小小的抒情题外话。 这个故事的轻松不应该误导你。 编写剧本的过程并不像看起来那么简单和快速。 测试花费了相当多的时间,创建了虚拟展位,对解决方案进行了多次测试,进行了大约100次测试。

让我们开始吧……有一种感觉,一切都发生得很慢,某个地方出现了错误,有些东西最终无法正常工作。 带着降落伞跳起来,但降落伞又不想马上打开的感觉……这很正常。

接下来,我们读取 Ansible playbook 执行操作的结果(出于保密目的,替换了 IP 地址):

[xxx@emergency ansible]$ ansible-playbook -i /etc/ansible/inventories/prod_inventory.ini /etc/ansible/playbooks/emergency_on.yml 

PLAY [------->Emergency on VCF] ********************************************************

TASK [vcf_junos_emergency_on : Disable PROD interfaces to FW-CLUSTER] *********************
changed: [vcf]

PLAY [------->Emergency on MGMT-CORE] ************************************************

TASK [mgmt_junos_emergency_on : Disable MGMT interfaces to FW-CLUSTER] ******************
changed: [m9-03-sw-03-mgmt-core]

PLAY [------->Emergency on] ****************************************************

TASK [mk_routeros_emergency_on : Enable EXT-INTERNET interface] **************************
changed: [m9-04-r-04]

TASK [mk_routeros_emergency_on : Generate gARP for EXT-INTERNET interface] ****************
changed: [m9-04-r-04]

TASK [mk_routeros_emergency_on : Enable static default route to EXT-INTERNET] ****************
changed: [m9-04-r-04]

TASK [mk_routeros_emergency_on : Change NAT rule to EXT-INTERNET interface] ****************
changed: [m9-04-r-04] => (item=12)
changed: [m9-04-r-04] => (item=14)
changed: [m9-04-r-04] => (item=15)
changed: [m9-04-r-04] => (item=16)
changed: [m9-04-r-04] => (item=17)

TASK [mk_routeros_emergency_on : Enable OSPF Area 1 PROD] ******************************
changed: [m9-04-r-04]

TASK [mk_routeros_emergency_on : Enable OSPF Area 2 MGMT] *****************************
changed: [m9-04-r-04]

TASK [mk_routeros_emergency_on : Change OSPF Area 1 interfaces costs to 10] *****************
changed: [m9-04-r-04] => (item=VLAN-1001)
changed: [m9-04-r-04] => (item=VLAN-1002)
changed: [m9-04-r-04] => (item=VLAN-1003)
changed: [m9-04-r-04] => (item=VLAN-1004)
changed: [m9-04-r-04] => (item=VLAN-1005)
changed: [m9-04-r-04] => (item=VLAN-1006)
changed: [m9-04-r-04] => (item=VLAN-1007)
changed: [m9-04-r-04] => (item=VLAN-1008)
changed: [m9-04-r-04] => (item=VLAN-1009)
changed: [m9-04-r-04] => (item=VLAN-1010)
changed: [m9-04-r-04] => (item=VLAN-1011)
changed: [m9-04-r-04] => (item=VLAN-1012)
changed: [m9-04-r-04] => (item=VLAN-1013)
changed: [m9-04-r-04] => (item=VLAN-1100)

TASK [mk_routeros_emergency_on : Change OSPF area1 default cost for to 10] ******************
changed: [m9-04-r-04]

TASK [mk_routeros_emergency_on : Change MGMT interfaces ip addresses] ********************
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n.254', u'name': u'VLAN-803'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+1.254', u'name': u'VLAN-805'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+2.254', u'name': u'VLAN-807'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+3.254', u'name': u'VLAN-809'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+4.254', u'name': u'VLAN-820'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+5.254', u'name': u'VLAN-822'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+6.254', u'name': u'VLAN-823'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+7.254', u'name': u'VLAN-824'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+8.254', u'name': u'VLAN-850'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+9.254', u'name': u'VLAN-851'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+10.254', u'name': u'VLAN-852'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+11.254', u'name': u'VLAN-853'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+12.254', u'name': u'VLAN-870'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+13.254', u'name': u'VLAN-898'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+14.254', u'name': u'VLAN-899'})

TASK [mk_routeros_emergency_on : Generate gARPs for MGMT interfaces] *********************
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n.254', u'name': u'VLAN-803'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+1.254', u'name': u'VLAN-805'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+2.254', u'name': u'VLAN-807'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+3.254', u'name': u'VLAN-809'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+4.254', u'name': u'VLAN-820'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+5.254', u'name': u'VLAN-822'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+6.254', u'name': u'VLAN-823'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+7.254', u'name': u'VLAN-824'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+8.254', u'name': u'VLAN-850'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+9.254', u'name': u'VLAN-851'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+10.254', u'name': u'VLAN-852'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+11.254', u'name': u'VLAN-853'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+12.254', u'name': u'VLAN-870'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+13.254', u'name': u'VLAN-898'})
changed: [m9-04-r-04] => (item={u'ip': u'х.х.n+14.254', u'name': u'VLAN-899'})

PLAY RECAP ************************************************************************

完成!

事实上,它还没有完全准备好,不要忘记动态路由协议的收敛以及将大量路由加载到FIB中。 我们无法以任何方式影响这一点。 我们等。 成功了。 现在已经准备好了。

在 Vilabajo 村(该村不想实现网络设置自动化),他们继续洗碗。 Bruce(诚然,已经不同了,但同样很酷)正在尝试了解设备的手动重新配置将会发生多少。

网络自动化。 一个生活中的案例

我还想谈谈一个重要的问题。 我们怎样才能拿回一切? 一段时间后,我们将使 FW-CLUSTER 恢复生机。 这是主设备,不是备份设备,网络必须在上面运行。

您是否觉得网络工作者开始精疲力竭? 技术总监会听到一千个理由为什么不应该这样做,为什么可以稍后这样做。 不幸的是,这就是网络在一堆补丁、碎片和以前奢华的残余中运作的方式。 原来是拼布被子。 我们的一般任务,不是在这种特定情况下,而是一般原则上,作为 IT 专家,是将网络的工作带到美丽的英语单词“一致性”,它是非常多方面的,可以翻译为:连贯性、一致性、逻辑性、连贯性、系统性、可比性、连贯性。 都是关于他的。 只有在这种状态下,网络才是可管理的,我们清楚地了解哪些工作以及如何工作,我们清楚地了解需要更改哪些内容,如有必要,我们清楚地知道出现问题时该去哪里查找。 只有在这样的网络中,你才能执行我们刚才描述的技巧。

实际上,还准备了另一个剧本,将设置恢复到原来的状态。 其操作逻辑是相同的(重要的是要记住任务的顺序非常重要),为了不延长已经相当长的文章,我们决定不发布 playbook 执行的列表。 进行这样的练习后,你会感到更加平静,对未来更有信心,而且你堆在那里的任何拐杖都会立即显现出来。

任何人都可以写信给我们并接收所有书面代码以及所有纸牌的来源。 个人资料中的联系人。

发现

我们认为,可自动化的流程尚未具体化。 根据我们所遇到的情况以及我们西方同事正在讨论的内容,到目前为止可以看到以下主题:

  • 设备配置;
  • 数据采集​​;
  • 报告;
  • 故障排除;
  • 合规性。

如果有兴趣,我们可以继续就给定主题之一进行讨论。

我还想谈谈自动化。 我们的理解应该是这样的:

  • 系统必须在没有人的情况下生存,同时由人来改进。 系统不应该依赖于人类;
  • 操作一定要熟练。 不存在执行日常任务的专家阶层。 有些专家已经自动化了整个例程并只解决复杂的问题;
  • 常规标准任务“只需按一下按钮”即可自动完成,不会浪费任何资源。 此类任务的结果总是可以预测和理解的。

这些点应该导致什么:

  • IT 基础设施的透明度(运营、现代化、实施风险更低。每年停机时间更少);
  • 规划IT资源的能力(容量规划系统——可以看到消耗了多少,可以看到单个系统需要多少资源,而不是通过信访高层部门);
  • 可以减少 IT 员工数量。

文章作者:Alexander Chelovekov(CCIE RS、CCIE SP)和 Pavel Kirillov。 我们有兴趣讨论并提出有关 IT 基础设施自动化主题的解决方案。


来源: habr.com

添加评论