我通过
调用了这个递归复制操作class first_class{
file{'some name':
ensure => 'directory',
path => '/path/to/here',
owner => 'some_owner',
group => 'some_group',
recurse => remote,
source => 'puppet:///modules/scripts'
}
}
class second_class{
file{'tmp':
ensure => 'present',
path => '/path/to/here/tmp.sh',
owner => 'some_owner',
group => 'some_group',
mode => '0755',
notify => Exec['some_process']
}
}
文件以递归方式复制,但内容不是。所以似乎文件是由second_class
重新创建的,但是在我的主清单文件中我有
node default {
Class { 'my_module::first_class':} -> Class { 'my_module::second_class':}
有没有办法解决它?
答案 0 :(得分:1)
文件以递归方式复制,但内容不是。所以似乎该文件是由
重新创建的second_class
实际上,不,那不是正在发生的事情。您的second_class
包含File['tmp']
的明确声明。每个资源只能声明一次,显式File
声明优先于为递归管理目录的内容生成的隐式声明。这是一个功能。因此,有问题的文件不是由显式声明重新创建的;相反,根据该声明,它仅被管理。
因为File['tmp']
使用ensure => present
,它接受任何形式的文件(目录,符号链接,常规文件等),如果根本没有这样的文件,那么它将创建一个空的普通文件文件。这就是你观察到的。它与资源应用的顺序无关。
有没有办法解决它?
是。如果您希望通过File['some name']
管理文件,则不要为其声明显式资源。如果必须明确声明它,例如以便设置其notify
属性,那么使该声明反映完整的所需目标机器状态。
总的来说,我怀疑你可能会受益于一些重构,因为这种情况有一些代码味道。还要注意,递归文件管理始终一直......古怪......最多。它有它的用途,但通常你会用其他东西更好。