订购木偶类时执行问题

时间:2018-02-06 10:17:42

标签: class puppet

我通过

调用了这个递归复制操作
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':}

有没有办法解决它?

1 个答案:

答案 0 :(得分:1)

  

文件以递归方式复制,但内容不是。所以似乎该文件是由second_class

重新创建的

实际上,不,那不是正在发生的事情。您的second_class包含File['tmp']的明确声明。每个资源只能声明一次,显式File声明优先于为递归管理目录的内容生成的隐式声明。这是一个功能。因此,有问题的文件不是由显式声明重新创建的;相反,根据该声明,它仅被管理

因为File['tmp']使用ensure => present,它接受​​任何形式的文件(目录,符号链接,常规文件等),如果根本没有这样的文件,那么它将创建一个空的普通文件文件。这就是你观察到的。它与资源应用的顺序无关。

  

有没有办法解决它?

是。如果您希望通过File['some name']管理文件,则不要为其声明显式资源。如果必须明确声明它,例如以便设置其notify属性,那么使该声明反映完整的所需目标机器状态。

总的来说,我怀疑你可能会受益于一些重构,因为这种情况有一些代码味道。还要注意,递归文件管理始终一直......古怪......最多。它有它的用途,但通常你会用其他东西更好。