Я хотел бы создать модуль 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
class, поэтому его полное имя на самом деле 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