12-Puppet配置
本章节下载: 12-Puppet配置 (301.55 KB)
目 录
Puppet是开源的配置管理工具,用户使用Puppet语言将需要对设备进行的配置写成脚本,并保存到服务器中,再通过服务器把这些配置脚本下发到各网络设备,实现对网络设备的集中配置管理。
图1-1 Puppet网络架构
如图1-1所示,Puppet采用“服务器端/客户端”网络架构,服务器端称为Puppet master,客户端称为Puppet agent,Puppet master与Puppet agent之间使用通过SSL加密的连接进行通信。
Puppet master用于对Puppet agent进行集中管理,其主要功能如下:
· 以守护进程的方式运行,监听Puppet agent的请求。
· 建立连接时,Puppet master需要对Puppet agent进行认证。
· 集中保存配置脚本,并根据用户要求将配置脚本下发到Puppet agent。
关于Puppet master的详细安装和配置,请参见Puppet官方网站:https://puppetlabs.com。
Puppet网络中,由Puppet master集中管理的设备称为Puppet agent。Puppet agent的工作过程如下:
(1) Puppet agent启动Puppet进程,并向Puppet master发起认证请求。
(2) Puppet agent默认会周期性(缺省为2分钟)检查认证是否通过,认证通过后,Puppet agent与Puppet master建立连接。
(3) Puppet agent与Puppet master建立连接后,Puppet agent周期性(缺省为30分钟)向Puppet master发送请求获取最新配置。
(4) Puppet agent获取到最新配置,并将最新配置与设备当前运行的配置进行对比,如果设备当前运行配置与获取的配置不同,则运行最新配置。
(5) Puppet agent完成配置后,向Puppet master反馈配置结果。
H3C设备中,Puppet以Puppet agent方式运行,版本为3.7.3。
Puppet使用Puppet语言定义配置项,各配置项的集合即为一个配置脚本。在Puppet中,配置项叫做资源。
Puppet划分了多个不同类型的资源,每个类型的资源都由名称和多个属性组成,每个属性对应功能的一个配置,属性值即为该配置应达到的状态。用户在对Puppet资源进行配置时,通过为不同属性赋值,从而指定设备应该达到的状态,而不需要关心如何达到这些状态。例如:用户只需要指定设备创建哪一个VLAN,而不需要关心如何创建该VLAN。如下以创建VLAN 2,并为该VLAN配置描述信息为例介绍Puppet资源的构成:
netdev_vlan{'vlan2':
ensure => undo_shutdown,
id => 2,
description => 'sales-private',
require => Netdev_device['device'],
}
在该例中,各字段含义如下:
· netdev_vlan字段表示资源类型,netdev_vlan表示该资源用来配置VLAN。
· vlan2为资源名称,在资源文件内,每个资源都有唯一的资源名称,用于标识该资源。
· ensure、id、description和require分别表示该资源的属性。每个资源都需要一系列属性来确定他们最终达到的状态。
¡ ensure的值为undo_shutdown、id的值为2表示创建VLAN ID为2的VLAN。如果要删除VLAN,则需要将ensure属性的值指定为shutdown。
¡ description的值为sales-private表示配置VLAN2的描述信息为sales-private。
¡ require属性表示netdev_vlan资源依赖于名称为device的netdev_device资源。有些资源之间存在依赖关系,此时需要配置require属性,并在该属性中指定该资源依赖的资源类型和资源名称。
关于Puppet支持的所有资源类型,请参见2 Puppet资源列表。
Puppet master上部署的Puppet版本不能低于Puppet agent的Puppet版本。
配置Puppet功能前,用户必须先配置如下功能:
· 开启NETCONF over SSH功能:Puppet master通过NETCONF over SSH方式向Puppet agent下发配置。关于NETCONF over SSH功能的详细配置请参见“网络管理和监控配置指导”中的“NETCONF”。
· 配置设备可以通过SSH登录:Puppet master与Puppet agent使用SSH进行通信。关于SSH登录功能的详细配置请参见“基础配置指导”中的“登录设备”。
· 配置Puppet agent与Puppet master之间使用NTP或手工方式进行时钟同步,否则可能导致双方无法互通。关于时钟同步的详细配置请参见“基础配置指导”中的“设备管理”,以及“网络管理和监控配置指导”中的“NTP”和“PTP”。
在Puppet master上创建并编辑资源。关于Puppet master的详细配置方法,具体请参见Puppet master的安装和使用指导。
(1) 进入系统视图。
system-view
(2) 启动Puppet。
third-part-process start name puppet arg agent --certname=certname --server=server
缺省情况下,Puppet处于关闭状态。
参数 |
说明 |
--certname=certname |
Puppet agent的地址 |
--server=server |
Puppet master的地址 |
执行third-part-process start命令后,Puppet agent将向Puppet master发起认证请求。关于该命令的详细介绍,请参见“网络管理和监控”中的“进程监控和维护”。
在Puppet master上执行puppet cert sign certname命令对Puppet agent签发证书。签发成功后,Puppet agent将与Puppet master建立SSL通信,并下载资源对设备进行配置。
执行display process all命令查看所有进程信息,“THIRD”字段标识为“Y”的进程为第三方进程,“PID”字段即为进程pid。“COMMAND”字段为“puppet /opt/ruby/bin/pu”的进程为Puppet进程。
(1) 进入系统视图。
system-view
(2) 关闭Puppet。
third-part-process stop pid pid-list
关于third-part-process stop命令的详细介绍,请参见“网络管理和监控”中的“进程监控和维护”。
Puppet agent与Puppet master相连,设备的IP地址和掩码如图1-2所示。
通过Puppet在设备上创建ID为3的VLAN。
设备作为SSH服务器登录时的用户名为user,密码为passwd。
图1-2 Puppet配置组网图
(1) 在Puppet agent上配置设备通过SSH登录,并开启NETCONF over SSH功能。
(2) 在Puppet master上编辑资源。
# 在目录/etc/puppet/下创建保存配置脚本文件的目录modules/custom/manifests。
$ mkdir -p /etc/puppet/modules/custom/manifests
# 在目录manifests下创建配置脚本文件init.pp,编辑内容如下:
netdev_device{'device':
ensure => undo_shutdown,
username => 'user',
password => 'passwd',
ipaddr => '1.1.1.1',
}
netdev_vlan{'vlan3':
ensure => undo_shutdown,
id => 3,
require => Netdev_device['device'],
}
(3) 在设备上执行third-part-process start命令启动Puppet。
<PuppetAgent> system-view
[PuppetAgent] third-part-process start name puppet arg agent --certname=1.1.1.1 --server=1.1.1.2
(4) 在Puppet master上对Puppet agent的请求进行认证。
$ puppet cert sign 1.1.1.1
Puppet agent通过认证后,Puppet agent将获取Puppet master中的配置脚本到本地,并运行该脚本,实现对设备各功能的配置。
该资源用来配置设备的名称,并指定设备与Puppet master建立连接时使用的IP地址、SSH用户名及密码。
表2-1 netdev_device资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
ensure |
建立或断开设备与Puppet master的NETCONF连接 |
无 |
数据类型为符号,取值包括: · undo_shutdown/present:表示建立设备与Puppet master的NETCONF连接 · shutdown/absent:表示断开设备与Puppet master的NETCONF连接 |
hostname |
设备名称 |
无 |
数据类型为字符串,取值为1~64个字符,区分大小写 |
ipaddr |
设备的IP地址 |
无 |
数据类型为字符串,格式为点分十进制 |
username |
SSH登录用户名 |
无 |
数据类型为字符串,取值为1~55个字符,区分大小写 |
password |
SSH用户密码 |
无 |
数据类型为字符串,区分大小写。非FIPS模式下,明文密码为1~63个字符;哈希密码为1~110个字符;密文密码为1~117个字符 |
配置设备的名称为PuppetAgent,与Puppet master建立连接时使用的IP地址为1.1.1.1,SSH用户名为user,SSH用户密码为123456。
netdev_device{'device':
ensure => undo_shutdown,
username => 'user',
password => '123456',
ipaddr => '1.1.1.1',
hostname => 'PuppetAgent'
}
该资源用来配置接口的属性。
表2-2 netdev_interface资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
ifindex |
接口索引 |
索引 |
数据类型为整型 |
ensure |
接口的属性 |
无 |
数据类型为符号,取值只能为undo_shutdown/present |
description |
接口的描述信息 |
无 |
数据类型为字符串,取值为1~255个字符,区分大小写 |
admin |
接口管理状态 |
无 |
数据类型为符号,取值包括: · up:接口的管理状态为开启 · down:接口的管理状态为关闭 |
speed |
接口速率 |
无 |
数据类型为符号,取值包括: · auto:表示接口速率处于自协商状态 · 10m:表示接口速率为10Mbps · 100m:表示接口速率为100Mbps · 1g:表示接口速率为1Gbps · 10g:表示接口速率为10Gbps · 40g:表示接口速率为40Gbps · 100g:表示接口速率为100Gbps |
duplex |
以太网接口的双工模式 |
无 |
数据类型为符号,取值包括: · full:全双工状态,接口在发送数据包的同时可以接收数据包 · half:半双工状态,接口同一时刻只能发送数据包或接收数据包 · auto:接口与对端接口的双工模式为自动协商 仅以太网接口支持该配置 |
linktype |
接口的链路类型 |
无 |
数据类型为符号,取值包括: · access:配置接口的链路类型为Access类型 · trunk:配置接口的链路类型为Trunk类型 · hybrid:配置接口的链路类型为Hybrid类型 仅二层以太网接口支持该配置 |
portlayer |
以太网接口的工作模式 |
无 |
数据类型为符号,取值包括: · bridge:配置以太网接口工作在二层模式 · route:配置以太网接口工作在三层模式 |
mtu |
三层以太网接口允许通过的MTU的大小 |
无 |
数据类型为整型,取值范围取决于接口的类型,单位为字节 仅三层以太网接口支持该配置 |
配置索引为2的以太网接口的如下属性:
· 接口的描述信息为puppet interface 2。
· 管理状态为开启。
· 接口速率为自动协商。
· 接口与对端接口的双工模式为自动协商。
· 端口的链路类型为Hybrid类型。
· 以太网接口工作在二层模式。
· 配置三层以太网接口允许通过的MTU的大小为1500。
netdev_interface{'ifindex2':
ifindex => 2,
ensure => undo_shutdown,
description => 'puppet interface 2',
admin => up,
speed => auto,
duplex => auto,
linktype => hybrid,
portlayer => bridge,
mut => 1500,
require => Netdev _device['device'],
}
该资源用来配置二层以太网接口的VLAN属性。
表2-3 netdev_l2_interface资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
ifindex |
二层以太网接口索引 |
索引 |
数据类型为整型 |
ensure |
二层以太网接口的VLAN属性 |
无 |
数据类型为符号,取值只能为undo_shutdown/present |
pvid |
端口的缺省VLAN |
无 |
数据类型为整型,取值范围为1~4094 |
permit_vlan_list |
接口允许通过的VLAN列表 |
无 |
数据类型为字符串 VLAN的取值范围为1~4094 一次可以配置多个VLAN,各VLAN间使用逗号分隔。两个逗号之间可以是一个单独的VLAN,也可以是一个VLAN范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个VLAN范围的开始和结束。 字符串的结尾不能含有逗号、连字符“-”或空格 |
untagged_vlan_list |
端口在转发指定的VLAN报文时将去掉VLAN Tag |
无 |
数据类型为字符串 VLAN的取值范围为1~4094 一次可以配置多个VLAN,各VLAN间使用逗号分隔。两个逗号之间可以是一个单独的VLAN,也可以是一个VLAN范围。例如:1,2,3,5-8,10-20 使用连字符-分隔一个VLAN范围的开始和结束 字符串的结尾不能含有逗号、连字符“-”或空格 同一个VLAN不能在untagged_vlan_list和tagged_vlan_list列中同时指定 |
tagged_vlan_list |
转发指定的VLAN报文时将携带VLAN Tag |
无 |
数据类型为字符串 VLAN的取值范围为1~4094 一次可以配置多个VLAN,各VLAN间使用逗号分隔。两个逗号之间可以是一个单独的VLAN,也可以是一个VLAN范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个VLAN范围的开始和结束。 字符串的结尾不能含有逗号、连字符“-”或空格 同一个VLAN不能在untagged_vlan_list和tagged_vlan_list列中同时指定 |
配置索引为3的接口的缺省VLAN为2,允许ID为1~6的VLAN通过,并设置VLAN1~VLAN3的报文通过该接口时去掉VLAN Tag,VLAN4~VLAN6的报文通过该接口时携带VLAN Tag。
netdev_l2_interface{'ifindex3':
ifindex => 3,
ensure => undo_shutdown,
pvid => 2,
permit_vlan_list => '1-6',
untagged_vlan_list => '1-3',
tagged_vlan_list => '4,6'
require => Netdev _device['device'],
}
该资源用来创建、修改或删除聚合组。
表2-4 netdev_lagg资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
group_id |
聚合组ID |
索引 |
数据类型为整型 二层聚合组的组ID范围为1~1024 三层聚合组的组ID范围为16385~17408 |
ensure |
创建或删除聚合组 |
无 |
数据类型为符号,取值包括: · present:表示创建或修改聚合组 · absent:表示删除聚合组 |
linkmode |
聚合组工作模式 |
无 |
数据类型为符号,取值包括: · static:表示静态聚合 · dynamic:表示动态聚合 |
addports |
加入聚合组的接口索引列表 |
无 |
数据类型为字符串 一次可以配置多个接口索引,各接口索引间使用逗号分隔。两个逗号之间可以是一个单独的接口索引,也可以是一个接口索引范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口索引范围的开始和结束 字符串的结尾不能含有逗号、连字符“-”或空格 同一个接口不能在addports和deleteports列中同时指定 |
deleteports |
从聚合组删除的接口索引列表 |
无 |
数据类型为字符串 一次可以配置多个接口索引,各接口索引间使用逗号分隔。两个逗号之间可以是一个单独的接口索引,也可以是一个接口索引范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口索引范围的开始和结束 字符串的结尾不能含有逗号、连字符“-”或空格 同一个接口不能在addports和deleteports列中同时指定 |
配置ID为2的聚合组,将索引为1和2的接口加入聚合组,并从聚合组中删除索引为3和4的接口。
netdev_lagg{ 'lagg2':
group_id => 2,
ensure => present,
addports => '1,2',
deleteports => '3,4',
require => Netdev _device['device'],
}
该资源用来创建、修改或删除VLAN,并配置VLAN的描述信息。
表2-5 netdev_vlan资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
ensure |
创建、修改或删除VLAN |
无 |
数据类型为符号,取值包括: · undo_shutdown/present:表示创建或修改VLAN · shutdown/absent:表示删除VLAN |
id |
VLAN ID |
索引 |
数据类型为无符号整型,取值范围为1~4094 |
description |
VLAN描述信息 |
无 |
数据类型为字符串,取值为1~255个字符,区分大小写 |
创建VLAN 2,并将该VLAN的描述信息配置为sales-private。
netdev_vlan{'vlan2':
ensure => undo_shutdown,
id => 2,
description => 'sales-private',
require => Netdev_device['device'],
}
该资源用来创建、修改或删除VSI。
表2-6 netdev_vsi资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
vsiname |
VSI的名称 |
索引 |
数据类型为字符串,取值为1~31个字符,区分大小写 |
ensure |
创建或删除VSI |
无 |
数据类型为符号,取值包括: · present:表示创建或修改VSI · absent:表示删除VSI |
description |
VSI的描述信息 |
无 |
数据类型为字符串,取值为1~80个字符,区分大小写 |
创建名为vsia的VSI。
netdev_vsi{'vsia':
ensure => present,
vsiname => 'vsia',
require => Netdev_device['device'],
}
这个资源用来创建或删除隧道。
表2-7 netdev_vte资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
id |
隧道 ID |
索引 |
数据类型为整型 |
ensure |
创建或删除隧道 |
无 |
数据类型为符号,取值包括: · present:表示创建隧道 · absent:表示删除隧道 |
mode |
隧道模式 |
无 |
数据类型为整型,取值包括: · 1:运行IPv4协议的GRE 隧道 · 2:运行IPv6协议的GRE 隧道 · 3:IPv4与IPv4之间的隧道 · 4:手动配置的IPv6到IPv4的隧道 · 5:IPv6到 IPv4的自动隧道 · 6:IPv6到IPv4 的6to4隧道 · 7:IPv6到IPv4的ISATAP隧道 · 8:用IPv6封装IPv6 或IPv4报文 · 14:基于IPv4传输协议的组播GRE隧道 · 15:基于IPv6传输协议的组播GRE隧道 · 16:基于IPv4传输协议的IPsec隧道 · 17:基于IPv6传输协议的IPsec隧道 · 24:基于UDP passenger协议和IPv4传输协议的VXLAN隧道 · 25:基于UDP passenger协议和IPv6传输协议的VXLAN隧道 创建隧道时必须指定隧道模式,且创建后不能再对该隧道模式进行修改 |
创建ID为2、基于UDP passenger协议和IPv4传输协议的VXLAN隧道。
netdev_vte{'vte2':
ensure => present,
id => 2,
mode => 24,
require => Netdev_device['device'],
}
该资源用来创建、修改或删除VXLAN。
表2-8 netdev_vxlan资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
vxlan_id |
VXLAN ID |
索引 |
数据类型为整型,取值范围为0~16777215 |
ensure |
创建或删除VXLAN |
无 |
数据类型为符号,取值包括: · present:表示创建或修改VXLAN · absent:表示删除VXLAN |
vsiname |
VSI的名称 |
无 |
数据类型为字符串,取值为1~31个字符,区分大小写 创建VSI时必须指定该列,且该列在创建后不能修改 |
add_tunnels |
配置VXLAN与隧道接口关联 |
无 |
数据类型为字符串 一次可以配置多个隧道接口编号,各接口编号间使用逗号分隔。两个逗号之间可以是一个单独的接口编号,也可以是一个接口编号范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口编号范围的开始和结束 字符串的结尾不能含有逗号、连字符“-”或空格 同一个隧道接口的编号不能在add_tunnels和delete_tunnels中同时指定 |
delete_tunnels |
取消VXLAN与隧道接口关联 |
无 |
数据类型为字符串,隧道接口的编号 一次可以配置多个隧道接口编号,各接口编号间使用逗号分隔。两个逗号之间可以是一个单独的接口编号,也可以是一个接口编号范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口编号范围的开始和结束。 字符串的结尾不能含有逗号、连字符“-”或空格 同一个隧道接口的编号不能在add_tunnels和delete_tunnels中同时指定 |
创建ID为10的VXLAN,添加名为vsia的VSI,并将隧道接口7和8与该VXLAN关联。
netdev_vxlan{'vxlan10':
ensure => present,
vxlan_id => 10,
vsiname => 'vsia',
add_tunnels => '7-8',
require=>Netdev_device['device'],
}
不同款型规格的资料略有差异, 详细信息请向具体销售和400咨询。H3C保留在没有任何通知或提示的情况下对资料内容进行修改的权利!