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

在复制到Puppet之前检查目录是否存在,puppet,Puppet,在删除父目录之前,我试图通过将子目录复制到其他位置来获取子目录的备份 我就是这样做的: exec{“安装路径存在”: 命令=>“/bin/true”, onlyif=>“/usr/bin/test-d${install_path}”, 路径=>['/usr/bin','/usr/sbin','/bin','/sbin'], } 文件{“服务器备份目录”: 确保=>“目录”, path=>“${distribution\u path}/backup/server”, recurse=>true,

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

我就是这样做的:

exec{“安装路径存在”:
命令=>“/bin/true”,
onlyif=>“/usr/bin/test-d${install_path}”,
路径=>['/usr/bin','/usr/sbin','/bin','/sbin'],
}
文件{“服务器备份目录”:
确保=>“目录”,
path=>“${distribution\u path}/backup/server”,
recurse=>true,
source=>“文件://${install_path}/repository/deployment/server”,
require=>Exec[“安装路径存在”],
}
Exec检查目录是否存在,如果存在,则返回true。“server\u backup\u dir”文件资源要求“install\u path\u exists”exec在目录存在时返回true

当目录不存在且“install\u path\u exists”返回false时,“server\u backup\u dir”仍将执行,并产生以下错误

错误:/Stage[main]/Is/File[server\u backup\u dir]:无法计算: 无法从环境生产源检索信息 file:////usr/local/{project_location}/repository/deployment/server


我的方法有什么问题,如何解决?提前谢谢。

我将把它分为两部分,分别是什么问题以及如何解决


我的方法有什么问题

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

当您在Puppet中使用四种所谓的for关系中的任意一种时,即:
require
before
subscribe
notify
,您告诉Puppet您希望一种资源的应用程序能够相对于另一种资源及时排序。(此外,“订阅”和“通知”响应,但这与此处无关。)

因此,当Puppet应用从代码构建的目录时,它将首先应用Exec资源,即当且仅当安装路径存在时,执行/bin/true命令;然后再管理服务器备份目录文件资源。还要注意的是,无论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中,你通常需要一点时间来了解人际关系和秩序


我怎样才能解决这个问题

您通常会使用类似以下的:

#安装_path.rb
Facter.add('install_path')do
setcode do
Facter::Core::Execution.execute(“/usr/bin/test-d/my/install/path”)
结束
结束
然后在你的清单中:

if$facts['install_path']{
文件{“服务器备份目录”:
确保=>“目录”,
path=>“${distribution\u path}/backup/server”,
recurse=>true,
来源=>”file:///my/install/path/repository/deployment/server",
}
}
查阅文档,了解有关编写和在代码库中包含自定义事实的更多信息

注意:


最后我注意到您在
参数中重用了
$install\u path
。如果您需要安装路径到分发路径的映射,那么您还可以构建一个。但是,我不知道你到底想做什么,我无法确定你会如何写这篇文章。

我将把它分成两部分,什么是错误的,以及如何修复它


我的方法有什么问题

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

当您在Puppet中使用四种所谓的for关系中的任意一种时,即:
require
before
subscribe
notify
,您告诉Puppet您希望一种资源的应用程序能够相对于另一种资源及时排序。(此外,“订阅”和“通知”响应,但这与此处无关。)

因此,当Puppet应用从代码构建的目录时,它将首先应用Exec资源,即当且仅当安装路径存在时,执行/bin/true命令;然后再管理服务器备份目录文件资源。还要注意的是,无论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中,你通常需要一点时间来了解人际关系和秩序


我怎样才能解决这个问题

您通常会使用类似以下的:

#安装_path.rb
Facter.add('install_path')do
setcode do
Facter::Core::Execution.execute(“/usr/bin/test-d/my/install/path”)
结束
结束
然后在你的清单中:

if$facts['install_path']{
文件{“服务器备份目录”:
确保=>“目录”,
path=>“${distribution\u path}/backup/server”,
递归=>t