如何在Packer中使用文件提供程序与用户变量?

12

我有一个类似于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替换是这里唯一可行的选项吗?
使用Packer版本0.12.0。

你有没有找到一个可行的解决方案? - John Humphreys
@JohnHumphreys-w00te 不好意思,不是的。 - MarMan
你可以让Ansible驱动Packer,这样做会更加灵活,因为它在模板化方面非常出色。 - John Humphreys
Ansible是一种过程化工作流,从长远来看不适合用于管道供应。 - Michael Martinez
4个回答

12
你需要将它们作为环境变量传递。例如:
  "provisioners": [
    {
      "type": "shell"
      "environment_vars": [
        "http_proxy={{user `proxy`}}",
      ],
      "scripts": [
        "some_script.sh"
      ],
    }
  ],
  "variables": {
    "proxy": null
  }

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


1
environment_vars 仅适用于 shell provisioner,而不适用于 file provisioner: https://www.packer.io/docs/provisioners/file.html - MarMan

1

到目前为止,我只想到使用文件和shell provisioner的解决方案。上传文件,然后通过shell provisioner替换文件中的变量,这些变量可以从模板变量中提供,例如HashiCorp Vault。


0

您可以使用操作系统的导出功能来设置环境并将其传递给Packer

这里有一个配置,使用操作系统的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
用户变量必须首先在模板的变量部分中定义。即使您希望用户变量默认为空字符串,也必须进行定义。这种明确性有助于缩短新手理解可以通过模板中的变量进行修改的时间。
变量部分是用户变量名称与默认值之间的键/值映射。默认值可以是空字符串。下面是一个示例:
 {
 "variables": {
"aws_access_key": "",
 "aws_secret_key": ""
 },

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

点击此链接以获取更多信息


谢谢Favour,但问题更多地涉及如何使用由Packer使用的外部文件(通过文件提供程序)中的变量。 - MarMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接