SaltStack Network Automation 关于网络自动化配置功能实现的介绍

网络自动化是使计算机网络的配置、管理和操作自动化的一个持续过程。 尽管可以将其抽象并与服务器端的操作进行比较,但是仍然存在许多特殊的挑战,最重要的是,网络设备通常是封闭的硬件,只能运行专有软件。 换句话说,用户不能直接在传统的网络设备上安装salt-minion。 由于这些原因,大多数网络设备只能通过proxy minion或使用Salt SSH进行远程控制。 但是,也有一些厂商生产白盒设备(例如Arista,Cumulus)或其他已将操作系统移到容器中的设备(例如Cisco NX-OS,Cisco IOS-XR),从而使salt-minion可以直接安装在平台上。

您也可以参考在Github上维护的一份相同的技术资料:Network Automation

New in Carbon

Carbon (2016.11)

网络自动化的方法已在2016.11.0中引入。 网络自动化支持是基于proxy minions实现的。

  • NAPALM proxy
  • Junos proxy
  • Cisco NXOS
  • Cisco NOS

NAPALM

NAPALM(具有多供应商支持的网络自动化和可编程性抽象层)是一个开源的Python库,该库实现了一组功能,以使用统一的API与不同的路由器供应商设备进行交互。 由于与供应商无关,因此简化了操作,因为配置和与网络设备的交互不依赖于特定的供应商。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9cYIUmw3-1580686584670)(./images/napalm_logo.png)]

从2017.7.0开始,NAPALM模块已进行了转换,因此它们可以在proxy和常规minions中运行。 这意味着,如果操作系统允许,则salt-minion可以直接安装在网络设备上。 在这种情况下,网络操作系统和Salt之间的接口将是相应的NAPALM子程序包。

例如,如果用户在Arista交换机上安装salt-minion,则唯一的要求就是napalm-eos。

2017.7.0版本中提供以下模块:

  • NAPALM grains
  • NET execution module - 基础网络管理功能
  • NTP execution module
  • BGP execution module
  • Routes execution module
  • SNMP execution module
  • Users execution module
  • Probes execution module
  • NTP peers management state
  • SNMP configuration management state
  • Users management state
  • Netconfig state module - 使用任意模板和特定于Salt的高级模板方法来管理网络设备的配置。
  • Network ACL execution module - 在网络设备上生成并加载ACL(防火墙)配置。
  • Network ACL state - 管理防火墙配置。 只需要正确编写pillar结构即可!
  • NAPALM YANG execution module - 使用OpenConfig/IETF模型以标准方式解析、生成和加载本机设备配置。 此模块还包含状态的帮助程序。
  • NAPALM YANG state module - 根据YANG模型(OpenConfig或IETF)管理网络设备配置。
  • NET finder -
    Runner程序,用于轻松快速地找到你需要的配置细节。 它将搜索网络接口,IP地址,MAC地址表,ARP表和LLDP邻居的详细信息。
  • BGP finder - Runner程序,用于搜索BGP neighbors 配置信息。
  • NAPALM syslog - 将事件从napalm-logs库导入到Salt事件总线的引擎。 这些事件基于来自网络设备的系统日志消息,并遵循OpenConfig/IETF YANG模型进行构造。
  • NAPALM Helpers - NAPALM相关操作的通用帮助器。 例如,可以在状态模块内部使用“合规性”报告功能来比较预期配置和现有配置。

Getting started

安装 NAPALM - 跟随这份说明并检查平台相关的依赖性条件。

Salt的Pillar系统非常适合配置proxy-minions(尽管它们也可以在/etc/salt/proxy中进行配置)。 代理可以通过pillar_roots目录中的pillar配置文件指定,也可以通过外部pillar指定。 外部pillars为与配置管理系统、数据库或其他可能已经包含代理目标的所有详细信息的知识系统进行接口提供了机会。 要在pillar_roots中使用静态文件,请参照以下示例设置文件匹配模式:

/etc/salt/pillar/top.sls

base:
  router1:
    - router1
  router2:
    - router2
  switch1:
    - switch1
  switch2:
    - switch2
  cpe1:
    - cpe1

/etc/salt/pillar/router1.sls

proxy:
  proxytype: napalm
  driver: junos
  host: r1.bbone.as1234.net
  username: my_username
  password: my_password

/etc/salt/pillar/router2.sls

proxy:
  proxytype: napalm
  driver: iosxr
  host: r2.bbone.as1234.net
  username: my_username
  password: my_password
  optional_args:
    port: 22022

/etc/salt/pillar/switch1.sls

