Automation 有没有办法告诉puppet仅在其中一个文件不存在时执行命令?

Automation 有没有办法告诉puppet仅在其中一个文件不存在时执行命令?,automation,puppet,Automation,Puppet,我想用puppet创建openvpn证书。我有一个创建这些证书的脚本,但我只想在必要时执行它。清单如下所示: [...] $keydir = ['/etc/openvpn/easy-rsa/keys'] $usercerts = ["$keydir/user1.crt", "$keydir/user2.crt"] exec { 'build-keys': command => '/opt/openvpn/build-keys', creates => $usercerts

我想用puppet创建openvpn证书。我有一个创建这些证书的脚本,但我只想在必要时执行它。清单如下所示:

[...]
$keydir = ['/etc/openvpn/easy-rsa/keys']
$usercerts = ["$keydir/user1.crt", "$keydir/user2.crt"]

exec { 'build-keys':
  command => '/opt/openvpn/build-keys',

  creates => $usercerts,

  notify  => Service['openvpn'],
}
[...]
首先它创建证书,但是如果我修改usercerts变量,它将不再启动脚本
是否存在creates参数无法处理数组的限制
如果存在这些文件中的任何一个或所有文件,puppet是否会阻止执行

我是否应该创建一个脚本来检查这些文件是否存在并将其放入onlyif中?

您不应该在类中执行此操作

define openvpn_keys($username=$name, $keydir = '/etc/openvpn/easy-rsa/keys') {

    $usercert = "$keydir/$username.crt"

    exec { "build-keys-for-$username":
       command => '/opt/openvpn/build-keys',
       creates => $usercert,
       notify  => Service['openvpn'],
    }
}
然后使用这个via

openvpn_keys {
   [ "user1", "user2" ]:
}

它应该会起作用。这是什么版本的Puppet(代理)?节点上的Puppet版本是2.7.23OK,应该足够了。您是否尝试过使用
-dv
标志运行?这表示已注意到Exec[build keys],但它没有运行。我在下面发布了结果:注意:/Stage[main]/Openvpn::Keygen/Exec[build keys]:将从1个事件触发“刷新”调试:/Stage[main]/Openvpn::Keygen/Exec[build keys]:容器类[Openvpn::Keygen]将传播我的刷新事件信息:/Stage[main]/Openvpn::Keygen/Exec[build keys]:调度服务刷新[Openvpn]Hm,还不清楚。最后,您是否确保
$usercerts
的当前值不表示代理系统上已经存在的文件?