Chef - 基于可变条件

时间:2017-10-24 15:51:21

标签: ruby chef dsl chef-recipe

背景:我们的系统设置方式使我只能看到本地厨师日志,并且无法访问Chef服务器控制台或任何其他sysadmin权限。因此,如果我想知道某些事情是否失败,我需要在本地登录。

我可以听到你问"如果您不相信pkg或Chef正确安装它,那么......"我的回答是,虽然你是对的,我仍然希望被偶尔的异常所覆盖。

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

关于问题:

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

   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

我的问题是,由于only_if失败,我想知道我设置mycond变量的方式是否有问题?在代码的某处需要perhapes {}括号吗?

总厨师新手所以请具体说明你的答案。

谢谢!

以下完整代码:

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

2 个答案:

答案 0 :(得分:2)

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'它应该按照你期望的顺序执行。

答案 1 :(得分:2)

问题是Chef的双通模型。有关此问题的完整说明,请参阅https://coderanger.net/two-pass/,您只需将条件检入移至only_if块本身,因为它会延迟到收敛时间:only_if { ::File.directory?('/opt/MyPkg/conf') }

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