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

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版本中提供以下模块:

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-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: <master_ip>

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

/srv/pillar/vmx_details.sls

proxy:
  proxytype: junos
  host: <hostip>
  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 <ip-of-the-salt-device> port xxx any any
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值