Skip to content

Files

Latest commit

f87fb9e · Dec 29, 2021

History

History
577 lines (404 loc) · 29.3 KB

File metadata and controls

577 lines (404 loc) · 29.3 KB

七、核心网络模块

在本章中,我们将了解 Ansible 附带的核心网络模块。由于这些模块的要求,我们将只通过一些用例和例子来讨论这些模块提供的功能。

本章将涵盖以下主题:

  • 核心网络模块
  • 与服务器的本地防火墙交互
  • 与网络设备交互

技术要求

在本章中,我们将启动一个运行软件防火墙的游民箱。您将需要安装游民并接入互联网;流浪盒大约有 400 兆下载量。我们将在本章中完成的完整版本行动手册可在https://github . com/packt publishing/Learn-Ansible/tree/master/chapter 07/vyos上访问。

制造商和设备支持

到目前为止,我们一直在关注与服务器交互的模块。在我们的例子中,它们都在本地运行。在后面的章节中,我们将与远程托管的服务器进行通信。在开始与远程服务器交互之前,我们应该先了解核心网络模块。

这些模块都旨在与各种网络设备交互并管理其配置,从传统的架顶式交换机和完全虚拟化的网络基础架构,到防火墙和负载平衡器。Ansible 支持的设备非常多,从开源虚拟设备一直到可能超过 50 万美元的解决方案,具体取决于您的配置。

模块

我在这里列出了每个设备和操作系统。他们每个人都有一个简写的名字,用粗体突出显示。这些都是模块的前缀。例如,在第一个设备中,有一个名为 a10_server 的模块,用于使用 aXAPIv2 API 管理服务器负载均衡器 ( SLB )对象。

A10 网络

A10 模块支持 A10 网络 AX、SoftAX、迅雷和 vThunder 设备。这些都是提供负载平衡的应用交付平台。除其他功能外,这六个模块允许您管理物理和虚拟设备上的负载平衡和虚拟主机。

思科应用中心基础设施

50+ ACI 模块用于管理思科 ACI 的所有方面,这是思科下一代应用编程接口驱动的网络栈的预期目标。

Cisco 航空公司

两个空中操作系统模块允许您与运行空中操作系统的思科无线局域网控制器进行交互。其中一个模块允许您直接在设备上运行命令,另一个模块用于管理配置。

亚太操作系统(AOS)

十几个 AOS 模块都被标记为弃用,因为它们不支持 AOS 2.1 或更高版本。在即将发布的 Ansible 版本(确切地说是 2.9 版)中,这些模块将在被移除之前被替换。

阿鲁巴移动控制器

只有两个阿鲁巴模块。这些允许您在惠普的阿鲁巴移动控制器上管理配置和执行命令。

思科自适应安全设备

通过三个 ASA 模块,您可以管理访问列表,以及运行命令和管理物理和虚拟思科 ASA 设备的配置。

阿维网络公司

在撰写本文时,共有 65 个 Avi 模块,允许您与 Avi 应用服务平台的各个方面进行交互,包括负载平衡和 web 应用防火墙 ( WAF )功能。

大交换网络

有三个大交换机网络模块。一、大云架构 ( BCF )允许您创建和删除 BCF 交换机。另外两个模块允许您创建大监控架构 ( 大 Mon )服务链和策略。

思杰网络缩放器

目前有一个不推荐使用的网络缩放器模块。它将在 Ansible 2.8 中删除。这为您提供了充足的时间转向新模块。单个模块已被 14 个其他模块取代,这使您可以管理负载平衡器和思杰安全设备中的更多功能。

华为云引擎(CE)

有超过 65 个 CE 模块,可以让你管理华为这些强大交换机的方方面面,包括 BGP、访问控制列表、MTU、静态路由、VXLANs,甚至 SNMP 配置。

Arista CloudVision

有一个模块允许您使用 configlet 配置 Arista CV 服务器端口。

联想 cmos

有超过 15 个模块可以让你管理运行联想 CNOS 操作系统的设备;它们允许您管理从 BGP 和端口聚合到 VLAG、VLAN 甚至工厂重置设备的一切。

