Puppet:声明没有包含的资源

时间:2015-01-02 12:24:23

标签: puppet

Puppet将包含在另一个定义的类型(或类)中声明的所有已定义类型。据我了解,这意味着任何声明的源都将取决于容器。这将导致依赖循环:

define user {
}
define bar {
  user { $name: }
  ->
  Bar[$name]
}

bar { 'foo': }
Error: Could not apply complete catalog: Found 1 dependency cycle:
(User[foo] => Bar[foo] => User[foo])

有什么方法可以避免这种情况吗?我有一个特定的例子,我希望在声明Bar[$name]时,User[$name]也被声明,但Bar[$name]依赖于User[$name],而不是相反。基本上与require的行为相同,但对于已定义的类型依赖性。

是否有任何方法可以实现这一点,或者是唯一的解决方案是让清单声明Bar[$name]声明User[$name](然后在bar的主体上添加依赖关系或在宣告清单?


一个更现实的例子:

define servize {}
define appserver {
  user { $name: }
  ->
  servize { $name: }
}

appserver { 'app': }

# the deploy application needs a directory owned by itself on startup
file { '/tmp/foobar':
  ensure => directory,
  owner  => 'app', # auto-require
}
->
Appserver['app']

2 个答案:

答案 0 :(得分:1)

首先,请不要重新定义内置类型。所有内置类型的列表:https://docs.puppetlabs.com/references/latest/type.html

如果您只有一个特定的实例,其中$ Bar[$name]取决于User[$name] 您可以从栏定义中删除用户并创建ordered_bar

  define ordered_bar {
    user { $name: }
    ->
    bar {$name : }
  }

您只需要创建ordered_bar的实例 另请阅读有关木偶资源订购的文件:https://docs.puppetlabs.com/learning/ordering.html

答案 1 :(得分:0)

您可以将有问题的资源创建为虚拟资源。这种可行性取决于数据层的结构。

define servize {}

user { 'app': }

define appserver {
  User<| title == $name |>
  ->
  servize { $name: }
}

appserver { 'app': }

# the deploy application needs a directory owned by itself on startup
file { '/tmp/foobar':
  ensure => directory,
  owner  => 'app', # still auto-require, but no ill effect
}
->
Appserver['app']