厨师包装食谱仅适用于内部食谱

时间:2015-05-19 18:20:12

标签: node.js git chef

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

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'

不幸的是,即使我的节点同时应用了两个烹饪书,它也只应用了一次内部配方。我的理解是包装食谱用于定制食谱并使其独特。

可以将内部食谱封装到两个不同的食谱中,具有不同的属性,并且包装食谱都适用于内部食谱吗?或者我是否必须完全复制内部菜谱中的代码?

1 个答案:

答案 0 :(得分:0)

这是由于对厨师如何工作的基本误解。食谱并不是一个如何做某事的程序,它们应该是一个什么东西应该是什么样的声明。因此,您需要将它们视为描述最终状态,而不是达到目标的过程。

因此,厨师绝不会两次运行食谱。并且属性实际上不应该在运行中更改(除非它们被更新以指示在运行中发生的事情。幸运的是,还有其他主厨功能可以解决您的问题。您需要定义或LWRP(轻量级资源提供商)< / p>

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

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