在 Puppet 中,有没有办法不使用集合来实现虚拟资源,而只使用实现?

在 Puppet 中,有没有办法不使用集合来实现虚拟资源,而只使用实现?

在 Puppet 中可以实现虚拟资源使用实现函数或者集合。

我想知道是否有可能实现资源仅有的使用实现函数。作为一个简化的示例,我希望使用以下清单 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 <| |>

任何想法?

一种选择是将包放在实现它的模块所需的单独类中,但我想知道是否有某种方法可以仅在实现集合时选择集合中的虚拟资源,而不是仅通过将其包含在集合中来实现它们。

答案1

似乎没有完全阻止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']始终在任何包资源之前运行。

相关内容