Linux 累积(CL)

在八个 CL 中,有七个已经被弃用,取而代之的是使用网络命令行实用程序 ( NCLU )与你的积云 Linux 设备通信的单一模块。

戴尔操作系统 10(戴尔 10)

戴尔 10 有三个模块,允许您在运行戴尔网络操作系统的设备上执行命令、管理配置和收集事实。还有用于戴尔操作系统 6 ( 戴尔操作系统 6 )和戴尔操作系统 9 ( 戴尔操作系统 9 )的模块。

我是艾治斯

有一些用于边缘操作系统的模块,允许您管理配置,执行临时命令,并在运行边缘操作系统的设备上收集事实,例如泛在边缘路由器。

联想企业网络操作系统

联想 ENOS 有三个模块。像其他设备一样,这些设备允许您收集事实、执行命令和管理配置。

EOS 边

有十六个模块允许您管理运行 EOS 的设备。这些模块允许您配置接口、虚拟局域网、虚拟参考框架、用户、链路聚合、静态路由,甚至日志记录。还有一个模块允许您从每个设备收集事实。

F5 大知识产权

共有 65 个模块,都以大知识产权为前缀,允许您管理 F5 大知识产权应用交付控制器的所有方面。

富通基金经理

有一个单一的模块,允许您添加,编辑,删除和执行脚本对您的富通设备,使用富通管理器 ( fmgr )。

FortiGate FortiOS

作为核心网络模块的一部分,有三个模块使您能够管理富通网关富通操作系统供电设备上的地址、配置和 IPv4 策略对象。

插图

illumos 是 OpenSolaris 操作系统的一个分支。它有几个强大的网络功能,使其成为作为自建路由器或防火墙部署的完美候选。使用了三个前缀:dladmflowadmipadm。这些模块允许您管理接口、网络流和隧道。此外,由于 illumos 是 OpenSolaris 的一个分支,您的剧本应该适用于基于 OpenSolaris 的操作系统。

思科 IOS 和 IOS XR

大约有 25 个模块可以让您管理思科 IOSIOS XR 供电的设备。有了它们,您可以在设备上收集事实,以及配置用户、界面、日志、横幅等。

织锦铁器

通常有三个模块可以帮助您管理 Brocade 铁器供电的设备;您可以配置、运行临时命令和收集事实。

Juniper Junos

有 20 个模块使您能够从行动手册中与运行朱诺的设备进行交互。这些模块包括标准命令、配置和事实收集模块,以及允许您安装软件包并将文件复制到设备的模块。

诺基亚 netact

有一个单一的模块,允许你上传和应用你的诺基亚网络供电的核心和无线电网络。

Pluribus 网络网络浏览器操作系统

有超过十个模块可以让你管理你的Pluribus Networks(PN)Netvisor 操作系统驱动的设备,从创建集群和路由器,到在你的白盒交换机上运行命令。

思科网络服务协调人(NSO)

有一些模块允许您与思科 NSO 管理的设备进行交互。您可以执行 NSO 操作,从您的安装中查询数据,并在服务同步和配置的同时验证您的配置。

诺基亚暖阁网络虚拟服务平台

有一个单一的模块,允许您管理您的诺基亚暖机网络虚拟存储平台上的企业。

Cisco NX-OS(节点)

可以想象,管理运行思科 NXOS 的设备有很多模块——超过 70 个。其中一些正在被否决。有了这么多模块,您就可以覆盖这个强大的网络操作系统的所有功能。

Mellanox ONYX

有十几个模块可以让你与 Mellanox 的开关操作系统 ONYX 进行交互。您可以管理 BGP、L2 和 L3 接口,以及 LDAP。

大炮

军械路由器即服务有两个模块;它们允许您应用配置更改并收集事实。

打开虚拟开关(OVS)

有三个模块允许您管理您的 OVS 虚拟交换机上的网桥、端口和数据库。

帕洛阿尔托网络公司

