Puppet - 在定义的资源

时间:2017-02-15 00:25:43

标签: puppet

我创建了2个已定义的资源

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

  2. 创建服务的配置文件

  3. 我希望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?
        }
    }
    

    这是我从木偶那里得到的错误:

    错误:无法从远程服务器检索目录:SERVER上的错误400:无效关系:文件[file.config] {notify => Resource :: Run_service :: Service ['main']},因为Resource :: Run_service :: Service ['main']似乎不在目录中

    我可以这样做:

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

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

    有没有办法可以刷新服务?

1 个答案:

答案 0 :(得分:3)

这里有一些问题:

  • 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'],
  }
}

这将以最少的痛苦为您提供您想要的行为。