Puppet
為什麼 Puppet 可以只要求每個包一次?
在類中定義依賴項時,每個依賴項
Package
只能全域定義一次。我有配置層次結構,一些包應該安裝在所有機器上(即預設配置),但其他包應該只安裝在某些類別的機器上。當 Puppet 威脅作為重複聲明時,我應該如何檢查該包是否已經在機器上?Duplicate declaration: Package[wget] is already declared
我應該使用這樣的功能嗎?
if defined( Package[$package] ) { debug("$package already installed") } else { package { $package: ensure => $ensure } }
我希望配置工具預設處理這個問題……我錯過了什麼嗎?
您可以使用stdlib 模組中的 ensure_resource() :
$packages = $::osfamily ? { 'Debian' => [ 'fcgiwrap', ], 'RedHat' => [ 'spawn-fcgi', 'git' ], } ensure_resource('package', $packages, {'ensure' => 'present'})
所以,比如說,如果 git 已經被其他一些類安裝了,那將被跳過。您不應該關心在整個 puppet 配置中只定義一次包。
當您有重複的包時,這是處理它的一種方法。另一種方法是通過使用虛擬資源首先避免該問題:
聲明虛擬資源
class packages { @package { ['cryptsetup-bin', 'cryptsetup', 'cifs-utils', 'e2fsprogs', 'libmysql-ruby', 'parted', 'pigz', 'sshfs' ]: ensure => present, } }
實現一個虛擬資源(可以多次實現資源):
include packages realize Package['pigz']
另一種方法是將重複的程式碼分離到另一個類中——即“wget”類。
參考:虛擬資源木偶文件