从数组创建参数?
Create parameters from an array?
我是 ruby 的新手,我正在编写一个可以通过 Foreman 访问的人偶模块。
我写它是为了供 Foreman 的 Smart Class 参数使用,因此它可以从 Foreman Web 控制台进行配置。
我试图了解如何为设备可能具有的 48 个可能端口创建参数。我想知道是否可以动态地执行此操作,而不是手动输入端口。
例如,而不是这个:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface'
) {
interface {
'FastEthernet 0/1':
description => $interface_description_lan
}
interface {
'FastEthernet 0/2':
description => $interface_description_lan
}
}
我想这样做:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
interface {
(0..48).each do |i|
"FastEthernet 0/#{i}":
description => $interface_description_lan
end
}
}
根据评论者的建议,我尝试了这个,但它不起作用:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
arrInterfaces = Array(1..48)
arrInterfaces.each{
interface {
|intNum| puts "FastEthernet 0/#{intNum}":
description => $interface_description_lan
}
}
}
据我了解,您要声明 48 个资源,使用基于资源索引的标题,并且所有资源都具有相同的参数值。当然,这必须在 Puppet DSL 中实现,尽管它与 Ruby 有一些相似之处,但它不是 Ruby。这似乎造成了一些混乱。
为此安装 puppetlabs-stdlib 模块很有用,它提供了多种有用的扩展功能。 range()
可以帮到我们。如果安装了 stdlib,像这样的东西应该可以解决问题:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
each(range('1', '48')) |portnum| {
interface { "FastEthernet 0/${portnum}":
description => $interface_description_lan
}
}
}
假设您使用的是 Puppet 4,或者 Puppet 3 以及未来的解析器。它也可以用标准的 Puppet 3 解析器来完成,但不是那么干净:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
$portnums = split(inline_template("<%= (1..48).to_a.join(',') %>"), ',')
$ifc_names = regsubst($portnums, '.*', 'FastEthernet 0/[=11=]')
interface { $ifc_names:
description => $interface_description_lan
}
}
请特别注意,当数组作为资源标题给出时,这意味着您正在为数组的每个元素声明一个资源,所有元素都具有相同的参数。
我是 ruby 的新手,我正在编写一个可以通过 Foreman 访问的人偶模块。
我写它是为了供 Foreman 的 Smart Class 参数使用,因此它可以从 Foreman Web 控制台进行配置。
我试图了解如何为设备可能具有的 48 个可能端口创建参数。我想知道是否可以动态地执行此操作,而不是手动输入端口。
例如,而不是这个:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface'
) {
interface {
'FastEthernet 0/1':
description => $interface_description_lan
}
interface {
'FastEthernet 0/2':
description => $interface_description_lan
}
}
我想这样做:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
interface {
(0..48).each do |i|
"FastEthernet 0/#{i}":
description => $interface_description_lan
end
}
}
根据评论者的建议,我尝试了这个,但它不起作用:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
arrInterfaces = Array(1..48)
arrInterfaces.each{
interface {
|intNum| puts "FastEthernet 0/#{intNum}":
description => $interface_description_lan
}
}
}
据我了解,您要声明 48 个资源,使用基于资源索引的标题,并且所有资源都具有相同的参数值。当然,这必须在 Puppet DSL 中实现,尽管它与 Ruby 有一些相似之处,但它不是 Ruby。这似乎造成了一些混乱。
为此安装 puppetlabs-stdlib 模块很有用,它提供了多种有用的扩展功能。 range()
可以帮到我们。如果安装了 stdlib,像这样的东西应该可以解决问题:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
each(range('1', '48')) |portnum| {
interface { "FastEthernet 0/${portnum}":
description => $interface_description_lan
}
}
}
假设您使用的是 Puppet 4,或者 Puppet 3 以及未来的解析器。它也可以用标准的 Puppet 3 解析器来完成,但不是那么干净:
class ciscobaseconfig (
$interface_description_lan = 'A LAN interface',
) {
$portnums = split(inline_template("<%= (1..48).to_a.join(',') %>"), ',')
$ifc_names = regsubst($portnums, '.*', 'FastEthernet 0/[=11=]')
interface { $ifc_names:
description => $interface_description_lan
}
}
请特别注意,当数组作为资源标题给出时,这意味着您正在为数组的每个元素声明一个资源,所有元素都具有相同的参数。