chef-infra - 厨师如果声明被破坏
问题描述
我有一个简单的厨师食谱,如果文件存在,它应该是厨师。如果确实存在,它应该终止,如果不存在,则继续下一个配方:
file '/tmp/db_backup.lock' do
action :nothing
only_if { ::File.exist?('/tmp/db_backup.lock') }
raise "backup in progress since"
not_if { ::File.exist?('/tmp/db_backup.lock') }
include_recipe "#{cookbook_name}::hostname"
end
但是,当我对服务器运行此代码时,它总是失败并打印出 raise 语句。任何人都可以建议可能是这个逻辑的问题吗?
解决方案
raise
像这样的资源中间的语句总是会失败并在 Chef编译阶段输出你的 raise 语句。此外,您不能include_recipe
像这样在另一个资源中运行。最后,你不应该有多个守卫,在这种情况下,这些守卫是相互冲突的。一个告诉资源在文件存在时不运行,另一个告诉它仅在文件存在时运行。你需要做的是这样的:
if ::File.exist?('/tmp/db_backup.lock')
raise 'backup in progress, stopping'
else
include_recipe "${cookbook_name::hostname}"
end
如果文件存在,这将引发异常,否则它将运行包含的配方。
或者,如果您想跳过包含的食谱但继续 Chef 运行,您可以执行以下操作:
if ::File.exist?('/tmp/db_backup.lock')
Chef::Log.warn("backup in progress, skipping #{cookbook_name::hostname}")
else
include_recipe "#{cookbook_name::hostname}"
end
推荐阅读
- apollo - LocalState 初始化问题:从 @apollo/client (3..0.0-beta.29) 迁移到 @apollo/client (3.0.2) 缓存未按预期初始化数据
- f# - F# 记录中的元组
- php - 如何从 Canvas 中保存经过处理的图像
- python - 在 Python 和 sys.getrefcount 中迭代给定类的对象实例
- lua - 有什么方法可以在 lua 5.3 中使用 math.pow 吗?
- python - 无法使用提供的凭据登录
- angular - 如何将变量从一个组件设置到另一个组件?
- node.js - 如何处理:错误:打开 COM6:在 Node js 中找不到文件
- sql - SQL Server 2005 中的临时表创建问题
- drools - 有没有办法在drools中使用基于规则LHS的休眠插入事实