在复制到Puppet中之前检查目录是否存在

时间:2019-03-22 05:45:02

标签: puppet

在通过将子目录复制到其他位置来删除父目录之前,我试图备份该子目录。

这是我的操作方式:

exec { "install_path_exists":
  command => "/bin/true",
  onlyif  => "/usr/bin/test -d ${install_path}",
  path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
}
file { "server_backup_dir" :
  ensure  => 'directory',
  path    => "${distribution_path}/backup/server",
  recurse => true,
  source  => "file:///${install_path}/repository/deployment/server",
  require => Exec["install_path_exists"],
}

Exec检查目录是否存在,如果存在,则返回true。如果目录存在,则“ server_backup_dir”文件资源需要“ install_path_exists” exec才能返回true。

如果目录不存在,并且“ install_path_exists”返回false,则“ server_backup_dir”仍然执行,并产生以下错误。

  

错误:/ Stage [main] / Is / File [server_backup_dir]:无法评估:   无法从环境生产源检索信息   文件:///// usr / local / {project_location} / repository / deployment / server

我的方法有什么问题,如何解决?预先感谢。

1 个答案:

答案 0 :(得分:2)

我将其分为两部分,什么地方不对以及如何解决。


  

我的方法有什么问题...

您误解了Puppet中的“要求”行和关系的性质,以及Puppet如何使用在Exec中执行的命令的返回码。

在Puppet中使用四个所谓的metaparameters中的任何一个进行关系时-requirebeforesubscribenotify-您告诉Puppet,您希望某个资源的应用相对于另一个资源及时被排序。 (此外,“订阅”和“通知”对refresh events进行了响应,但这与此处无关。)

因此,当Puppet应用根据您的代码构建的目录时,它将首先应用Exec资源,即(且仅当存在安装路径时)执行/ bin / true命令;然后它将第二个管理server_backup_dir文件资源。还请注意,无论是否实际执行了Exec命令,它将应用文件资源。唯一的保证是/ bin / true绝不会在文件资源的之后运行。

此外,Exec中命令的返回代码与您期望的功能有所不同。 / bin / true命令返回的退出状态为0,仅告诉Puppet允许配置继续;将其与返回非零退出状态的Exec命令进行比较,这将导致Puppet因错误而中止执行。

这是一个简单的演示:

▶ puppet apply -e "exec { '/usr/bin/false': }"
Notice: Compiled catalog for alexs-macbook-pro.local in environment production in 0.08 seconds
Error: '/usr/bin/false' returned 1 instead of one of [0]
Error: /Stage[main]/Main/Exec[/usr/bin/false]/returns: change from 'notrun' to ['0'] failed: '/usr/bin/false' returned 1 instead of one of [0]
Notice: Applied catalog in 0.02 seconds

有关更多信息,请仔细阅读我上面链接的页面。通常需要一些时间来了解Puppet中的关系和顺序。


  

我该如何解决?

您通常会这样使用custom fact

# install_path.rb

Facter.add('install_path') do
  setcode do
    Facter::Core::Execution.execute('/usr/bin/test -d /my/install/path')
  end
end

然后在您的清单中

if $facts['install_path'] {
  file { "server_backup_dir" :
    ensure  => 'directory',
    path    => "${distribution_path}/backup/server",
    recurse => true,
    source  => "file:///my/install/path/repository/deployment/server",
  }
}

咨询文档,以获取有关编写以及在代码库中包含自定义事实的更多信息。

注意:

最后,我注意到您在$install_path参数中重用了source。如果您需要将安装路径映射到分发路径,则还可以构建structured fact。但是,在不完全知道您要做什么的情况下,我不确定您将如何编写该作品。