有 20 多个模块可以让您配置、管理和审计运行 PAN-OS ( panos )的 Palo Alto Networks 设备。目前,有几个模块被弃用;它们将不再作为核心模块从 Ansible 2.5 中分发。

拉德韦尔

最近推出的少量模块允许您通过视频直播服务器管理您的 Radware 设备。

诺基亚网络服务路由器操作系统(SROS)

有三个模块允许您针对诺基亚通信 SROS 设备运行命令、配置和回滚更改。

VyOS

有十几个左右的模块可以让你管理你的 VyOS 开源的基于 Linux 的路由器和防火墙的大部分方面。我们将在下一节中了解 VyOS。

系统

还有几个通用的网络模块,允许您管理基于 Linux 的网络设备上的接口、第 2 层和第 3 层配置、网络配置、路由以及 LLDP 服务。

与网络设备交互

正如本章开头已经提到的,我们将使用游民来启动网络设备,然后运行剧本来应用基本配置。我们将推出的设备是 VyOS。虽然该设备将是完整的 VyOS 安装,但我们将仅应用测试配置,让您了解如何使用我们在上一节中提到的模块。

There is a full copy of this playbook in the GitHub repository that accompanies this title.

启动网络设备

为此,我们将使用 VyOS 游民箱。如果您正在跟进,我们首先需要创建一个名为vyos的文件夹。这将保存我们的剧本和Vagrantfile。要创建行动手册所需的文件夹结构和空白文件,请运行以下命令:

$ mkdir vyos vyos/group_vars vyos/roles
$ ansible-galaxy init vyos/roles/vyos-firewall
$ touch vyos/Vagrantfile
$ touch vyos/production
$ touch vyos/site.yml
$ touch vyos/group_vars/common.yml
$ touch vyos/roles/vyos-firewall/templates/firewall.j2 

将以下代码复制到我们创建的空Vagrantfile中:

# -*- mode: ruby -*-
# vi: set ft=ruby :

API_VERSION = "2"
BOX_NAME    = "russmckendrick/vyos"
BOX_IP      = "192.168.50.10"
DOMAIN      = "nip.io"
PRIVATE_KEY = "~/.ssh/id_rsa"
PUBLIC_KEY  = '~/.ssh/id_rsa.pub'

Vagrant.configure(API_VERSION) do |config|
  config.vm.box = BOX_NAME
  config.vm.network "private_network", ip: BOX_IP
  config.vm.host_name = BOX_IP + '.' + DOMAIN
  config.ssh.insert_key = false
  config.ssh.private_key_path = [PRIVATE_KEY, "~/.vagrant.d/insecure_private_key"]
  config.vm.provision "file", source: PUBLIC_KEY, destination: "~/.ssh/authorized_keys"

  config.vm.provider "virtualbox" do |v|
    v.memory = "2024"
    v.cpus = "2"
  end

  config.vm.provider "vmware_fusion" do |v|
    v.vmx["memsize"] = "2024"
    v.vmx["numvcpus"] = "2"
  end

end

如您所见,Vagrantfile看起来与我们在前面章节中使用的其他没有太大不同。现在我们来看看vyos_firewall这个角色。执行和编写角色的方法有一些不同,我们应该在启动任何东西之前讨论一下。

VyOS 的角色

在我们进入任务之前,让我们看看我们将使用的变量。首先roles/vyos-firewall/defaults/main.yml的内容:

---

motd_asciiart: |
  -----------------------------

  VyOS Ansible Managed Firewall 

  -----------------------------

vyos_nameservers:
  - 8.8.8.8
  - 8.8.4.4

在这里,我们只设置了两个关键值。第一个是motd_asciiart,它是一个多行横幅,将被配置为每当我们登录到 VyOS 设备时显示。我们在声明键后使用|将变量设置为多行。下一个键vyos_nameservers是要使用的域名解析器列表。在这里,我们使用谷歌的公共域名解析器。

剧本中还使用了一些其他变量;这些可以在group_vars/common.yml中找到,如该代码所示:

---

