Puppet - 在定义的资源中通知服务
Puppet - notify service in defined resource
我创建了 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'],
}
}
这将使您以最少的痛苦获得您想要的行为。
我创建了 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'],
}
}
这将使您以最少的痛苦获得您想要的行为。