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

В марионетке есть способ не реализовывать виртуальные ресурсы с коллекциями, а только реализовывать?

В марионетке можно реализовать виртуальные ресурсы с функцией реализации или с коллекциями.

Хотелось бы узнать, можно ли реализовать ресурсы только с функцией реализации. В качестве упрощенного примера я бы хотел, чтобы со следующим манифестом 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-ресурсами.