2015-12-17 177 views
0

我是新来的红宝石,我正在写一个傀儡模块,通过工头访问。从数组创建参数?

我写它由福尔曼的智能类参数使用,所以它可以从福尔曼的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 
    } 
    } 
} 
+0

== >> arr = Array(1..10)= then => arr.each {| x |把“wadupp#{x}”} – zee

+0

与我在做的事情不一样吗?一个完整的例子是什么样的? – red888

+1

删除了[ruby]标签,因为它比这个问题的相关性更混乱。 –

回答

3

正如我所理解的问题,你想要声明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 
    } 
    } 
} 

但这假设你使用木偶4,否则木偶3未来解析器。它可以与标准的木偶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 
    } 
} 

注意,当阵列是作为一个资源的标题,这意味着你宣布一个资源的每个元素该数组全部具有相同的参数。

+0

我有stdlib在我的模块文件夹,我可以看到它在管工下的木偶类,所以我想它的安装?但是,当我用你的代码更新这个模块的init.pp文件并从Foreman运行导入时,它看不到它(说“没有检测到变化..”)。并且要清楚的是,如果在本模块的init.pp中使用我的第一个示例中的代码,Foreman将毫无问题地上传它。 – red888

+1

@ red888,您的第一个示例中的代码格式错误,因此特定代码没有您描述的结果。您之前使用的版本是否可能会为所有48个端口声明资源?如果您现在声明的状态与当前状态匹配,则确实不应该有任何更改。 –

+0

你的权利是畸形的!对不起,我只是修好了。第一个例子中的代码现在可以工作(Foreman导入它没有问题)。 – red888