Chef wrapper 食谱只应用一次内部食谱

Chef wrapper cookbooks only apply internal cookbook once

我有一本食谱 "blah-deploy-nodejs-from-git" 食谱,它从 GIT 安装 nodejs 代码库并在目录上调用 NPM 安装。它具有以下属性

git_repo
branch
destination

然后我编写了食谱,为需要安装的各个站点包装该食谱。在这种特殊情况下 "blah-pricing" 和 "blah-notifications" 具有不同的覆盖属性:

me@me cat cookbooks/blah-svc-pricing/attributes/default.rb 
    node.override[:blah_deploy_nodejs_from_git][:destination]  = "/var/blah/pricing"
    node.override[:blah_deploy_nodejs_from_git][:branch]  = "master"
    node.override[:blah_deploy_nodejs_from_git][:git_repo]  = "https://hqdevgit01.blah.lan/micro-services/blah-pricing.git"

me@me:~/chef-repo$ cat cookbooks/blah-svc-notifications/attributes/default.rb 
    node.override[:blah_deploy_nodejs_from_git][:destination]  = "/var/blah/notifications"
    node.override[:blah_deploy_nodejs_from_git][:branch]  = "master"
    node.override[:blah_deploy_nodejs_from_git][:git_repo]  = "https://hqdevgit01.blah.lan/micro-services/blah-notifications.git"

然后这两种情况的配方是一样的:

  include_recipe 'blah-deploy-nodejs-from-git'

不幸的是,即使我的节点应用了两本食谱,它也只应用了一次内部配方。我的理解是包装食谱用于定制食谱并使其独一无二。

能否将内部食谱封装到两个不同的食谱中,具有不同的属性,并让包装食谱都应用该内部食谱?或者我是否必须完全复制内部食谱中的代码?

这是由于对厨师工作方式的基本误解所致。食谱并不意味着如何做某事的过程,它们意味着声明某事应该是什么样子。因此,您需要将它们视为描述最终状态,而不是到达那里的过程。

因此,厨师绝不会运行一个菜谱重复两次。并且属性真的不应该在 运行 中更改(除非它们被更新以指示在 运行 中发生的事情。幸运的是,还有其他厨师功能可以解决您的问题。您需要一个定义或一个LWRP(轻量级资源提供者)

定义只是一组经常重复的资源。因此,您可以创建一个定义,然后在具有不同属性的同一配方中多次调用它。很像你目前正在用你的食谱做的。

虽然定义有时是合适的,但 LWRP 通常更强大,并且已成为 Chef 中大多数重复性(类似库)任务的首选方法。使用 LWRP,您将定义一个新的 chef 原语(很像文件、服务等),然后编写代码来实现该原语的目标。然后,您可以在食谱中的任何位置使用这些资源。在您的情况下,您将拥有一个 npm_deployer 资源,该资源具有回购、分支和目标的属性。然后它将执行当前在您的部署程序配方中的工作。然后,您的 "wrapper" 食谱将停止调用 include_recipe,而只是声明一个 npm_deploy 资源并传入所需的属性。