包装模板和条件语句

wwr*_*wwr 5 packer

我想在"供应商"阶段的包装模板中使用条件语句.

  "provisioners": [
    {
      "execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}'",
      "override": {
        "virtualbox-iso": {
          "scripts": [
            "scripts/base.sh",
            "scripts/puppet.sh",
          ]
        }
      },
      "type": "shell",
    }
  ]
Run Code Online (Sandbox Code Playgroud)

例如,如果用户在"packer build"命令行中以某种方式指定"puppet"参数,那么将执行"scripts/puppet.sh",否则将跳过.

我怎样才能做到这一点?

小智 8

我不认为使用打包器本机模板格式化是可能的,因为打包器使用JSON格式进行配置,只要我知道不支持条件语句之类的流控制机制.但是应该可以使用用户变量和shell配置程序归档类似的行为.

这个想法

最简单的方法应该是从build命令设置用户变量,并将此变量从packer传递给shell provisioner脚本,该脚本检测用户变量的值并调用相应的配置脚本,例如puppet,salt,...

免责声明:

我没有测试这种方法,但它应该给你一个暗示我的意思,也许你可以想出一个更好的解决方案.;-)

解决问题的方法

1.定义指示使用的配置器的变量:

有多种方法可以定义用户变量,

  • 通过使用-var标志调用packer build命令(请参阅answere的结尾)
  • 在box-template文件中定义用户变量

    包装盒模板文件:template.json

        "variables": [
            "using_provision_system": "puppet"
        ]
        "provisioners": [
             {...}
    
    Run Code Online (Sandbox Code Playgroud)
  • 定义变量定义文件,并使用-var-file在build命令中指定它的路径

    变量file:variables.json 如果要在单独的文件中定义变量,那么它是一个很好的选择.

        {
           "using_provision_system": "puppet"
        }
    
    Run Code Online (Sandbox Code Playgroud)

2.调用调用供应脚本的shell脚本:

现在修改execute_command,方法是使用定义的变量作为参数调用"master"脚本.

"provisioners": [
    {
      "execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}' '{{user `using_provision_system`}}'",
      "override": {
        "virtualbox-iso": {
          "scripts": [
            call_provisioner_script.sh
          ]
        }
      },
      "type": "shell",
    }
  ]
Run Code Online (Sandbox Code Playgroud)

注意,我们只需要指定一个脚本.这个'master'脚本将传递的变量作为参数,并在切换条件下将该值与某些预定义的配置器名称进行比较.(简短:它选择执行哪些配置脚本.)

主配置脚本:call_provisioner_script.sh

case $1 in
    puppet*) sh puppet_provisioner.sh
    *) sh shell_provisioner.sh
Run Code Online (Sandbox Code Playgroud)

照顾自己!
由于此脚本将在您的框内运行,因此您可能需要在执行此命令之前将脚本上载到框中.

3.最后一步是建立你的盒子:)

调用打包程序构建命令:

#define variable in build command (first option from above)
$ packer build -var 'using_provision_system=puppet' template.json

#define variables in variable file and set path in build command
$ packer build -var-file=variables.json template.json
Run Code Online (Sandbox Code Playgroud)

可能有一种方法可以在您的框中设置环境变量,并使用这种类型的变量来指定配置器,而不是使用用户变量.


jef*_*eon 6

另一种方法是定义2个类型相同但名称不同的不同构建器。然后,您可以使用only字段从特定构建中排除配置步骤:

{
  "source": "foo.txt",
  "destination": "/opt/foo.txt",
  "type": "file",
  "only": ["docker-local"]
}
Run Code Online (Sandbox Code Playgroud)