用puppet管理网络设备
2013-02-13 15:58
155 查看
Puppet 基于C/S的模型,利用agent和master两种角色提供扩展性极强的批量配置变更方案,在服务器/桌面领域的自动化配置方面得到了广泛使用,在数据中心和云计算如火如荼的今天,Google /Cisco/Vmware 这些业界大佬都投资了这家以开源软件puppet为基础的商业化公司puppetlabs, 足见其发展潜力较大,这家公司也推出了商用版本Puppet Enterprise。Puppet提供的模块化平台forge 也方便管理模块的共享,扩展其管理的广度。
数据中心领域涉及到对服务器、存储设备及网络设备的管理,网上对服务器的管理例子有很多,包括传统的NTP, Mysql管理、云计算平台的Openstack管理和虚拟化平台vCenter的管理,但对于网络设备直接管理的例子较少。这主要是由于网络设备实现的特殊性,一般不能直接安装puppet作为agent实现被管理端的功能。在2.7之后的版本puppet提供了proxy的机制来实现对远端网络设备的管理。
Puppet的官网上提供了两个例子来实现对网络设备的管理。
1. Cisco设备的管理。
2. F5 Load Balance设备的管理。
本文就这些例子做些深入剖析,探讨下如何自己开发模块支持其他厂商设备。
Puppet提供device 机制来实现对远端网络设备的管理,目前版本仅支持对Cisco IOS设备的管理,且管理功能极其有限,仅可以支持接口和VLAN的配置。当然如果使用模块来扩展对设备的支持,比如对F5设备的管理模块puppetlabs-f5,就可以实现丰富的管理功能。下面详细分析下这两种方法。
目前Type仅支持cisco一种,URL方法也仅支持Telnet和SSH两种,具体实现可以参考源码中“lib\puppet\util\network_device”这个目录的实现。
设备的Puppet配置及运行命令
如何将这种配置映射成相应的IOS命令,并通过Telnet/SSH下发给具体的设备,就是实现各种设备适配的重点了。举一个例子说明,对于Interface的配置,参考源码中类“Puppet::Util::NetworkDevice::Cisco::Interface”的实现就可以管中窥豹。
如此看来,扩展其他厂商的设备或者增加路由/ACL之类的配置实现并不困难,也就是体力活,只是抽象好的话,实现起来或许能再简洁些。
puppetlabs-f5模块就是利用Rudy实现的iControl API来和设备进行交互通信的。
在/etc/puppet/device.conf中如下配置
设备的Puppet配置如下,配置一个rule及一个服务器池。
通过对puppetlabs-f5源码中类“Puppet::Util::NetworkDevice::F5::Device”的分析,不难看出 iControl API 是其实现的基础。
@transport ||= F5::IControl.new(@url.host, @url.user, @url.password, modules).get_interfaces
通过这个接口获取各个模块的配置接口,从而可以完成VirtualServer、NodeAddress及Monitor等重要元素的配置。
总结一下,这种方法适合被管设备侧实现了基于SOAP或Netconf等高级的网管配置协议,并且厂商提供了完善的SDK。比如H3C的IPS及ACG产品就提供了基于SOAP的管理API。
数据中心领域涉及到对服务器、存储设备及网络设备的管理,网上对服务器的管理例子有很多,包括传统的NTP, Mysql管理、云计算平台的Openstack管理和虚拟化平台vCenter的管理,但对于网络设备直接管理的例子较少。这主要是由于网络设备实现的特殊性,一般不能直接安装puppet作为agent实现被管理端的功能。在2.7之后的版本puppet提供了proxy的机制来实现对远端网络设备的管理。
Puppet的官网上提供了两个例子来实现对网络设备的管理。
1. Cisco设备的管理。
2. F5 Load Balance设备的管理。
本文就这些例子做些深入剖析,探讨下如何自己开发模块支持其他厂商设备。
Puppet提供device 机制来实现对远端网络设备的管理,目前版本仅支持对Cisco IOS设备的管理,且管理功能极其有限,仅可以支持接口和VLAN的配置。当然如果使用模块来扩展对设备的支持,比如对F5设备的管理模块puppetlabs-f5,就可以实现丰富的管理功能。下面详细分析下这两种方法。
Cisco 设备的原生支持
在/etc/puppet/device.conf中如下配置
[device1 certname]
type cisco
url ssh://puppet:letmein@device.domain.com/
[device2 certname]
type cisco
url telnet://puppet:letmein@router.domain.com/?enable=enablepassword
目前Type仅支持cisco一种,URL方法也仅支持Telnet和SSH两种,具体实现可以参考源码中“lib\puppet\util\network_device”这个目录的实现。设备的Puppet配置及运行命令
puppet device --server
后检查执行效果如下。
node "c2950.domain.com" { interface { "GigabitEthernet0/1": description => "--> to upstream router", mode => trunk, allowed_trunk_vlans => "99, 1000" } }
c2950#sh running-config interface GigabitEthernet 0/1 Building configuration... ... interface GigabitEthernet0/1 description --> to upstream router switchport trunk allowed vlan 99,1000 switchport mode trunk end
如何将这种配置映射成相应的IOS命令,并通过Telnet/SSH下发给具体的设备,就是实现各种设备适配的重点了。举一个例子说明,对于Interface的配置,参考源码中类“Puppet::Util::NetworkDevice::Cisco::Interface”的实现就可以管中窥豹。
COMMANDS = { # property => order, ios command/block/array :description => [1, "description %s"], :speed => [2, "speed %s"], :duplex => [3, "duplex %s"], :native_vlan => [4, "switchport access vlan %s"],
如此看来,扩展其他厂商的设备或者增加路由/ACL之类的配置实现并不困难,也就是体力活,只是抽象好的话,实现起来或许能再简洁些。
F5设备的模块支持
Cisco设备的支持是通过Telnet/SSH等传统的登陆方法,而F5的TMOS就是基于Linux系统的,且提供了基于SOAP的iControl API来实现对设备的管理功能。puppetlabs-f5模块就是利用Rudy实现的iControl API来和设备进行交互通信的。
在/etc/puppet/device.conf中如下配置
[f5.puppetlabs.lan] type f5 url https://username:password@f5.puppetlabs.lan/partition
设备的Puppet配置如下,配置一个rule及一个服务器池。
node f5.puppetlabs.lan { f5_rule { 'redirect_404': ensure => 'present', definition => 'when HTTP_RESPONSE { if { [HTTP::status] eq "404" } { redirect to "http://www.puppetlabs.com/redirect/404"}}', f5_pool { 'webapp': ensure => 'present', action_on_service_down => 'SERVICE_DOWN_ACTION_NONE'', member => { '10.10.0.1:80' => {'connection_limit' => '0', 'dynamic_ratio' => '1', 'priority' => '0', 'ratio' => '1'}, '10.10.0.2:80' => {'connection_limit' => '0', 'dynamic_ratio' => '1', 'priority' => '0', 'ratio' => '1'}, }, minimum_active_member => '1', minimum_up_member => '0', } }
通过对puppetlabs-f5源码中类“Puppet::Util::NetworkDevice::F5::Device”的分析,不难看出 iControl API 是其实现的基础。
@transport ||= F5::IControl.new(@url.host, @url.user, @url.password, modules).get_interfaces
通过这个接口获取各个模块的配置接口,从而可以完成VirtualServer、NodeAddress及Monitor等重要元素的配置。
总结一下,这种方法适合被管设备侧实现了基于SOAP或Netconf等高级的网管配置协议,并且厂商提供了完善的SDK。比如H3C的IPS及ACG产品就提供了基于SOAP的管理API。
相关文章推荐
- Mocha BSM基础架构管理――网络设备
- 网络硬件设备配置与管理(CCNA)上
- 网络设备配置与管理----调试Cisco Catalyst交换机
- Ansible用于网络设备管理 part 4 使用NAPALM成品库+Gabriele的方法+循环
- 使用域账号统一管理cisco网络设备
- 使用域账号统一管理cisco网络设备
- 第九章网络设备文件管理
- Linux kernel中网络设备的管理
- 网络设备配置与管理
- 利用Powershell SSH-Session 工具管理 linux或网络设备 推荐
- 图解框架-android网络设备管理
- 限制公司内部对网络设备的管理,只允许有权限的人员管理
- 网络设备配置与管理
- 网络设备配置与管理----通过VLAN划分隔离各公司的网络
- 静态路由、管理网络设备
- 2014-04-20 设备管理之网络设备驱动框架
- 网络设备配置与管理---VLAN间路由实现部门间通信
- Ansible用于网络设备管理 part 3 使用NAPALM成品库
- Linux kernel中网络设备的管理