proxy:
  proxytype: napalm
  driver: eos
  host: sw1.bbone.as1234.net
  username: my_username
  password: my_password
  optional_args:
    enable_password: my_secret

/etc/salt/pillar/switch2.sls

proxy:
  proxytype: napalm
  driver: nxos
  host: sw2.bbone.as1234.net
  username: my_username
  password: my_password

/etc/salt/pillar/cpe1.sls

proxy:
  proxytype: napalm
  driver: ios
  host: cpe1.edge.as1234.net
  username: ''
  password: ''
  optional_args:
    use_keys: True
    auto_rollback_on_error: True

CLI examples

查看在 router1 设备上running状态的全部配置信息:

$ sudo salt 'router1' net.config source='running'

获取在所有设备上配置的 NTP servers 配置信息:

$ sudo salt '*' ntp.servers
router1:
  ----------
  comment:
  out:
      - 1.2.3.4
  result:
      True
cpe1:
  ----------
  comment:
  out:
      - 1.2.3.4
  result:
      True
switch2:
  ----------
  comment:
  out:
      - 1.2.3.4
  result:
      True
router2:
  ----------
  comment:
  out:
      - 1.2.3.4
  result:
      True
switch1:
  ----------
  comment:
  out:
      - 1.2.3.4
  result:
      True

查看运行IOS-XR 5.3.3系统的所有 Cisco 设备的ARP tables :

$ sudo salt -G 'os:iosxr and version:5.3.3' net.arp

返回 Arista switches 设备的接口操作细节:

$ sudo salt -C 'sw* and os:eos' net.interfaces

在网络的边际设备上执行 traceroute :

$ sudo salt 'router*' net.traceroute 8.8.8.8 vrf='CUSTOMER1-VRF'

逐字显示 Juniper routers 的查询信息:

$ sudo salt -C 'router* and G@os:junos' net.cli 'show version and haiku'

返回在Juniper MX960 routers 设备上执行 RPM probes 命令的结果configured :

$ sudo salt -C 'router* and G@os:junos and G@model:MX960' probes.results

返回CPEs设备上配置的用户列表信息 :

$ sudo salt 'cpe*' users.config

使用 BGP finder 运行器程序, 返回一个当机状态的 BGP neighbors 设备的列表:

$ sudo salt-run bgp.neighbors up=False

使用 NET finder运行器程序, 查找那些在接口描述中可以匹配上 “PX-1234-LHR” 模式的设备:

$ sudo salt-run net.find PX-1234-LHR

Cross-platform configuration management example - 跨平台的配置管理示例

NTP服务配置

假定用户已经在 file_roots 配置项下添加了以下两行内容:

file_roots:
  base:
    - /etc/salt/pillar/
    - /etc/salt/templates/
    - /etc/salt/states/

在pillar中定义 NTP peers 和 servers 的信息列表:

/etc/salt/pillar/ntp.sls

ntp.servers:
  - 1.2.3.4
  - 5.6.7.8
ntp.peers:
   - 10.11.12.13
   - 14.15.16.17

引用上面定义的配置文件。例如,如果要在所有网络设备上使用相同的NTP服务器,则可以在top.sls文件中添加以下行:

'*':
  - ntp

/etc/salt/pillar/top.sls

base:
  '*':
    - ntp
  router1:
    - router1
  router2:
    - router2
  switch1:
    - switch1
  switch2:
    - switch2
  cpe1:
    - cpe1

或者是只针对特定的设备设置引用关系:

/etc/salt/pillar/top.sls

base:
  router1:
    - router1
    - ntp
  router2:
    - router2
    - ntp
  switch1:
    - switch1
  switch2:
    - switch2
  cpe1:
    - cpe1

定义 cross-vendor template模板文件:

/etc/salt/templates/ntp.jinja

{%- if grains.vendor|lower == 'cisco' %}
  no ntp
  {%- for server in servers %}
  ntp server {{ server }}
  {%- endfor %}
  {%- for peer in peers %}
  ntp peer {{ peer }}
  {%- endfor %}
{%- elif grains.os|lower == 'junos' %}
  system {
    replace:
    ntp {
      {%- for server in servers %}
      server {{ server }};
      {%- endfor %}
      {%- for peer in peers %}
      peer {{ peer }};
      {%- endfor %}
    }
  }
{%- endif %}

定义 SLS state 状态文件, 这里使用到的是 Netconfig state 模块:

/etc/salt/states/router/ntp.sls

ntp_config_example:
  netconfig.managed:
    - template_name: salt://ntp.jinja
    - peers: {{ pillar.get('ntp.peers', []) | json }}
    - servers: {{ pillar.get('ntp.servers', []) | json }}

