只有当文件发生变化时才运行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 => true来抑制exec,但对于文件来说似乎更难。我希望避免将代码放入.sh文件中,并通过exec执行。

Puppet没有您描述的特性。响应刷新事件的资源以适合其类型的方式进行刷新;没有为现有资源定义自定义刷新行为的机制。当然没有办法根据应用其他资源的结果来指示哪些资源将包含在节点的编目中——正如您的伪代码所暗示的那样——因为在应用其中的任何内容之前,编目已经完全构建好了。

此外,如果您像许多人一样,具有丰富的脚本编写背景来使用Puppet,那么这几乎不像您想象的那样受限制。从脚本角度思考问题的人需要对Puppet进行心理调整,因为Puppet的DSL绝对不是脚本语言。相反,它是一种描述机器状态描述(目录)构造的语言。很重要的一点是,这样的目录描述了机器的目标状态的细节,而不是将机器从当前状态转移到其他状态所需的步骤。(即使是Exec,一个可能的例外,当以这种方式使用时也是最有效的。)无法从标识和初始状态确定机器的预期状态是非常罕见的。这是不寻常的,即使很难做到。

如何实现您想要的特定配置取决于细节。通常,答案在于用户定义的事实。例如,不是捕获在编目应用程序期间是否更改了给定的文件,而是提供一个事实,您可以在编目构建期间查询,以评估该文件是否将更改,并适当地调整编目详细信息。有时您一开始就不需要这样的测试,因为Puppet只在需要对给定资源进行更改时才对其进行操作。

最新更新