首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模块化厨师食谱?

如何模块化厨师食谱?
EN

Stack Overflow用户
提问于 2013-05-08 01:27:57
回答 1查看 7.2K关注 0票数 7

下面是一个循环访问网站名称数组并使用函数createIisWebsite()在IIS中创建它们的工作食谱示例。

代码语言:javascript
复制
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访问。

代码语言:javascript
复制
websiteNames = ["website-2", "website-3", "website-4"]

for websiteName in websiteNames do
    createIisWebsite websiteName
end

现在,我希望能够从这本Cookbook中的多个食谱调用函数createIisWebsite()。

我试着把它放到一个助手模块(库)中。在那里,我无法获得对iis_site的引用。

我试着将函数移到default.rb,然后执行include_recipe "::default“。这似乎也不起作用。

我收到“无法在windows版本6.2.9200上找到createIisWebsite的资源”

我之所以采用这种方法,是因为我想要一个包含每个web服务器集群的网站列表的食谱。我有一种感觉,我没有选择最佳实践路线。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-08 18:01:43

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

由于您的函数用于声明带有一些计算参数的Chef资源,因此最需要查看的是Definition (Chef Docs)。定义看起来类似于Resources,有一个名称和一组可选参数,但实际上是一些简单的宏,它们在编译时被展开到配方中。

在您的cookbook目录中,创建包含以下内容的definitions/my_iis_website.rb

代码语言:javascript
复制
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

然后,将食谱中的循环替换为:

代码语言:javascript
复制
for websiteName in websiteNames do
    my_iis_website websiteName
end

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16425064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档