在通过将子目录复制到其他位置来删除父目录之前,我试图备份该子目录。
这是我的操作方式:
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
我的方法有什么问题,如何解决?预先感谢。
答案 0 :(得分:2)
我将其分为两部分,什么地方不对以及如何解决。
我的方法有什么问题...
您误解了Puppet中的“要求”行和关系的性质,以及Puppet如何使用在Exec中执行的命令的返回码。
在Puppet中使用四个所谓的metaparameters中的任何一个进行关系时-require
,before
,subscribe
和notify
-您告诉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。但是,在不完全知道您要做什么的情况下,我不确定您将如何编写该作品。