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']
答案 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']