2017-02-15 61 views
1

通知服务,我已经创建木偶 - 中定义的资源

  1. 2个定义的资源下载的应用程序,并将其设置为服务

  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? 
    } 
} 

这是我从木偶出现错误:

错误:服务器错误400:无法检索从远程服务器的目录:无效的关系:因为Resource :: Run_service :: Service ['main']似乎不在目录

我可以这样做:

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

但它给了我一个依赖周期。

有没有一种方法可以刷新服务?

回答

2

这里的一些问题:

  • resource::run_service{'start'} -> resource::conf:service_conf{'conf'}被指定的依赖是你指定什么,你的愿望(2 1日前)的对面。我认为这是一个错字,因为它与你的问题的其他部分相矛盾。
  • 您应该将已定义的资源类型放入自己的清单中。
  • 您从定义的资源类型中不能获得真正的附加价值,这些资源类型不包含任何参数,也不会使用固有的$title变量,因此您可能需要删除它们。至少,您应该重新组织它们,以便配置文件的目录创建与配置文件具有相同的定义资源类型。
  • Resource::Run_service::Service['main']不是一个有效的资源名称,所以这就是为什么你得到“不在目录中”的错误。本地资源类型没有名称空间,因此您无需在它们之前指定定义的资源类型名称空间。
  • 您需要使用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'], 
    } 
} 

这将让你与你的痛苦最少的愿望的行为。

+1

尽管“您从没有参数的定义资源类型中不能获得真正的附加价值”是真实的,因为它适用于OP问题的细节,但作为一般规则并不正确。每个定义的类型实例都有一个内部可访问的'$ title'(也可以作为'$ name'访问),并且它的使用可以使该类型提供附加值(因为可以有效声明多个实例)。实际上,我甚至会说,它主要是使用'$ title',而不是参数的存在或缺失,它决定了一个定义的类型是否提供附加价值。 –

+0

@JohnBollinger好点。让我更新我的重点。 –

+0

你对错字是正确的,我已经修复了OP。资源是在他们自己的清单中,我只是格式化它,所以它更容易阅读。 看起来像我不知道的主要事情是本地资源没有名称空间。我认为我在发布我的问题之前没有使用命名空间尝试它,但是我这样做时可能没有大写“Service”,因为它没有工作。 无论如何,我已经接受你的答案。谢谢。 –