如何确保Puppet exec资源始终包含`set -o pipefail`?

时间:2016-08-08 15:01:17

标签: sh puppet

在一个特定的项目中,我有许多带管道的Puppet exec资源。这似乎工作得很好。

exec { 'foobar': 
  command => 'foo | bar',
}

但是,有时候foo会失败。默认行为是仅为管道中的最后一个命令报告退出代码。我可以手动解决这个问题。

exec { 'foobar': 
  command  => 'set -o pipefail; foo | bar',
  provider => shell,
}

但是,我想确保在所有这些情况下自动发生这种情况。我想避免手动查找/替换和审核exec的所有用途。

  • 我错过了一些有用的属性吗?
  • 我可以使用包装吗?
  • 不幸的是,我在查看自定义资源吗?

1 个答案:

答案 0 :(得分:1)

  
      
  • 我错过了一些有用的属性吗?
  •   

不,Exec没有可自动在命令中添加其他代码的属性。

  
      
  • 我可以使用包装吗?
  •   

我不相信我理解你的“包装”是什么意思,但请看下面的内容。

  
      
  • 不幸的是,我在查看自定义资源吗?
  •   

如果您在询问是否需要实现本机自定义类型,那么肯定不会。毫无疑问,您可以使用(DSL级别)定义的类型解决此问题,但您需要将所有Exec声明调整为已定义类型的声明。这可能就是你所说的“包装” - 我很确定你的特定用途没有现成的,但创建一个并不难:

define mymodule::exec (
  command     => $title,
  creates     => 'NOT SET',
  cwd         => 'NOT SET',
  # ... all other regular parameters ...
) {
  $real_provider = $provider ? { 'NOT SET' => 'shell', default => $provider }
  if $real_provider == 'shell' {
    $real_command = "set -o pipefail; $command"
  } else {
    warning('Non-shell command declared via mymodule::exec')
    $real_command = $command
  }

  exec { $title:
    command  => $real_command,
    provider => $real_provider,
    creates  => $creates ? { 'NOT SET' => undef, default => $creates },
    cwd      => $cwd ? { 'NOT SET' => undef, default => $cwd },
    # ... all remaining regular parameters ...
  }
}