【问题标题】:Create parameters from an array?从数组创建参数?
【发布时间】:2016-03-24 10:21:11
【问题描述】:

我是 ruby​​ 新手,正在编写一个可通过 Foreman 访问的 puppet 模块。

我编写它是为了供 Foreman 的智能类参数使用,以便可以从 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
    }
  }
}

【问题讨论】:

  • ==>> arr = Array(1 .. 10) =then=> arr.each { |x|放“wadupp#{x}”}
  • 这不是我正在做的事情吗?一个完整的例子会是什么样子?
  • 删除了 [ruby] 标签,因为它比与此问题相关的更令人困惑。
  • 抱歉,我对 ruby​​ 和 puppet 还很陌生,所以不确定是 ruby​​ 问题还是 puppet DSL 问题

标签: puppet theforeman


【解决方案1】:

据我了解,您想要声明 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/\0')

  interface { $ifc_names:
      description => $interface_description_lan
  }
}

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

【讨论】:

  • 我的模块文件夹中有stdlib,我可以在Puppet Classes 下的Foreman 中看到它,所以我猜它安装了?但是,当我使用您的代码更新此模块的 init.pp 文件并从 Foreman 运行导入时,它看不到它(显示“未检测到更改......”)。为了清楚起见,如果在此模块的 init.pp 中使用我的第一个示例中的代码,Foreman 将毫无问题地上传它。
  • @red888,您的第一个示例中的代码格式错误,因此该特定代码肯定没有您描述的结果。您之前使用的版本是否为所有 48 个端口声明了资源?如果您现在断言的状态与当前状态匹配,则确实不应该有任何更改。
  • 你的权利它格式错误!对不起,我刚刚修好了。第一个示例中的代码现在可以工作了(工头导入它没有问题)。
  • Foreman 似乎还不支持 Puppet 4。我添加了一个适用于 Puppet 3 的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 2021-10-02
相关资源
最近更新 更多