Chef - 运行 根据可变条件安装块

Chef - run install block based on variable condition

背景:我们的系统设置方式使我只能看到本地 Chef 日志,无法访问 Chef 服务器控制台或任何其他系统管理员权限。因此,如果我想查看是否失败或为什么失败,我需要在本地登录。

我听到你在问“如果你不相信 pkg 或 Chef 会正确安装它,那么......”我的回答是,虽然你是对的,但我仍然希望被偶尔的异常所掩盖.

我的目标是安装一个 pkg,检查它是否安装正确然后继续下一个 pkg。

关于问题:

我想设置一个变量来检查第一个包使用以下代码创建的目录是否存在:

   mycond = ::File.directory?('/opt/MyPkg/conf')
    Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond

recipee 的下一阶段是 运行 下一个安装块检查是否已设置变量。

yum_package 'OtherPkg' do
  action :install
  only_if { mycond }
end

我的问题是因为 only_if 失败了,我想知道我设置 mycond 变量的方式是否有问题?也许代码中某处需要 {} 大括号?

大厨新手,所以请具体回答。

谢谢!

完整代码如下:

yum_package 'MyPkg' do
      flush_cache [ :before ]
      action :install
    end

    mycond = ::File.directory?('/opt/MyPkg/conf')
    Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond

    yum_package 'OtherPkg' do
      action :install
      only_if { mycond }
    end

Chef 有一个控制执行流程的优先顺序。

资源块中的代码(例如 'yum_package')将在您的配方中的任何松散代码之后执行。

首先执行以下行,在您的 'yum_package' 块之前:

mycond = ::File.directory?('/opt/MyPkg/conf')
Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond

我相信你可以嵌套资源块。您可能无法将所有这些代码组合在一个 'ruby_block' 中,并且它应该按您期望的顺序执行。

问题是 Chef 的两遍模型。请参阅 https://coderanger.net/two-pass/ 以获得对此的完整解释,您只需将条件检查移至 only_if 块本身,因为它会延迟到收敛时间:only_if { ::File.directory?('/opt/MyPkg/conf') }.

使用 fatal 日志级别也可能不是一个好主意,因为这实际上并不是所写的致命错误。