vyos:
  host: "192.168.50.10.nip.io"
  username: "vagrant"
  backup: "yes"
  inside:
    interface: "172.16.20.1/24"
    subnet: "172.16.20.0/24"

whitelist_ips:
  - 172.16.20.2

rules:
    - { action: 'set', source_address: '0.0.0.0/0', source_port: '80', destination_port: '80', destination_address: '172.16.20.11', protocol: 'tcp', description: 'NAT port 80 to 172.16.10.11', rule_number: '10' }
    - { action: 'set', source_address: '0.0.0.0/0', source_port: '443', destination_port: '443', destination_address: '172.16.20.11', protocol: 'tcp', description: 'NAT port 443 to 172.16.10.11', rule_number: '20' }
    - { action: 'set', source_address: '123.123.123.123/32', source_port: '222', destination_port: '22', destination_address: '172.16.20.11', protocol: 'tcp', description: 'NAT port 443 to 172.16.10.11', rule_number: '30' }

如您所见,这些是根据我们的行动手册的运行位置而变化的主要变量。首先,我们在一个名为vyos的嵌套变量中设置设备的细节及其基本配置。您可能已经注意到,我们在这里传递的是 VyOS 设备的 IP 地址和用户名的详细信息,而不是主机清单文件。

事实上,我们的主机清单文件,称为production,应该只包含以下代码行:

localhost

这意味着当我们的剧本被执行时,它不会在我们的 VyOS 设备上执行。相反,剧本将针对我们的 Ansible 控制器,然后模块将针对 VyOS 设备。这种方法在所有核心网络模块中很常见。正如我们已经讨论过的,Ansible 是一个无代理平台;默认情况下,它只需要 SSH 或 WinRM 连接。

然而,并不是每个网络设备都有 SSH 或 WinRM 访问权限;一些可能只有基于 web 的 API,而另一些可能使用专有的访问方法。其他的,比如 VyOS,可能看起来有 SSH 访问权限;然而,您正在进入一个定制的外壳,它被设计成只运行几个防火墙命令。因此,大多数核心网络模块都远离主机清单文件来管理它们的连接和通信。

group_vars/common.yml文件中剩余的变量设置了一些基本的防火墙规则,我们将很快看到。

角色的任务可以在roles/vyos-firewall/tasks/main.yml找到,包含四个部分。首先,我们使用vyos_config模块设置主机名。看看这段代码:

- name: set the hostname correctly
  vyos_config:
    provider:
      host: "{{ vyos.host }}"
      username: "{{ vyos.username }}"
    lines:
      - "set system host-name {{ vyos.host }}"

如您所见,我们正在使用provider选项传递 VyOS 设备的详细信息;然后我们传递一个vyos命令来设置主机名。vyos_config模块还接受模板文件,我们稍后将使用这些文件来完全配置我们的设备。

下一个任务使用vyos_system模块配置域名解析器。看看这段代码:

- name: configure name servers
  vyos_system:
    provider:
      host: "{{ vyos.host }}"
      username: "{{ vyos.username }}"
    name_server: "{{ item }}"
  with_items: "{{ vyos_nameservers }}"

接下来,我们将使用vyos_banner模块设置当天的消息 ( MOTD )。看看这段代码:

- name: configure the motd
  vyos_banner:
    provider:
      host: "{{ vyos.host }}"
      username: "{{ vyos.username }}"
    banner: "post-login"
    state: "present"
    text: "{{ motd_asciiart }}"

最后,我们将使用以下任务应用我们的主防火墙配置:

- name: backup and load from file
  vyos_config:
    provider:
      host: "{{ vyos.host }}"
      username: "{{ vyos.username }}"
    src: "firewall.j2"
    backup: "{{ vyos.backup }}"
    save: "yes"

这次我们不是使用lines提供命令,而是使用src给出模板文件的名称。我们还指示模块备份当前配置;这将存储在roles/vyos-firewall/backup文件夹中,该文件夹是在剧本运行时创建的。

模板可以在roles/vyos-firewall/templates/firewall.j2找到。该模板包含以下代码:

