Chef infra 厨师有没有办法知道归档文件';跑步过程中的内容是什么?

Chef infra 厨师有没有办法知道归档文件';跑步过程中的内容是什么?,chef-infra,archive-file,Chef Infra,Archive File,我有一个厨师食谱,它克隆了git存储库的一个特定分支,其中包含两个.tgz文件和一个.sql文件。repo中的文件名遵循约定,但带有时间戳,这意味着无法确定每次运行时它们的确切名称。克隆存储库之后,我希望chef提取这两个.tgz文件 在chef需要提取.tgz文件之前,我已经准备好了所有的工作。客户端运行时总是出错,tgz文件名为nil。我认为问题在于,由于chef的工作方式,chef可能无法“发现”在运行阶段添加到目录中的文件名 在测试过程中,我发现如果在chef运行之前克隆git存储库,使

我有一个厨师食谱,它克隆了git存储库的一个特定分支,其中包含两个.tgz文件和一个.sql文件。repo中的文件名遵循约定,但带有时间戳,这意味着无法确定每次运行时它们的确切名称。克隆存储库之后,我希望chef提取这两个.tgz文件

在chef需要提取.tgz文件之前,我已经准备好了所有的工作。客户端运行时总是出错,tgz文件名为nil。我认为问题在于,由于chef的工作方式,chef可能无法“发现”在运行阶段添加到目录中的文件名

在测试过程中,我发现如果在chef运行之前克隆git存储库,使其内容存储在菜谱的
files/
目录中,这些文件将包含在chef的缓存中,并按预期提取。我相信这是可行的,因为此时chef知道.tgz文件;在跑步过程中,它们不可用。这个<强>是< /强>的一个解决方案,我可以考虑作为最后的手段,但它不是理想的,因为我想尽可能少地在终端用户的本地机器上工作。

我想知道我的理解是否正确,是否有办法实现我概述的目标。这是我的密码:

#克隆存储库
执行“从#{backup\u repository\u url}存储库克隆#{backup\u version}”操作
命令“su#{user}-c'git clone--single branch--branch#{backup_version}{backup_repository_url}}{backup_holding_area}”
网络根目录
结束
#我最终需要这三个文件,所以在目录中找到它们的路径
#它们被克隆到并存储在散列中
备份文件=Hash.new
[“代码”、“媒体”、“数据库”]。每个do |类型|
backup_files[type.to_sym]=Dir[“#{backup_holding_area}/*”]。查找{| file | file.include?(type)}
结束
#我最终需要使用这三个文件,但只有代码和媒体是.tgz文件
#这个零检查是chef失败的地方
除非备份_文件[:code].nil?||备份_文件[:媒体].nil?||备份_文件[:db].nil?
备份文件。切片(:代码,:媒体)。每个do |键,文件|
归档_文件“从#{file}还原备份”执行以下操作
路径文件
目标web\u根目录
所有者用户
集团
覆盖:自动
仅当{::File.exist?(File)}
结束
结束
结束

chef客户端运行有不同的阶段。在这种情况下,“编译”和“聚合”阶段是相关的。在运行期间,“编译”阶段首先出现,然后是“收敛”

  • 编译阶段:不在Chef资源中的“代码”
  • 汇聚阶段:厨师资源中的“代码”
例如,以下变量赋值将在编译阶段运行

backup\u files=Hash.new
execute
块(如下所示)将在converge期间运行:

执行“从#{backup\u repository\u url}存储库克隆#{backup\u version}”操作
命令“su#{user}-c'git clone--single branch--branch#{backup_version}{backup_repository_url}}{backup_holding_area}”
网络根目录
结束
由于所有变量分配都在资源块之外,因此在实际收敛之前很久就分配了它们。i、 当文件甚至不在目标目录中时。所以他们没有我们期望的文件名

确保获得文件名的一种方法是在Chef资源中分配变量。其中一个就是
ruby_块
资源

使用此方法,我们可以得到如下配方:

#使用execute根据需要克隆或使用具有属性的git资源
git备份\持有\区域do
存储库备份\u存储库\u url
修订备份版本
行动:结帐
结束
#遍历目录中的文件仍然可以,因为只有3个文件
ruby_block“获取并提取代码和媒体tar文件”do
布洛克道
目录项(“#{backup_holding_area}”)。每个都有一个文件|
if file.include?('tar.gz')
#根据需要,“tar”命令可以使用适当的标志
系统(“tarxzf{backup{u holding}/{file}-C{web\u root}”)
结束
结束
结束
结束

chef客户端运行有不同的阶段。在这种情况下,“编译”和“聚合”阶段是相关的。在运行期间,“编译”阶段首先出现,然后是“收敛”

  • 编译阶段:不在Chef资源中的“代码”
  • 汇聚阶段:厨师资源中的“代码”
例如,以下变量赋值将在编译阶段运行

backup\u files=Hash.new
execute
块(如下所示)将在converge期间运行:

执行“从#{backup\u repository\u url}存储库克隆#{backup\u version}”操作
命令“su#{user}-c'git clone--single branch--branch#{backup_version}{backup_repository_url}}{backup_holding_area}”
网络根目录
结束
由于所有变量分配都在资源块之外,因此在实际收敛之前很久就分配了它们。i、 当文件甚至不在目标目录中时。所以他们没有我们期望的文件名

确保获得文件名的一种方法是在Chef资源中分配变量。其中一个就是
ruby_块
资源

使用此方法,我们可以得到如下配方:

#使用execute根据需要克隆或使用具有属性的git资源
git备份\持有\区域do
存储库备份\u存储库\u url
修订备份版本
行动:结帐
结束
#遍历目录中的文件仍然可以,因为只有3个文件
ruby_block“获取并提取代码和媒体tar文件”do
布洛克道
目录项(“#{backup_holding_area}”).eac