2015-05-19 192 views
0

我有一本食谱“blah-deploy-nodejs-from-git”食谱,它从GIT安装nodejs代码库,并在目录上调用NPM安装。它具有以下属性厨师包装食谱一次只应用内部食谱

git_repo 
branch 
destination 

然后我写了换行cookook为inidividual网站,即可安装需要的食谱。在这种particar情况下,“嗒嗒定价”和“嗒嗒的通知”,它有不同的压倒一切的属性:

[email protected] 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" 

[email protected]:~/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' 

不幸的是,正在申请即使我的节点同时应用了烹饪书,内部食谱也只有一次。我的理解是,包装食谱用于定制食谱并使其独特。

可以将内部烹饪书封装成两种不同的烹饪书,具有不同的属性,并且包装烹饪书都应用这种内部烹饪方法吗?或者我将不得不完全复制内部食谱中的代码?

+0

你能提供你用来调用这个的代码吗?它是否在角色的运行列表中?你是否手动打电话给他们? –

+0

包装食谱都与角色关联,并且这两个角色都与单个节点相关联。 – akaphenom

+0

您是否验证过这两个角色正在执行?你可以尝试的是将这两个配方放在一个角色的运行列表中,看看它是否能够满足你的需求。我没有在单个节点上完成多个角色,所以我不知道这是否是共享食谱的问题。 –

回答

0

这是由于对厨师工作原理的基本误解。食谱并不意味着如何做某件事的程序,它们是为了表明某件事物应该是什么样子。因此,您需要将它们视为描述最终状态,而不是实现目标的过程。

因此,厨师永远不会运行一个配方两次。而且属性真的不应该在中途改变(除非它们被更新以表示中途发生的事情)幸运的是,还有其他的厨师功能可以解决你的问题,你需要一个定义或者LWRP(轻量资源提供者)

定义只是组资源,常常重复。所以,你可以创建一个定义,然后再多次调用它在相同的配方具有不同的属性。就像你现在用你的食谱做什么。

虽然定义有时是合适的,但是LWRP通常更强大,并且已经成为Chef中对于大多数重复(类库)任务的首选方法。使用LWRP,您将定义一个新的厨师原型(很像文件,服务等),并且t母鸡编写完成该原语目标的代码。然后,您可以在食谱中的任何地方使用这些资源。在你的情况下,你将拥有一个npm_deployer资源,它拥有repo,branch和destination的属性。然后它会完成当前在您的部署者配方中的工作。你的“包装器”食谱会停止调用include_recipe,而只是声明一个npm_deploy资源并传递所需的属性。

+0

谢谢你。我花了一点时间才能回到这个项目,但是ytour的评论提供了一些有用的见解 – akaphenom