2013-05-07 221 views
6

下面是一个工作配方示例,它循环访问一系列网站名称,并使用函数createIisWebsite()在IIS中创建它们。你如何模仿厨师食谱?

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服务器集群网站列表中的配方。我感觉我没有采取最佳的练习路线。

任何想法?

+0

Ohai!你有没有找到解决这个问题的办法?任何答案都有帮助吗?请不要忘记将其中一个标记为正确:) – sethvargo 2014-02-01 18:34:21

回答

5

问题是函数是在配方中定义的,只能在该配方中使用。 include_recipe方法可确保给定的配方已加载,但不会将任何内容导入执行包含的配方中。

由于您的函数正用于声明具有一些计算参数的Chef资源,因此最接近的内容是Definition (Chef Docs)。定义与Resources类似,具有一个名称和一组可选参数,但实际上是简单的宏,它们在编译时扩展到配方中。

在你的食谱目录下,创建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 

如果你的食谱对服务器的每个集群将是相同的但对于站点列表,您可能需要考虑将此数据存储在attributesdata bags中。这可以帮助您避免在食谱中重复自己,并且还可以让您在不更新食谱的情况下添加网站。

+4

当然,您也可以检出并创建一个LWRP。有关厨师邮件列表中删除厨师定义的讨论。 – 2013-05-08 11:36:41

+0

Chef社区的不同部分对Chef的使用有不同的意见。虽然定义(和角色)的价值已经多次在邮件列表上进行辩论,但我不知道有任何计划要删除。如果您碰巧知道其他情况,请告诉我! – zts 2013-07-22 16:34:28

+0

谢谢,会给这个镜头。为了让事情顺利进行,我只是将这个功能留在配方中。 是的,网站的列表是其他地方可以通过网络API获得,而不是其他系统需要访问的数据包,Chef Web API没有.Net客户端库,并且auth似乎有些定制。 – Janaka 2013-12-30 09:33:28