如何在Packer中使用文件配置器的用户变量?

时间:2017-06-21 10:22:03

标签: packer

我有一个包装工json,如:

"builders": [{...}],
"provisioners": [
          {
                "type": "file",
                "source": "packer/myfile.json",
                "destination": "/tmp/myfile.json"
           }
  ],
"variables": {
        "myvariablename": "value"
 }

和myfile.json是:

{
   "var" : "{{ user `myvariablename`}}"
}

文件中的变量确实被替换,是文件唯一可用的选项后,是否使用shell provisioner替换了sed?

使用打包器版本0.12.0

4 个答案:

答案 0 :(得分:6)

您必须将这些作为环境变量传递。例如:

  "provisioners": [
    {
      "type": "shell"
      "environment_vars": [
        "http_proxy={{user `proxy`}}",
      ],
      "scripts": [
        "some_script.sh"
      ],
    }
  ],
  "variables": {
    "proxy": null
  }

在脚本中,您可以使用$http_proxy

答案 1 :(得分:0)

到目前为止,我只提供了使用文件和Shell配置程序的解决方案。上载文件,然后通过Shell Provisioner替换文件中的变量,这些变量可以由例如HashiCorp保险库

答案 2 :(得分:0)

您可能会使用OS导出功能来设置环境并将其传递给Packer

这里是使用OS ENV_NAME值的配置,用于选择要从中复制的本地文件夹 export ENV_NAME=dev会将本地文件夹设置为dev

{
  "variables": {
    ...
    "env_folder": "{{env `ENV_NAME`}}",
  },
  "builders": [{...}]
  "provisioners": [
    {
      "type": "file",
      "source": "files/{{user `env_folder`}}/",
      "destination": "/tmp/"
    },
    {...}
  ]
}

答案 3 :(得分:-1)

必须首先在模板的变量部分中定义用户变量。即使您希望用户变量默认为空字符串,也必须定义它。这种显式有助于减少新手理解使用模板中的变量可以修改的内容所需的时间。

变量部分是用户变量名称到默认值的键/值映射。默认值可以是空字符串。示例如下所示:

 {
 "variables": {
"aws_access_key": "",
 "aws_secret_key": ""
 },

"builders": [{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
// ...
}]
}

check this link for more information