如何从外部源将参数传递给Chef配方

时间:2016-08-25 17:54:30

标签: powershell chef chef-recipe

我是Chef的新手并在这里寻求帮助。我正在考虑使用Chef将我们的构建部署到Chef节点服务器(Windows Server 2012机器)。我有一个名为copy_builds的食谱,它会发送到中央存储库并选择我们要部署的构建并将其复制到节点服务器。我的配方包含执行复制步骤的基本步骤,这个配方可以用于我们想要部署的所有构建,除了一件事:构建名称。

以下是食谱的一个例子:

powershell_script 'Copy build files' do
  code '
    $Project = "Dev3_SomeCoolBuild"
    net use "\\\\server\\build_share\\drop\\$Project"
    $BuildNum = GC "\\\\server\\build_share\\drop\\$Project\\buildlabel.txt"
    robocopy \\\\server\\build_share\\drop\\$Project\\bin W:\\binroot\\$BuildNum'
end

如您所见,变量$ Project包含此配方中的构建名称。如果我们有100个不同的版本,所有版本都有不同的名称,那么在不为我的copy_builds食谱创建100个不同的食谱的情况下处理此问题的最佳方法是什么?

BTW:这就是我目前正在调用Chef进行部署的方式,这是在Chef外部的PowerShell脚本中:

knife node run_list set $Node "recipe[copy_builds::$ProjectName],recipe[install_build]"

此命令(来自外部PowerShell脚本)包含其自己的$ ProjectName变量中的项目/构建名称信息。在这种情况下,$ ProjectName包含' Dev3_SomeCoolBuild'的值,以引用配方Dev3_SomeCoolBuild.rb。

我想要的是在copy_builds cookbook下只有一个默认配方,并传入构建/项目名称。这可能吗?什么是最好的方法呢?我已经阅读了有关数据包,属性和提供程序的信息,但不确定它们是否可以满足我的需求。

请告知。

谢谢, 基思

2 个答案:

答案 0 :(得分:0)

最适合您的方法可能是使用单个配方来获取要从数据库或节点属性(或两者)部署的项目列表。所以基本上把你现在拥有的东西放在一个循环中,然后使用任一角色设置节点属性或将项目映射放入数据库项目。

答案 1 :(得分:0)

我最终在这里使用属性来解决我的问题。我更新了我的脚本,将构建名称写入copy_builds配方的attributes / default.rb文件,并在每次运行部署时将cookbook上传到Chef。

我的配方现在包括调用属性文件以获取构建名称,如下所示:

powershell_script 'Copy build files' do
  code <<-EOH
    $BuildNum = GC \\\\hqfas302002c\\build_share\\drop\\"#{node['copy_builds']['build']}"\\buildlabel.txt
    robocopy \\\\hqfas302002c\\build_share\\drop\\"#{node['copy_builds']['build']}"\\webbin W:\\binroot\\$BuildNum /E
    EOH
end

现在我给Chef的电话看起来像这样:

    knife node run_list set $Node "recipe[copy_builds],recipe[install_build]"