【问题标题】:How do you modularize a Chef recipe?您如何模块化 Chef 食谱?
【发布时间】:2019-10-04 17:43:53
【问题描述】:

这是一个工作配方的示例,它遍历网站名称数组并使用函数 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 服务器集群的网站列表的配方。我觉得我没有采取最佳实践路线。

有什么想法吗?

【问题讨论】:

  • 噢!你有没有找到解决这个问题的方法?任何答案有帮助吗?请不要忘记将其中一项标记为正确:)

标签: ruby chef-infra chef-recipe cookbook


【解决方案1】:

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

由于您的函数用于声明具有一些计算参数的 Chef 资源,因此最接近的就是 Definition (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 中。这有助于您避免在食谱中重复自己,并且还允许您在不更新食谱的情况下添加网站。

【讨论】:

  • 当然您也可以签出并创建一个 LWRP。已经在厨师邮件列表中讨论了从厨师中删除定义。
  • Chef 社区的不同部分对使用 Chef 有不同的看法。虽然定义(和角色)的价值已经在邮件列表中多次讨论过,但我不知道有任何删除的计划。如果你碰巧知道,请告诉我!
  • 谢谢,会试一试。为了使事情正常进行,我只是将功能留在了配方中。是的,网站列表可以通过 Web API 而不是数据包在其他地方获得,因为其他系统需要访问,而且 Chef Web API 没有 .Net 客户端库,而且身份验证似乎有些定制。
  • @GiannisNohj 你能用厨师图书馆做同样的事情吗?如果有的话有什么建议吗?
  • Chef documentation on definitions 表示自定义资源旨在取代定义和 LWRP,并鼓励人们迁移到自定义资源。但是,定义并未被弃用。
猜你喜欢
  • 2014-11-06
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多