Puppet - 在定义的资源中通知服务

Puppet - notify service in defined resource

我创建了 2 个定义的资源

  1. 下载应用程序并将其设置为服务

  2. 为服务创建配置文件

我希望 1 到 运行 在 2 之前,因为 1 创建目录,2 在其中创建配置文件。

但是我还需要的是,如果配置文件更新了,应该通知1中的服务刷新。这是我遇到问题的地方,因为我似乎无法访问该服务。

这是我使用的示例代码:

class start {
    resource::run_service{'start'}
    ->
    resource::conf:service_conf{'conf'}
}

define resource::run_service {
    # Does some things
    service { 'main':
        ensure => 'running',
        enable => true
    }
}

define resource::conf::service_conf {
    file { 'file.config':
        ensure  => file,
        path    => '/some/path/',
        owner   => 'user',
        group   => 'group',
        mode    => 0600,
        content => template('templates/templatefile.erb'),
        notify  => Resource::Run_service::Service['main'], # What is the proper way to do this?
    }
}

这是我从 puppet 得到的错误:

错误:无法从远程服务器检索目录:服务器上的错误 400:无效关系:文件[file.config] { 通知 => Resource::Run_service::Service['main'] },因为目录里好像没有Resource::Run_service::Service['main']

我能做到:

notify  => Resource::Run_service['main'],

但它给了我一个依赖循环。

有没有办法只刷新服务?

这里有一些问题:

  • resource::run_service{'start'} -> resource::conf:service_conf{'conf'} 指定的依赖项与您指定的期望项相反(2 在 1 之前)。我认为这是一个错字,因为它与你问题的其他部分相矛盾。
  • 您应该将定义的资源类型放在它们自己的清单中。
  • 您不会从不包含参数或使用内部 $title 变量的已定义资源类型中获得真正的附加值,因此您可能只想删除它们。至少,您应该重新组织它们,以便为配置文件创建的目录与配置文件具有相同的定义资源类型。
  • Resource::Run_service::Service['main'] 不是有效的资源名称,所以这就是您收到 'not in catalog' 错误的原因。本机资源类型没有命名空间,因此您无需在它们之前指定定义的资源类型命名空间。
  • 您需要使用具有 mode 属性值的八进制字符串。这是 Puppet 中的一个错误,因为它可能导致 Ruby.
  • 中类型转换的未定义行为

考虑到所有这些,对您来说最简单的前进道路是:

class start {

}

define resource::run_service {
  file { 'directory that contains config file':
    ensure => directory,
    before => File['file.config'],
  }

  # Does some things
  service { 'main':
    ensure => 'running',
    enable => true
  }
}

define resource::conf::service_conf {
  file { 'file.config':
    ensure  => file,
    path    => '/some/path/',
    owner   => 'user',
    group   => 'group',
    mode    => '0600',
    content => template('templates/templatefile.erb'),
    notify  => Service['main'],
  }
}

这将使您以最少的痛苦获得您想要的行为。