下面是一个工作配方的示例,它循环遍历网站名称数组,并在IIS中使用createIisWebsite()函数创建它们。
def createIisWebsite(websiteName)
iis_site websiteName do
protocol :http
port 80
path "#{node['iis']['docroot']}/#{websiteName}"
host_header "#{websiteName}.test.kermit.a-aws.co.uk"
action [:add,:start]
end
end
在我们实际的解决方案中,这些数据存储在其他地方,并通过web API访问。websiteNames = ["website-2", "website-3", "website-4"]
for websiteName in websiteNames do
createIisWebsite websiteName
end
现在我想能够调用函数createIisWebsite()从这个食谱中的多个食谱。
我试过把它扔进一个助手模块(库)。在这里,我无法使iis_site的引用工作。
我试过将功能移动到default.rb
,然后做include_recipe "::default"。这似乎也行不通。
我得到一个"无法找到createIisWebsite的资源在windows版本6.2.9200"
我采用这种方法的原因是因为我想要一个包含每个web服务器集群的网站列表的食谱。我觉得我没有走最佳实践路线。
任何想法?
问题是该函数是在菜谱中定义的,并且只能在该菜谱中使用。include_recipe
方法确保了一个给定的配方被加载,但是它不会向配方中导入任何包含的内容。
因为你的函数被用来声明一个有一些计算参数的Chef资源,最接近的是看一下定义(Chef Docs)。定义看起来与参考资料类似,具有名称和一组可选参数,但实际上是简单的宏,在编译配方时将其扩展到配方中。
在cookbook目录中创建definitions/my_iis_website.rb
,包含如下内容:
define :my_iis_website do
iis_site websiteName do
protocol :http
port 80
path "#{node['iis']['docroot']}/#{websiteName}"
host_header "#{websiteName}.test.kermit.a-aws.co.uk"
action [:add,:start]
end
end
然后,将食谱中的循环替换为:
for websiteName in websiteNames do
my_iis_website websiteName
end
如果每个服务器集群的配方是相同的,但对于站点列表,您可能需要考虑将此数据存储在attributes
或data bags
中。这可以帮助您避免在食谱中重复自己,并且还允许您在不更新食谱的情况下添加站点。