【问题标题】:Can I use one packer builder with many provisioners and still run parallel builds?我可以使用一个带有多个配置器的打包器构建器并且仍然运行并行构建吗?
【发布时间】:2016-12-14 16:09:22
【问题描述】:

对于不受支持的 - afaik - 场景,我似乎有一个有效的用例,使用 packer.io,我担心我可能会遗漏一些东西......

所以,在打包器中,我可以添加:

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

这一切都很好。

我现在尝试做的是使用相同的基础映像来创建 3 个不同的构建(以及生成的 AMI)。显然,我可以复制粘贴相同的构建器配置 3 次,然后使用 3 个不同的配置器,使用 only 参数将每个配置器链接到各自的构建器。

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

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

【问题讨论】:

    标签: packer


    【解决方案1】:

    我遇到了同样的问题,我想构建 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。

    【讨论】:

    • 这很棒。您可以使用 bash process substitution 避免临时文件在您的情况下:packer build <(jq '.builders += [.builders[0] | .name = "production"]' packer.json)
    【解决方案2】:

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

    你可以用这些方法来解决这个问题:

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

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

    3. 使用模板的通用部分构建一个基础 AMI,然后在该模板上运行 3 个不同的构建版本。

    通常,Packer 试图很好地解决一件事,不包括用于描述范围缩小的不同构建风格的高级 DSL。为更高级的用例预处理和创建 json 很容易。

    【讨论】:

    • 实际上,only 适用于构建name,默认设置为type。但是您可以设置自定义名称。 packer.io/docs/templates/…
    • 是的,正确的。我已经更新了我的答案。感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多