繁体   English   中英

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

[英]Chef - run install block based on variable condition

背景:我们的系统设置方式使我只能查看本地Chef日志,并且无法访问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变量的方式是否有问题? 也许在代码中的某处需要{}大括号?

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

谢谢 !

完整代码如下:

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日志级别可能也不是一个好主意,因为这实际上并不是写出来的致命错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM