使用Packer覆盖Chef-Client中的角色属性

时间:2019-02-12 16:37:37

标签: chef chef-recipe packer

我担任厨师:

{
  "name": "my-role",
  "description": "Defines a role",
  "override_attributes": {
    "cookbook_one" {
      "key": "value"
    }
  }
  "run_list": [
    recipe["cookbook_one"],
    recipe["cookbook_two"]
  ]
}

我在预配程序块中与Packer通话:

{
  "variables": {
    "my-variable": ""
  },
  "provisioners": [
    {
      "type": "chef-client",
      "server_url": "https://mychefserver.com/",
      "run_list": "role[my-role]",
      ...
    }

我需要能够从Packer中将一些属性添加到recipe_two。我读到可以使用json block of the chef-client预配器将一些属性添加到运行列表。我尝试过

  "type": "chef-client",
  "server_url": "https://mychefserver.com/",
  "run_list": "role[my-role]",
  "json": {
    "override_attributes": {
      "cookbook_two": {
        "some_key": "value"
      }
    }
  }

当我运行打包程序时,我可以在/tmp/packer-chef-client/first-boot.json

中看到
   {
     "override_attributes": {
       "cookbook_two": {
         "some_key": "{{ user `my-variable` }}"
       }
     },
     "run_list": [
       "role[my-role]"
     ]
   }

但是食谱_two的override_attributes不会暴露给食谱。我找不到如何使它以这种方式工作的任何示例,也找不到正确的“ json”:{}块格式通过。

通过Packer调用的角色向我的食谱公开覆盖属性的任何方向都将受到赞赏

2 个答案:

答案 0 :(得分:0)

您发出的问题与打包程序本身无关,而是如何执行chef-client并为厨师客户运行提供自定义属性。

您可以通过在chef-client中加入--json-attributes(我强烈建议您访问文档,因为其中包含示例)来提供自定义属性

  

-j PATH, --json-attributes PATH

     

包含JSON数据的文件的路径。用于设置第一个客户端运行。对于将来使用选项-i进行的所有运行,这些属性应保留在Chef服务器中。

回到包装工的问题... 创建一个具有您要覆盖的属性的json文件,并确保您使用--json-attributes从打包程序中调用Chef-client,并将其指向您创建的json文件。

答案 1 :(得分:0)

您的打包程序文件不应包含multiprocessing部分。相反,它应该是这样的:

totalcoins = None
coinN = None
sum_total = range

while coinN != '0' and totalcoins != '0':
    coinN = input("Please enter first amount:   ")
    if coinN == "":
        print("You didn't enter anything")
    else:
        totalcoins = input("Please enter second amount   ")
        if totalcoins == "":
            print("You didn't enter anything")
        else:
            sum_total = int(coinN) + int(totalcoins)
            if sum_total in range(100):
                    print('Sorry, you only entered {} cents'.format(sum_total))
            else:
                if sum_total == 100:
                    print('The sum of {0} and {1} is = 1 rand     '.format(coinN, totalcoins, sum_total))
            if sum_total >=100:
                print('The sum of {0} and {1} is = {2} rand   '.format(coinN, totalcoins, sum_total))
                print("\n")