Scripting

具有整數範圍的 Puppet case 語句

  • August 25, 2018

我需要使用一些範圍編寫一個案例,以便以更好的方式編寫如下意大利麵條程式碼:

if $mem < 1024 { $retvalue = "128M" } elsif $mem < 7000 { $retvalue = "160M" } elsif $mem < 15000 { $retvalue = "192M" } elsif $mem < 31000 { $retvalue = "256M" } else { $retvalue = "512M" }

是否可以通過使用範圍函式(在 stdlib 上)或比這更好的東西來使用 case 語句?

BR

朱塞佩

對於這種大小的範圍,我建議不要創建範圍(即,用於掃描的充滿整數值的數組)。

你的方法是可靠的。如果你真的想要一個 case 語句,你可以選擇一段 Ruby 程式碼和inline_template函式,但這會降低性能並且不會增加可維護性。

Puppet 的case語句可以評估表達式,並將執行與第一個匹配案例相關聯的第一個。

它不太支持這一點:

case $mem {
 0..1023:      { $retvalue = "128M" }
 1024..6999:   { $retvalue = "160M" }
 7000...14999: { $retvalue = "192M" }
 15000..30999: { $retvalue = "256M" }
 default:      { $retvalue = "512M" }
}

但是,您可以給它表達式並告訴它匹配第一個true.

所以你可以這樣做:

case true {
 $mem < 1024:  { $retvalue = "128M" }
 $mem < 7000:  { $retvalue = "160M" }
 $mem < 15000: { $retvalue = "192M" }
 $mem < 31000: { $retvalue = "256M" }
 default:      { $retvalue = "512M" }
}

同樣,您可以使用選擇器返回正確的值:

$retvalue = true ? {
 $mem < 1024  => "128M",
 $mem < 7000  => "160M",
 $mem < 15000 => "192M",
 $mem < 31000 => "256M",
 default      => "512M",
}

引用自:https://serverfault.com/questions/708197