Puppet

為什麼 Puppet 可以只要求每個包一次?

  • September 21, 2021

在類中定義依賴項時,每個依賴項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”類。

參考:虛擬資源木偶文件

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