网络自动化是使计算机网络的配置、管理和操作自动化的一个持续过程。 尽管可以将其抽象并与服务器端的操作进行比较,但是仍然存在许多特殊的挑战,最重要的是,网络设备通常是封闭的硬件,只能运行专有软件。 换句话说,用户不能直接在传统的网络设备上安装salt-minion。 由于这些原因,大多数网络设备只能通过proxy minion或使用Salt SSH进行远程控制。 但是,也有一些厂商生产白盒设备(例如Arista,Cumulus)或其他已将操作系统移到容器中的设备(例如Cisco NX-OS,Cisco IOS-XR),从而使salt-minion可以直接安装在平台上。
Carbon (2016.11)
网络自动化的方法已在2016.11.0中引入。 网络自动化支持是基于proxy minions实现的。
NAPALM(具有多供应商支持的网络自动化和可编程性抽象层)是一个开源的Python库,该库实现了一组功能,以使用统一的API与不同的路由器供应商设备进行交互。 由于与供应商无关,因此简化了操作,因为配置和与网络设备的交互不依赖于特定的供应商。
从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相关操作的通用帮助器。 例如,可以在状态模块内部使用“合规性”报告功能来比较预期配置和现有配置。
安装 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
查看在 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
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的proxy代理基础架构,该基础结构允许对Junos设备进行远程执行和配置管理,而无需在设备上安装SaltStack。 这些基础设施包括:
执行和状态模块是使用junos-eznc(PyEZ)实现的。 Junos PyEZ是Python的微框架,使您能够远程管理和自动化运行Junos操作系统的设备。
在将运行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执行和状态模块。 以下是一些使用示例。
有关所有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
有关所有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是一个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