运行状态并确保跨多供应商网络设备的NTP配置结果的一致性:

$ sudo salt 'router*' state.sls router.ntp

除了CLI方式之外,状态还可以在由特定事件触发时进行调度或执行。

JUNOS

瞻博网络已经开发了特定于Junos的proxy代理基础架构,该基础结构允许对Junos设备进行远程执行和配置管理,而无需在设备上安装SaltStack。 这些基础设施包括:

  • Junos proxy
  • Junos execution module
  • Junos state module
  • Junos syslog engine

执行和状态模块是使用junos-eznc(PyEZ)实现的。 Junos PyEZ是Python的微框架,使您能够远程管理和自动化运行Junos操作系统的设备。

Getting started

在将运行Junos proxy minion的设备系统上安装PyEZ (例如下面示例中使用到的vmx主机设备)。 这需要运行Junos特定模块。

pip install junos-eznc

接下来, 设置 proxy minions 使用的master服务信息:

/etc/salt/proxy

master: >

添加Junos设备的详细信息。 设备详细信息通常存储在salt pillars中。 如果您不希望将凭证信息存储在pillar中,则可以设置为无密码ssh。

/srv/pillar/vmx_details.sls

proxy:
  proxytype: junos
  host: >
  username: user
  passwd: secret123

设置 pillar file 到指定 proxy minion 的映射关系, 这个是在pillar的 top file 文件中完成的:

/srv/pillar/top.sls

base:
  vmx:
    - vmx_details
  • 注意,这里的设备标识名vmx是后面在cli命令中通过proxyid参数指定的

在启动Junos proxy之前,请确保在Junos设备上启用了netconf功能。 这可以通过在Junos设备上添加以下配置来完成。

set system services netconf ssh

以调试模式启动 salt master 服务进程:

salt-master -l debug

以调试模式启动 salt proxy 服务进程:

salt-proxy --proxyid=vmx -l debug

一旦启动了master和junos proxy minion服务,我们就可以在proxy minion上运行Salt执行和状态模块。 以下是一些使用示例。

CLI examples

有关所有junos执行模块的详细文档,请参见:Junos execution module

查看 device facts 信息:

$ sudo salt 'vmx' junos.facts

刷新 Junos facts,这个函数将刷新那些存储在 salt grains 中的facts信息。 (Junos proxy 存储 Junos facts 在 salt grains 中)

$ sudo salt 'vmx' junos.facts_refresh

执行一个 RPC 调用:

$ sudo salt 'vmx' junos.rpc 'get-interface-information' '/var/log/interface-info.txt' terse=True

在设备上安装指定配置:

$ sudo salt 'vmx' junos.install_config 'salt://my_config.set'

关闭指定 junos 设备:

$ sudo salt 'vmx' junos.shutdown shutdown=True in_min=10

State file examples

有关所有junos状态模块的详细文档,请参见: Junos state module

在一个指定的Junos设备上执行 RPC 调用并把结果输出到一个文件中:

/srv/salt/rpc.sls

get-interface-information:
    junos:
      - rpc
      - dest: /home/user/rpc.log
      - interface_name: lo0

锁定junos设备,加载配置,提交并解锁设备:

/srv/salt/load.sls

lock the config:
  junos.lock

salt://configs/my_config.set:
  junos:
    - install_config
    - timeout: 100
    - diffs_file: 'var/log/diff'

commit the changes:
  junos:
    - commit

unlock the config:
  junos.unlock

根据设备的个性配置要求在设备上安装适当的映像:

/srv/salt/image_install.sls

{% if grains['junos_facts']['personality'] == MX %}
salt://images/mx_junos_image.tgz:
  junos:
    - install_os
    - timeout: 100
    - reboot: True
{% elif grains['junos_facts']['personality'] == EX %}
salt://images/ex_junos_image.tgz:
  junos:
    - install_os
    - timeout: 150
{% elif grains['junos_facts']['personality'] == SRX %}
salt://images/srx_junos_image.tgz:
  junos:
    - install_os
    - timeout: 150
{% endif %}

Junos Syslog Engine

Junos Syslog Engine是一个Salt engine,可从各种Junos设备接收数据,提取事件信息并将其转发到master/minion事件总线上。 这需要在salt master服务器上启动该引擎功能,请在master配置文件中添加以下配置。同时,这个engine引擎功能同样也是可以在salt minion上运行的。

/etc/salt/master

engines:
  - junos_syslog:
      port: xxx

为了使junos_syslog引擎接收到这些事件,必须在Junos设备上设置syslog服务配置信息。 这可以通过以下配置完成:

set system syslog host  port xxx any any

你可能感兴趣的:(SaltStack)