在我们的Chef cookbook中,我们支持同一软件的多个版本。但我们采取了一种不好的做法。对于每个版本,我们都制作了配方的副本并更改了它的属性。
e.g。
remote_file install_file do
source node['android']['sdk']['23']['source_url']
not_if do
::File.exists?(extract_dir)
end
notifies :run, "execute[extract-sdk-23]", :immediately
end
变为
remote_file install_file do
source node['android']['sdk']['24']['source_url']
not_if do
::File.exists?(extract_dir)
end
notifies :run, "execute[extract-sdk-24]", :immediately
end
这实际上是代码重复。保持属性相同但改变它们的值会更清晰。
这可以和Chef一起使用吗?
如果重要,我们直接使用chef-client零。即我们不使用刀等。
答案 0 :(得分:0)
正如@StephenKing所提到的,最好的办法是编写一个抽象逻辑的自定义资源。您还可以将所有不同的SDK放在节点属性中的散列中,然后在单个配方中迭代它们,但这样做的灵活性会降低。