7

这是一个工作配方的示例,它遍历网站名称数组并使用函数 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"。这似乎也不起作用。

我收到“在 Windows 版本 6.2.9200 上找不到 createIisWebsite 的资源”

我采用这种方法的原因是因为我想要一个包含每个 Web 服务器集群的网站列表的配方。我觉得我没有采取最佳实践路线。

有任何想法吗?

4

1 回答 1

6

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

由于您的函数用于声明具有一些计算参数的 Chef 资源,因此最接近的就是定义 (Chef Docs)。定义看起来类似于资源,具有名称和一组可选参数,但实际上是在编译时扩展为配方的简单宏。

在您的食谱目录中,创建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代替。这可以帮助您避免在食谱中重复自己,还可以让您在不更新食谱的情况下添加网站。

于 2013-05-08T10:01:43.057 回答