set firewall all-ping 'enable'
set firewall broadcast-ping 'disable'
set firewall ipv6-receive-redirects 'disable'
set firewall ipv6-src-route 'disable'
set firewall ip-src-route 'disable'
set firewall log-martians 'enable'
set firewall receive-redirects 'disable'
set firewall send-redirects 'enable'
set firewall source-validation 'disable'
set firewall state-policy established action 'accept'
set firewall state-policy related action 'accept'
set firewall syn-cookies 'enable'
set firewall name OUTSIDE-IN default-action 'drop'
set firewall name OUTSIDE-IN description 'deny traffic from internet'
{% for item in whitelist_ips %}
set firewall group address-group SSH-ACCESS address {{ item }}
{% endfor %}
set firewall name OUTSIDE-LOCAL rule 310 source group address-group SSH-ACCESS
set firewall name OUTSIDE-LOCAL default-action 'drop'
set firewall name OUTSIDE-LOCAL rule 310 action 'accept'
set firewall name OUTSIDE-LOCAL rule 310 destination port '22'
set firewall name OUTSIDE-LOCAL rule 310 protocol 'tcp'
set firewall name OUTSIDE-LOCAL rule 900 action 'accept'
set firewall name OUTSIDE-LOCAL rule 900 description 'allow icmp'
set firewall name OUTSIDE-LOCAL rule 900 protocol 'icmp'
set firewall receive-redirects 'disable'
set firewall send-redirects 'enable'
set firewall source-validation 'disable'
set firewall state-policy established action 'accept'
set firewall state-policy related action 'accept'
set firewall syn-cookies 'enable'
set interfaces ethernet eth0 firewall in name 'OUTSIDE-IN'
set interfaces ethernet eth0 firewall local name 'OUTSIDE-LOCAL'
set interfaces ethernet eth1 address '{{ vyos.inside.interface }}'
set interfaces ethernet eth1 description 'INSIDE'
set interfaces ethernet eth1 duplex 'auto'
set interfaces ethernet eth1 speed 'auto'
set nat source rule 100 outbound-interface 'eth0'
set nat source rule 100 source address '{{ vyos.inside.subnet }}'
set nat source rule 100 translation address 'masquerade'
{% for item in rules if item.action == "set" %}
{{ item.action }} nat destination rule {{ item.rule_number }} description '{{ item.description }}'
{{ item.action }} nat destination rule {{ item.rule_number }} destination port '{{ item.source_port }}'
{{ item.action }} nat destination rule {{ item.rule_number }} translation port '{{ item.destination_port }}'
{{ item.action }} nat destination rule {{ item.rule_number }} inbound-interface 'eth0'
{{ item.action }} nat destination rule {{ item.rule_number }} protocol '{{ item.protocol }}'
{{ item.action }} nat destination rule {{ item.rule_number }} translation address '{{ item.destination_address }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} action 'accept'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} source address '{{ item.source_address }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} destination address '{{ item.destination_address }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} destination port '{{ item.destination_port }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} protocol '{{ item.protocol }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} state new 'enable'
{% endfor %}
{% for item in rules if item.action == "delete" %}
{{ item.action }} nat destination rule {{ item.rule_number }}
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }}
{% endfor %}

模板中有很多命令,其中大部分只是在设备上应用一些基本设置。我们感兴趣的是三个for循环。第一个循环如下:

{% for item in whitelist_ips %}
set firewall group address-group SSH-ACCESS address {{ item }}
{% endfor %}

这将简单地循环遍历我们在whitelist_ips变量中提供的每个 IP 地址,类似于我们在以前的行动手册中使用with_items的方式。下一个循环更好地证明了这一点,它从firewall变量中获取变量,并创建 NAT 和防火墙规则。看看这段代码:

