如何模块化一个Chef食谱



下面是一个工作配方的示例,它循环遍历网站名称数组,并在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

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

最新更新