Я хотел бы создать модуль install_package, который можно вызывать несколько раз, где пакеты определены в hiera. Я знаю, что класс - это skelton (может быть вызван один раз), а тип определения предназначен для моей цели.
Я разработал следующее: hiera.yaml
---
version: 5
hierarchy:
- name: "Common hierarchy level"
path: "common.yaml"
./ data / common.yaml
---
install_package::packages:
- vim
- logrotate
classes:
- install_package
./ module / install_package / manifest / init.pp
class install_package(
packages=[],
) {
define def_package()
notify{"package to install is $name":}
}
def_package{ [$packages]: }
}
Марионетка возвращает " Ошибка при оценке заявления ресурса, неизвестный тип ресурса: 'def_package' ".
Мой вопрос: как я могу определить пакеты для установки в переменной (массиве), например, в /data/common.yaml, а затем несколько раз вызвать модуль install_package с определением типа?
Ошибка, которую вы видите, является областью действия проблема. Определенный тип def_package
был определен в классе install_package
, поэтому его полное имя на самом деле install_package :: def_package
. В Puppet классы и определенные типы должны объявляться с использованием их полного имени.
Это работает:
$ cat hiera.yaml
---
version: 5
hierarchy:
- name: "Common hierarchy level"
path: "common.yaml"
$ cat data/common.yaml
---
install_package::packages:
- vim
- logrotate
classes:
- install_package
$ cat modules/install_package/manifests/init.pp
class install_package (
$packages = [],
) {
define def_package() {
notice("package to install is ${name}")
}
install_package::def_package { $packages: }
}
$ puppet apply --hiera_config hiera.yaml -e "hiera_include('classes')" --modulepath modules
Notice: Scope(Install_package::Def_package[vim]): package to install is vim
Notice: Scope(Install_package::Def_package[logrotate]): package to install is logrotate
Notice: Compiled catalog for it070137.bris.ac.uk in environment production in 0.06 seconds
Notice: Applied catalog in 0.03 seconds
Я бы заметил, что определение классов и определенных типов внутри класса не является хорошим стилем и делает puppet-lint
жалуются.
Кроме того, Puppet в наши дни демонстрирует циклы поддержки, поэтому нет необходимости использовать определенные типы с массивами в качестве обходного пути. Попробуйте выполнить цикл .each
:
$ cat modules/install_package/manifests/init.pp
class install_package (
$packages = [],
) {
$packages.each |$name| {
notice("package to install is ${name}")
}
}
$ puppet apply --hiera_config hiera.yaml -e "hiera_include('classes')" --modulepath modules
Notice: Scope(Class[Install_package]): package to install is vim
Notice: Scope(Class[Install_package]): package to install is logrotate
Notice: Compiled catalog for it070137.bris.ac.uk in environment production in 0.05 seconds
Notice: Applied catalog in 0.03 seconds