Puppet:仅当文件存在时才使用文件资源
我想做的很简单: 一, 将Puppet:仅当文件存在时才使用文件资源,puppet,Puppet,我想做的很简单: 一, 将/源/文件复制到/目标/文件。我通过以下方法实现这一点: file { 'my_file_copy': ensure => file, source => 'file:/source/file', path => "/target/file", } 二, 但是,如果文件/source/file不存在,我不希望它执行此任务 我真的很难理解这种逻辑。我尝试了下面的解决方案,但它在puppet运行期间抛出异常 有没有更好的方法
/源/文件
复制到/目标/文件
。我通过以下方法实现这一点:
file { 'my_file_copy':
ensure => file,
source => 'file:/source/file',
path => "/target/file",
}
二,
但是,如果文件/source/file
不存在,我不希望它执行此任务
我真的很难理解这种逻辑。我尝试了下面的解决方案,但它在puppet运行期间抛出异常
有没有更好的方法来完成这项任务?
理想情况下,我希望只使用“file”,而避免使用“exec”。但在这一点上,我会满足于一个解决方案 因为Puppet是一种只声明最终状态的声明性语言,所以像您所描述的命令式逻辑(如果a,do X)通常很难表达 就我个人而言,我会尽量避免在文件A存在的情况下复制文件B的要求。通常有更好的方法 但是,如果需要保留需求,那么在这里使用Exec对我来说是一个不错的选择
exec { 'my_file_copy':
command => 'cp /source/file /target/file',
onlyif => 'test -e /source/file',
creates => '/target/file',
path => '/bin',
}
因为Puppet是一种只声明最终状态的声明性语言,所以像您所描述的命令式逻辑(如果a,do X)通常很难表达 就我个人而言,我会尽量避免在文件A存在的情况下复制文件B的要求。通常有更好的方法 但是,如果需要保留需求,那么在这里使用Exec对我来说是一个不错的选择
exec { 'my_file_copy':
command => 'cp /source/file /target/file',
onlyif => 'test -e /source/file',
creates => '/target/file',
path => '/bin',
}
您可以使用以下逻辑:
$file = "/source/file"
exec { "chk_${file}_exist":
command => "true",
path => ["/usr/bin","/usr/sbin", "/bin"],
onlyif => "test -f ${file}"
}
file {"/target/file":
ensure => file,
source => 'file:/source/file',
owner => 'root',
group => 'root',
mode => '0750',
require => Exec["chk_${file}_exist"],
}
您可以使用以下逻辑:
$file = "/source/file"
exec { "chk_${file}_exist":
command => "true",
path => ["/usr/bin","/usr/sbin", "/bin"],
onlyif => "test -f ${file}"
}
file {"/target/file":
ensure => file,
source => 'file:/source/file',
owner => 'root',
group => 'root',
mode => '0750',
require => Exec["chk_${file}_exist"],
}
好的,puppetserver希望文件存在以便正确编译。你期待什么?我只能想到一个IF语句+您可以设置的某个功能标志,以排除资源。我怀疑是否有puppet函数来检查puppetserver上是否存在源文件。“if”的问题是它希望puppet服务器上的文件不是客户端上的文件。我想检查客户端中是否存在该文件。一种方法是使用自定义事实,但这有点太复杂了,因为它需要ruby知识,并且自定义事实会在每台服务器上执行。你期待什么?我只能想到一个IF语句+您可以设置的某个功能标志,以排除资源。我怀疑是否有puppet函数来检查puppetserver上是否存在源文件。“if”的问题是它希望puppet服务器上的文件不是客户端上的文件。我想检查客户端中是否存在该文件。一种方法是使用自定义事实,但这有点太复杂了,因为它需要ruby知识和自定义事实在每台服务器上执行。这可能更为惯用。更新了“IfA thenX”在puppet中经常用依赖语义表示。但是在本例中,Puppet没有为文件资源创建内置机制。我需要同样的机制,唯一的变化是如果源是某个URL,
https://www.file.com/somefile.zip
,现在,如果此zip可用,请执行处理,否则请退出代码并发送一些消息。是,确定。这可能更为惯用。更新了“IfA thenX”在puppet中经常用依赖语义表示。但是在本例中,Puppet没有为文件资源创建内置机制。我需要同样的机制,唯一的变化是如果源是某个URL,https://www.file.com/somefile.zip
,现在,如果此zip可用,请执行处理,否则请使用一些消息退出代码。只有将test
命令放入exec
命令中,此操作才会起作用。即使如此,如果您这样做,当条件失败时,它会向您的目录中添加一个额外的失败,您必须记住忽略它。只有将test
命令放在exec
命令中,这才有效。即使这样,如果您这样做了,当条件失败时,它会给您的目录添加一个额外的失败,您必须记住忽略它。