{% for item in rules if item.action == "set" %}
{{ item.action }} nat destination rule {{ item.rule_number }} description '{{ item.description }}'
{{ item.action }} nat destination rule {{ item.rule_number }} destination port '{{ item.source_port }}'
{{ item.action }} nat destination rule {{ item.rule_number }} translation port '{{ item.destination_port }}'
{{ item.action }} nat destination rule {{ item.rule_number }} inbound-interface 'eth0'
{{ item.action }} nat destination rule {{ item.rule_number }} protocol '{{ item.protocol }}'
{{ item.action }} nat destination rule {{ item.rule_number }} translation address '{{ item.destination_address }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} action 'accept'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} source address '{{ item.source_address }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} destination address '{{ item.destination_address }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} destination port '{{ item.destination_port }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} protocol '{{ item.protocol }}'
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }} state new 'enable'
{% endfor %}

如您所见,只有当我们在变量中将action设置为set时,该规则才包含在内;最后一个循环处理我们将action设置为delete的任何规则,如本代码所示:

{% for item in rules if item.action == "delete" %}
{{ item.action }} nat destination rule {{ item.rule_number }}
{{ item.action }} firewall name OUTSIDE-IN rule {{ item.rule_number }}
{% endfor %}

如果您一直在关注,那么除了site.yml文件之外,我们最初创建的所有文件都应该有内容。这应该包含以下代码:

---

- hosts: localhost
  connection: local
  gather_facts: false

  vars_files:
    - group_vars/common.yml

  roles:
    - roles/vyos-firewall

现在我们已经将剧本的所有部分整合在一起,我们可以启动 VyOS 游民盒子并运行剧本。

运行剧本

要启动游民箱,请确保您位于我们在本节开始时创建的vyos文件夹中,并运行以下两个命令之一,使用您选择的虚拟机管理程序启动箱子:

$ vagrant up
$ vagrant up --provider=vmware_fusion

一旦您的游民箱启动,您可以使用以下命令运行剧本:

$ ansible-playbook -i production site.yml

此剧本运行的输出应该如下所示:

PLAY [localhost] ***********************************************************************************

TASK [roles/vyos-firewall : set the hostname correctly] ********************************************
changed: [localhost]

TASK [roles/vyos-firewall : configure name servers] ************************************************
changed: [localhost] => (item=8.8.8.8)
changed: [localhost] => (item=8.8.4.4)

TASK [roles/vyos-firewall : configure the motd] ****************************************************
changed: [localhost]

TASK [roles/vyos-firewall : backup and load from file] *********************************************
changed: [localhost]

PLAY RECAP *****************************************************************************************
localhost : ok=4 changed=4 unreachable=0 failed=0

完成后,您应该能够通过运行以下代码将 SSH 引入您的 VyOS 设备:

$ vagrant ssh

您应该会看到登录横幅已经更新为我们定义的横幅,如下图所示:

登录时,您应该能够通过运行以下命令来查看 VyOS 配置:

$ show config

您应该能够发现我们在运行行动手册时所做的所有更改,如下面的截图所示:

要停止查看配置,请按。您可以键入exit退出 SSH 会话。您可以通过运行以下命令来删除 VyOS 游民箱:

$ vagrant destroy

正如本章开始部分提到的,本练习不是关于使用 Ansible 配置全功能 VyOS 安装;相反,它给出了一个实际的例子,说明如何使用 Ansible 模块配置网络设备,这既可以实现更改,也可以使用模板应用配置。

摘要

在本章中,我们简要介绍了作为 Ansible 核心模块集的一部分提供的各种网络模块。我们还将一种配置应用于虚拟 VyOS 设备,以了解网络模块与我们在前面章节中介绍的模块有何不同。

在下一章中,我们将研究使用 Ansible 启动基于云的服务器实例,然后将我们的一些行动手册应用于它们。

问题

  1. 对或错:你必须在模板内使用带有for循环的with_items
  2. 哪个字符用于将变量拆分成多行?
  3. 对或错:使用 VyOS 模块时,我们不需要在主机清单文件中传递设备的详细信息。
  4. 您能否将 VyOS 配置回滚到您存储的最早备份?

进一步阅读

以下每个链接都提供了核心网络模块当前支持的每种设备和技术的详细信息: