Назад | Перейти на главную страницу

Марионетка: вызовите определение типа в классе от hiera

Я хотел бы создать модуль 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