В марионетке можно реализовать виртуальные ресурсы с функцией реализации или с коллекциями.
Хотелось бы узнать, можно ли реализовать ресурсы только с функцией реализации. В качестве упрощенного примера я бы хотел, чтобы со следующим манифестом nginx не устанавливался, если только nginx_conf
модуль, содержащий неявную реализацию.
@package { 'nginx':
ensure => present,
}
class nginx_conf {
realize Package['nginx']
file { '/etc/nginx/conf.d/foo':
ensure => present,
require => Package['nginx'],
}
}
exec { 'apt-get update': path => '/usr/bin' }
Exec['apt-get update'] -> Package <| |>
Любая идея?
Можно поместить пакет в отдельный класс, который требуется модулю, который его реализует, но я хотел бы знать, есть ли способ выбрать виртуальные ресурсы в коллекциях, только если они реализованы, и не Не осознаю их только включением в коллекции.
Кажется, не существует полного способа предотвратить Package <| |>
от реализации ресурсов. Это могло быть частичное решение:
@package { 'nginx':
ensure => present,
tag => optional,
require => Exec['apt-get update'],
}
Exec['apt-get update'] -> Package <| tag != optional |>
Тогда вам нужно будет определить требования для каждого виртуального пакета.
Однако основная проблема может быть решена с помощью этапов выполнения:
class update-apt {
exec { 'apt-get update': path => '/usr/bin' }
}
stage { 'first': before => Stage['main'] }
class {'update-apt':
stage => 'first',
}
Все классы и ресурсы по умолчанию запускаются в основной стадии, поэтому Exec['apt-get update']
всегда запускается перед любыми Package-ресурсами.