仅在文件更改时运行puppet资源类型

时间:2016-08-18 22:13:45

标签: puppet

我觉得这是一种非常常见的情况,但我还没有找到满足我需求的解决方案。我想创建一些像下面这样的东西。 (不幸的是 set_variable_only_if_file_was_changed 并不存在)

file { 'file1':
      path => "fo/file1",
      ensure => present,
      source => "puppet:///modules/bar/file1",
      set_variable_only_if_file_was_changed  => $file_change = true
}

if $file_change{
    file{'new file1'
        ...
    }
    exec{'do something1'
        ...
    }
    package{'my package'
        ...
    }
} 

我已经看过如何使用refreshonly =>来抑制exec?是的但是文件似乎更难。我想避免将代码放入.sh文件并通过exec执行它。

1 个答案:

答案 0 :(得分:1)

Puppet没有您描述的功能。响应刷新事件的资源以适合其类型的方式执行;没有为现有资源定义自定义刷新行为的机制。 当然无法根据应用其他资源的结果指示哪些资源将包含在节点的目录中 - 正如您的伪代码似乎建议的那样 - 因为目录完全构建在任何之前它被应用了。

此外,如果你像Puppet那样具有丰富的脚本编写背景,就像许多人一样,这并不像你想象的那么严格。在编写脚本方面需要对Puppet进行心理调整的人,因为Puppet的DSL绝对不是脚本语言。相反,它是用于描述机器状态描述(目录)的构造的语言。重要的是要掌握这样的目录描述机器目标状态的细节,将其从当前状态转移到其他状态所需的步骤。 (即使Exec,一个可能的例外,在以这种方式使用时最有效。)很少能够从其身份和初始状态确定机器的预期状态。即使难以这样做也是不常见的。

如何实现所需的特定配置取决于详细信息。通常,答案在于用户定义的事实。例如,不是捕获目录应用程序期间是否更改了给定文件,而是提供一个事实,您可以在目录构建期间询问以评估是否 将更改该文件,并相应地调整目录详细信息。有时你首先不需要这样的测试,因为只有当需要对它进行更改时,Puppet才会对给定的资源采取行动。