Я прорабатываю документацию по марионетке. Одно из упражнений - использовать условную логику для написания общего манифеста установки:
Упражнение: используйте факт $ operatingsystem, чтобы написать манифест, который устанавливает среду сборки на машинах на базе Debian («debian», «ubuntu») и Enterprise Linux («centos», «redhat»). (Для систем обоих типов требуется пакет gcc, но для систем типа Debian также требуется сборка.)
Я написал код, который работает, но поскольку моя машина - машина centos, у меня нет возможности проверить, работает ли ветка:
$build_packages = $::operatingsystem ? {
/(?i)centos|redhat/ => 'gcc',
/(?i)debian|ubuntu/ => ['gcc','build-essential'],
default => undef
}
notify {"build_packages":
message => "Build packages for ${::operatingsystem} are: ${build_packages}\n",
before => Package['build']
}
package {'build':
ensure => installed,
name => $build_packages
}
У меня вопрос: если бы я был в системе debian или ubuntu, это сработало бы? В частности, если я установил $build_packages
в массив, будет ли ресурс пакета делать правильные вещи и устанавливать два пакета? Или мне следует переопределить этот ресурс вот так ?:
package {$build_packages:
ensure => installed
}
Второй, package {$build_packages:
. Это расширяется до ресурса для каждого члена массива, и каждый пакет в массиве будет установлен.
Обратите внимание, что массив, однако, нарушит notify
ресурс с его message
предполагает, что $build_packages
это строка.