【发布时间】:2016-08-08 21:56:55
【问题描述】:
我有一本从源代码安装软件包的食谱。版本是 1.0.0,当我运行 chef-client 时,食谱会自动安装。我不希望这种情况发生。我只希望在未安装说明书或版本已更改(例如更改为 1.0.1)时运行此说明书。
我怎样才能做到这一点?
谢谢
【问题讨论】:
标签: chef-infra
我有一本从源代码安装软件包的食谱。版本是 1.0.0,当我运行 chef-client 时,食谱会自动安装。我不希望这种情况发生。我只希望在未安装说明书或版本已更改(例如更改为 1.0.1)时运行此说明书。
我怎样才能做到这一点?
谢谢
【问题讨论】:
标签: chef-infra
这不是 Chef 的工作方式。如果食谱包含在运行列表中,则始终会执行该食谱。
但是,这不是问题,只要您的食谱是幂等的(仅更改未处于所需状态的内容)。
编辑:为了让你的代码具有幂等性,这里有一个使用guards的小教程:
假设您有以下资源,它将名为xyz 的软件安装到/usr/local/xyz-1.0.0(适用于版本 1.0.0):
execute "compile-xyz" do
command "./configure && make && make install"
pwd node['xyz']['download_path']
end
您可以通过添加not_if 参数检查/usr/local/xyz-1.0.0 的存在来防止执行此操作:
execute "compile-xyz" do
command "./configure && make && make install"
pwd node['xyz']['download_path']
not_if do ::File.directory?("/usr/local/xyz-#{node['xyz']['version']}/") end
end
【讨论】:
not_if do ::File.exists?("/usr/local/#{node['foosoftware']['version']}") end。然后你得到幂等性。