【问题标题】:How to get Puppet exec to cleanup directory on failure?如何让 Puppet exec 在失败时清理目录?
【发布时间】:2015-01-12 01:22:27
【问题描述】:

如果另一个 exec 失败,我正在尝试找到一种运行 exec 的方法(这样我就可以清理第一个 exec 创建的目录)。

我的情况是:

  1. exec 创建了一个目录,但没有完全完成设置(网络错误失败)。
  2. exec 使用 creates => $target_dir 参数,因此后续运行不会再次尝试设置文件夹。
  3. 失败后再次应用 Puppet 清单,并跳过 exec

如果之前的exec 失败,我很想删除目录(可能使用file 类型)。我知道这类似于http://ask.puppetlabs.com/question/14726/run-exec-only-if-another-exec-ran/run Exec only if another Exec ran。但我只想通知失败(可能退出 0 以外)。

有什么想法可以做到这一点吗?

【问题讨论】:

  • 听起来像是某种看门狗服务的工作?
  • 看门狗服务如何知道 Puppet 执行失败?如果目录确实存在并且第一个 exec 已成功完成,我不想删除目录或运行 exec。 “看门狗服务”是 Puppet 中的新事物吗?
  • 看门狗用于动态更新状态。 Puppet 用于维护客户端的最终状态。不要混合它们。在 puppet 中使用许多 exec 进行此类工作并不好。

标签: puppet


【解决方案1】:

您可以在 exec 中轻松做的事情是:

Exec { 'exec_name':
    cmd     => "${some_command} || rm -rf ${directory}",
    creates => $directory,
}

其中 ${some_command} 是您的实际命令。

【讨论】:

  • 这其实是一个我没有想到的好主意。太简单了,我现在很惭愧我没有想到它。我会试试这个!
  • 注意:这会使命令在失败时“成功”(关于退出代码)。
【解决方案2】:

我不相信您可以从 exec 调用中捕获退出代码,但您可以做的是使用测试来查看通过运行第一个 exec 成功创建的预期目录或文件是否存在。

例如,

exec { 'first-exec': cmd => 'foo', creates => '/var/www/foo/bar', path => '/var/www/foo', } -> exec { 'second-exec': cmd => 'rm -rf /var/www/foo', unless => 'test -d /var/www/foo/bar', }

这运行first-exec,除非/var/www/foo/bar 存在,否则它运行second-exec

【讨论】:

  • 小心 - 如果第一个在同一 Puppet 运行期间失败,-> 依赖错误实际上会阻止第二个 exec 运行。
  • 这行不通。 /var/www/foo/bar 目录可能存在于失败的情况下,在这种情况下这将不起作用。
猜你喜欢
  • 2016-09-14
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多