如何在Packer的配置脚本中传递参数?

22
我很难将输入参数传递给packer的配置脚本。我已经尝试了各种选项,但没有成功。 目标是我的provision.sh应该接受我在packer构建期间发送的输入参数。 我能够在JSON文件中获取用户变量,但无法将其传递给配置脚本。我需要根据输入参数做出决策。 我尝试过类似以下的操作:
"provisioners": 
{
  "type": "shell",
  "scripts": [
  "provision.sh {{user `role`}}"
 ]
}

但是打包程序本身的验证失败了,并显示“没有这样的文件/目录”错误消息。

如果有人能帮我解决这个问题,那就太好了。

提前致谢。

2个回答

37
你应该使用environment_vars选项,参见文档Shell Provisioner - environment_vars
示例:
"provisioners": [
  {
    "type": "shell"
    "environment_vars": [
      "HOSTNAME={{user `vm_name`}}",
      "FOO=bar"
    ],
    "scripts": [
      "provision.sh"
    ],
  }
 ]

2
$1、$2等是“参数”。您可以在脚本中使用它们的名称来使用“环境变量”,例如$HOSTNAME和$FOO。我建议您开始阅读一些(ba)sh脚本的介绍,例如http://tldp.org/LDP/abs/html/。 - Rickard von Essen
我明白你的意思。谢谢。 - Thayz
@volvox 抱歉,我不理解你的评论?在问题、我的回答以及任何评论(除了你的评论)中都没有提到 HOSTTYPE - Rickard von Essen
抱歉,让我澄清一下。我的观点是你正在设置环境变量。为了减少AMI在不同地区之间复制的成本,同时减少等待packer生成AMI副本的时间,我会将packer封装起来,并同时使用nohup处理进程。如果每个packer进程都试图写入一个shell环境变量,则会覆盖相同的变量,这是不可取的。在这种情况下,T J Biddle的答案会更好。 - volvox
很抱歉,那没有任何意义。我的答案和T J Biddle的答案没有优劣之分,它们只是两种实现相同目标的不同解决方案。 - Rickard von Essen
显示剩余2条评论

20
如果您的脚本已经配置好使用参数,那么您只需要将其作为inline运行而不是在scripts数组中运行即可。
为此,脚本必须已经存在于系统上 - 您可以通过使用file提供程序将其复制到系统上来实现这一点。
  "provisioners": [
    {
      "type":        "file",
      "source":      "scripts/provision.sh",
      "destination": "/tmp/provision.sh"
    },
    {
      "type": "shell",
      "inline": [
        "chmod u+x /tmp/provision.sh",
        "/tmp/provision.sh {{user `vm_name`}}"]
    }
  ]

非常感谢。 - Thayz
任何时候!如果这篇回答对您有帮助,请务必接受它 @Thayz - TJ Biddle
TJ Biddle。我认为@Rickard-von-Essen的解决方案解决了我的问题,所以我接受了他的答案。尽管如此,您的解决方案在将来也会很有用。非常感谢。 - Thayz

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