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

Создание ресурса только один раз с помощью Puppet

У меня есть класс, который подготавливает файлы конфигурации и ключи внутри папки файлов марионеток, чтобы их могли загружать другие узлы. Класс будет вызываться один раз для каждого другого узла, кроме мастера марионетки.

У меня проблема в том, что мне нужно создать корневой каталог только один раз, например, с помощью:

file { '/etc/puppet/files/root':
  ensure => directory
}

Однако это приводит к дублированию ресурса, когда я начинаю вызывать класс несколько раз.

Я знаю, что могу исправить это довольно просто, используя что-то вроде этого, чтобы дать уникальное название ресурса:

file { "create-parent-dir-for-${name}":
  path => '/etc/puppet/files/rootdir',
  ensure => directory
}

Но кажется неправильным создавать множество дополнительных ресурсов для того же самого, поэтому мне интересно узнать, есть ли альтернативное решение.

Это то, что виртуальные ресурсы для.

@file { "/etc/puppet/files/rootdir": ensure => directory }

Там, где это необходимо, реализуйте это либо с помощью

realize(File["/etc/puppet/files/rootdir"])

или

File<| title == "/etc/puppet/files/rootdir" |>

Кроме того, классы никогда не будут приводить к повторяющимся ошибкам объявления. Очевидно, вы объявили файл внутри defined type. Вы действительно можете обойти эту конкретную проблему, сделав это, как предложил Петтер Х. в своем комментарии.

class files {
    file { "/etc/puppet/files/rootdir": ensure => directory }
}

define my_cool_type($param...) {
    include files
    ... # <- only stuff that is unique to this instance of my_cool_type
}

Я не совсем уверен, нет ли лучшего способа решить эту проблему (что-то вроде перемещения этого общего каталога в отдельный класс, который вызывается только один раз).

Но в любом случае есть функция stdlib sure_resource (https://github.com/puppetlabs/puppetlabs-stdlib#ensure_resource), который делает именно это.
Вы бы назвали это так в обоих местах:

ensure_resource('file', '/etc/puppet/files/root', {'ensure' => 'directory' })

Как я уже сказал, обычно есть лучшие способы решить эту проблему.
Трудно сказать, подходит ли это вам, не видя полного кода.
Используйте с осторожностью.