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
命令中,这才有效。即使这样,如果您这样做了,当条件失败时,它会给您的目录添加一个额外的失败,您必须记住忽略它。