我已经为 SUSE 编写了一个厨师配方,用于安装一个软件包,其中它正在安装它,但是每次 chef-client 运行时它都会运行 enable 命令,即使配置没有变化。
配方示例示例:
zypper_package 'apache2' do
action :install
end
service 'apache2' do
action [:enable, :start]
end
请告知,如何使其幂等?
我在SuSE上遇到了这种情况。至少对于我正在使用的 chef 版本(12.13,不确定更新的版本)似乎将初始化确定错误,因此查看服务是否已启用的内部测试无法正常工作。
最有趣的是,我发现在SLES 11上工作的提供商是Chef::Provider::Service::Redhat
。我必须同时支持 11 和 12,所以我最终在资源定义中使用了 if 块
service 'apache2' do
action [:enable, :start]
if node['init_package'] != 'systemd'
provider Chef::Provider::Service::Redhat
end
end
我只是花了 30 分钟的大部分时间翻阅我所有的食谱,试图找到原件,但不能,我只是确认 SLES SP4 表现出您描述的行为,并且上面修复了它
-----> Converging <default-sles-11-sp4>...
Recipe: apache_test::default
* zypper_package[apache2] action install (up to date)
* service[apache2] action enable (up to date)
* service[apache2] action start (up to date)
尝试使用not_if。您可以根据配置文件的存在将启用包装在某种条件下,以不运行该命令。
例如
package 'Install Apache' do
package_name 'apache2'
action :enable
not_if do ::File.exists?(/some/config/file.conf) end
end