我可以将一个打包器构建器与多个配置程序一起使用并仍然运行并行构建吗?

时间:2016-12-14 16:09:23

标签: packer

对于一个不受支持的afaik场景,我有一个看似有用的用例,使用packer.io并且我担心我可能会遗漏某些内容......

所以,在包装工中,我可以添加:

  • 很多builders
  • 每个构建器具有不同的name
  • 在供应商的name部分使用构建器only,最后
  • 运行packer build -only=<builder_name>以有效地将我的构建限制为仅与特定构建器组合的配置器。

这一切都很好。

我现在要做的是使用相同的基本图像来创建3个不同的构建(以及产生的AMI)。显然,我可以复制粘贴相同的构建器配置3次,然后使用3个不同的配置器,使用only参数将每个配置器链接到相应的构建器。

这感觉完全浪费非常容易出错虽然......听起来我应该能够使用相同的构建器并且只限制应用哪些配置器。 ?

我唯一的解决方案是使用3个复制粘贴的构建器吗?有没有更好的解决方案?

2 个答案:

答案 0 :(得分:2)

我有同样的问题,我想建立2个不同的AMI(一个用于升级,一个用于生产),它们之间的唯一区别是在配置期间应用的ansible组。建立@Rickard ov Essen的答案我使用jq编写了一个bash脚本来复制配置的构建器部分。

这是我的packer.json文件:

{
    "builders": [
        {
            "type": "amazon-ebs",
            "name": "staging",
            "region": "ap-southeast-2",
            "source_ami_filter": {
                "filters": {
                    "virtualization-type": "hvm",
                    "name": "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-*",
                    "root-device-type": "ebs"
                },
                "owners": ["099720109477"],
                "most_recent": true
            },
            "instance_type": "t2.nano",
            "ssh_username": "ubuntu",
            "force_deregister": true,
            "force_delete_snapshot": true,
            "ami_name": "my-ami-{{ build_name }}"
        }
    ],
    "provisioners": [
        {
            "type": "ansible",
            "playbook_file": "provisioning/site.yml",
            "groups": ["{{ build_name }}"]
        }
    ]
}

ansible供应商使用变量build_name来选择要运行的ansible组。

然后我有一个运行打包器构建的bash脚本build.sh

#!/bin/bash

jq '.builders += [.builders[0] | .name = "production"]' packer.json > packer_temp.json

packer build packer_temp.json

rm packer_temp.json

您可以在this jqplay上查看packer_temp.json文件的内容。

如果您需要添加更多AMI,您可以继续添加更多jq过滤器:

jq '.builders += [.builders[0] | .name = "production"] | .builders += [.builders[0] | .name = "test"]

这将为test添加另一个AMI。

答案 1 :(得分:1)

only适用于构建器name上的过滤器,因此这不是一个选项。

您可以使用以下任何一个程序解决此问题:

  1. 预处理json并从一个创建3个模板。

  2. 使用带有用户变量的模板来定义它的构建并构建3次。在脚本中使用变量条件来运行正确的脚本。

  3. 使用模板的公共部分构建基础AMI,然后在配置差异的基础上运行3个不同的构建。

  4. 总的来说,Packer尝试通过不包括用于描述范围减少的不同构建风格的高级DSL来很好地解决一件事。对于更高级的用例,预处理和创建json很容易。