2015-12-17 218 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