从数组创建参数?

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
  }
}

请特别注意,当数组作为资源标题给出时,这意味着您正在为数组的每个元素声明一个资源,所有元素都具有相同的参数。