Chef - 将 env 变量与使用 bash 资源创建的包资源一起使用

时间:2021-03-05 15:44:59

标签: ruby bash git chef-infra

我将从 git commit 中获取更改后的项目并基于此安装包。 这是我的代码

bash 'get_project' do
  code <<-EOH
  filelist=$(git diff-tree --no-commit-id --name-only -r $1)
  for file in ${filelist[@]}; do
    project=$(echo $file | cut -d "/" -f1)
    projectList+=($project)
  done
  for changedProject in $(echo "${projectList[@]}" | sort | uniq); do
    INSTALLABLE_RPM=application-$changedProject
  done
  EOH
  environment 'INSTALLABLE_RPM' => '$INSTALLABLE_RPM'
end

zypper_package ENV['INSTALLABLE_RPM']

我的想法是用 bash 生成 INSTALLABLE_RPM 变量并用 zypper 安装包。不幸的是它不起作用。 zypper_package 资源无法识别。

我的想法用完了:-(

1 个答案:

答案 0 :(得分:0)

bash resourceenvironment 属性是提供现有环境变量来执行 bash 命令。

<块引用>

(这些变量必须存在才能成功运行命令。)

在此处指定环境变量不会在 shell 中设置它们。同样在 code 块内,您将无法访问 Ruby 的 ENV 哈希。

可能没有直接的方法来做到这一点。选项之一是将此包(列表?)写入文件。然后我们可以将文件内容读入变量,并与 zypper_package 资源一起使用。

示例:

由于您在 Shell 中使用了 for 循环,我相信您会得到一个包列表,因此我将 pkg_list 视为数组。我已将 compile_time 设置为 true,因为 bash 资源下面的变量赋值将在编译时运行。

bash 'get_project' do
  code <<-EOH
  # your code as-it-is
  for changedProject in $(echo "${projectList[@]}" | sort | uniq); do
    echo "application-$changedProject" >> /tmp/rpm_packages
  done
  EOH
  compile_time true
end

pkg_list = File.read('/tmp/rpm_packages').split

zypper_package pkg_list

# remove the file for good measure :)
file '/tmp/rpm_packages' do
  action :delete
end