Packer: 使用盐酸

创建于 2014-12-16  ·  48评论  ·  资料来源: hashicorp/packer

拥有 YAML(或HCL )以减少繁琐并允许评论会很棒。 (见 https://github.com/mitchellh/packer/issues/283)

如果 JSON 必须是配置格式,那么最好允许类似注释的键/值(可能名称以类似注释的字形为前缀)。 例如:

{
  "builders": [
...
  ],
  "provisioners": [
      {
      "#TODO": "turn this into a puppet manifest",
      "type": "shell",
      "script": "setup.sh"
    },
    {
      "type": "shell",
      "execute_command": "sudo -E /bin/bash '{{ .Path }}'",
      "#": "Run as sudo and remove all the things we don't need",
      "inline": ["DEBIAN_FRONTEND=noninteractive apt-get -y clean autoremove"]
    }
  ]
}
core enhancement post-1.0

最有用的评论

大家好 ! 我有一些好消息🎉😃

我最近花了很多时间来实现 HCL2 的迁移,你可以在这里找到实现它的 PR:#8423。 一些二进制文件可以在这里找到。
我们正在尽最大努力测试许多不同的情况以避免错误,但是有很多构建器/配置器/后处理器,我们是一个小团队,因此非常欢迎任何帮助来测试它! 如果你确实尝试了这个并发现了一个错误; 请打开一个新问题,说明这是一个 HCL 错误。

当前(旧)设置 Packer 的方式将继续有效,我们目前计划在一段时间内完全支持这两个版本,直到我们有足够的信心弃用旧版本。

示例 hcl 文件

build {
    sources = [
        "source.amazon-ebs.first",
    ]

    provisioner "shell" {
        inline = [
            "sleep 5"
        ]
    }

    post-processor "shell-local" {
        inline = [
            "sleep 5"
        ]
    }
}

source "amazon-ebs" "first" {
    // access_key = "{{user `aws_access_key`}}"
    // secret_key = "{{user `aws_secret_key`}}"

    ami_name = "hcl2-test"
    region = "us-east-1"
    instance_type = "t2.micro"

    kms_key_id = "c729958f-c6ba-44cd-ab39-35ab68ce0a6c"
    encrypt_boot = true
    source_ami_filter {
        filters {
          virtualization-type = "hvm"
          name =  "amzn-ami-hvm-????.??.?.????????-x86_64-gp2"
          root-device-type = "ebs"
        }
        most_recent = true
        owners = ["amazon"]
    }
    launch_block_device_mappings {
        device_name = "/dev/xvda"
        volume_size = 20
        volume_type = "gp2"
        delete_on_termination = "true"
    }
    launch_block_device_mappings {
        device_name = "/dev/xvdf"
        volume_size = 500
        volume_type = "gp2"
        delete_on_termination = true
        encrypted = true
    }

    ami_regions = ["eu-central-1"]
    run_tags {
        Name = "packer-solr-something"
        stack-name = "DevOps Tools"
    }

    communicator = "ssh"
    ssh_pty = true
    ssh_username = "ec2-user"
    associate_public_ip_address = true
}

PS:文档和变量处理来了!

所有48条评论

抄送@pandacalculus

HCL 即将推出 :smile:

@delitescere这个问题不是#283 的重复吗? 我注意到你在最初的帖子中链接到它,但不清楚这两个问题之间的区别是什么。

在这里,未知密钥的处理方式将与现在不同。 这提出了被忽略的“类似评论”的键。 注释性由众所周知的自闭注释前缀表示(即: #//;

考虑到更大的代码更改以支持非标准 JSON、JSON5、YAML 或 HCL 中的注释,这是一个替代建议。

@sethvargo关于支持 HCL 的评论解决了这个问题。

@sethvargo

HCL 即将推出 :smile:

抱歉打扰您,有更新吗?

它仍然来了 :smile:

我们决定推迟一点,因为我们还没有 HCL 编写器,我们希望保留packer fix作为下几个版本的一个选项。

我喝过 HCL kool-aid。 :+1:

既然 https://github.com/hashicorp/hcl 存在,我们是否可以找到 json 的替代方案? :)

@jevonearth已经存在了很长一段时间:微笑:。 HCL 还在!

既然它还来了,现在是功能请求包含文件的好时机吗? 见https://github.com/mkheironimus/packergen

@jevonearth 这是一个替代方案,直到添加 hcl

还会来吗?

@mitchellh @sethvargo就是你提到的 HCL 作家: https :

等待 YAML。 不是很喜欢 HCL

用 bash 函数包装 packer 并将yaml转换json有点微不足道。

让您开始:

ruby -r json -r yaml -e "yaml = YAML.load(File.read(\"$1\")); print yaml.to_json"

(反之亦然)

ruby -r json -r yaml -e "json = JSON.parse(File.read(\"$1\")); print YAML::dump(json)"

我已经做到了。 不必这样做就好了。 这就是 HCL 存在这张票的原因

2017 年 1 月 16 日下午 12:31,Rickard von Essen [email protected]写道:

用 bash 函数包装 packer 并将 yaml 转换为 json 有点微不足道。

让您开始:

ruby -r json -r yaml -e "yaml = YAML.load(File.read(\"$1\")); 打印 yaml.to_json"
(反之亦然)

ruby -r json -r yaml -e "json = JSON.parse(File.read(\"$1\")); 打印 YAML::dump(json)"

您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看,或将线程静音。

盐酸

HashiCorp 需要对自己表现出一点信心,并在可能的地方使用 HCL。 要么 HCL 是一个好主意,他们应该运行它,要么 HCL 是一个错误,而 Terraform 是一场灾难。 显然后者不是真的。 所以,作为一个新的评估者/采用者,我不得不说这两个产品感觉像是“两个互不联系的情报机构”,这令人担忧。

我和@sethvargo 在一起。 让我们戴上我们的冰原狼纹章,并宣布“HCL 来了”。 (不仅如此,还要让它发生。)

JSON

无需对 JSON 中的硬汉注释进行任何更改。 解决方案是由 Douglas Crockford 给我们的,Nicholas Chammas 在臭名昭著的二八三中举例说明https://github.com/mitchellh/packer/issues/283#issuecomment -60039068

YAML

Ruby 矿工喜欢他们一些 YAML,并从一开始就为我们提供了使用它的解决方案。 这很好地体现在 Rickard von Essen 2 条评论前https://github.com/mitchellh/packer/issues/1768#issuecomment -272921740(尽管我更喜欢使用ARGF.read ,如下所示)

等等

我喜欢 HashiCorp 使您可以根据需要轻松使用尽可能多或尽可能少的产品。 它非常符合 Unix 哲学(正如 Peter H. Salus 在 A Quarter-Century of Unix (1994) 中总结的那样):

  • 编写只做一件事并把它做好的程序。
  • 编写程序以协同工作。
  • 编写程序来处理文本流,因为这是一个通用接口。

我们应该没问题:

JSON

$ cat > example.json <<'EOF'
// from: https://www.packer.io/intro/getting-started/vagrant.html
{
    // can't we take this out?
    "variables": {
        "aws_access_key": "", // why is this blank?
        "aws_secret_key": ""  // ditto
    },
    "builders": [{
        "type": "amazon-ebs",
        "access_key": "{{user `aws_access_key`}}",
        "secret_key": "{{user `aws_secret_key`}}",
        "region": "us-west-2",
        "source_ami": "ami-b7a114d7",
        "instance_type": "t2.micro",
        "ssh_username": "ubuntu",
        "ami_name": "packer-example {{timestamp}}",
        "tags": {
            "created_by": "Packer.io/example"
        }
    }],
    "provisioners": [{
        "type": "shell",
        "inline": [
            "sleep 30",
            "sudo apt-get update",
            "sudo apt-get install -y redis-server"
        ]
    }],
    "post-processors": ["vagrant"]
}
EOF

$ packer validate <(jsmin < example.json)
Template validated successfully.

YAML

$ cat > example.yaml <<'EOF'
---
# from: https://www.packer.io/intro/getting-started/vagrant.html

# can't we take this out?
variables:
  aws_access_key: '' # why is this blank?
  aws_secret_key: '' # ditto

builders:
- type: amazon-ebs
  access_key: '{{user `aws_access_key`}}'
  secret_key: '{{user `aws_secret_key`}}'
  region: us-west-2
  source_ami: ami-b7a114d7
  instance_type: t2.micro
  ssh_username: ubuntu
  ami_name: packer-example {{timestamp}}
  tags:
    created_by: Packer.io/example

provisioners:
- type: shell
  inline:
  - sleep 30
  - sudo apt-get update
  - sudo apt-get install -y redis-server

post-processors:
- vagrant
EOF

$ packer validate <(ruby -r json -r yaml -e "print YAML.load(ARGF.read).to_json" < example.yaml)
Template validated successfully.

bitmoji

我正在为 yaml 模板创建小 pr,对于我的有限测试,它对我来说很好用。

绝对是我们计划调查的事情。 不过现在,由于这不是我们 1.0 的目标,我将关闭它。 有关 1.0 的更多详细信息,请参阅邮件列表

是时候重新打开问题了。 当然 HCL 应该是 Packer 中的默认配置语言。

PS:仍然不知道为什么几乎所有问题都关闭了,有项目、里程碑和标签来管理问题。

这是我们计划做的事情。 由于这是一次如此大规模的检修,我们希望确保我们做得很好。 我们的下一步是完成我们的 RFC 流程,这将是一个单独的问题。

我欢迎 JSON5、YAML 和 HCL。 纯 JSON 是痛苦的。

@darkn3rd我们感受到你的痛苦,而且我们 Joyent 维护一个跟踪masterJSON5 分支已经够痛苦了,因为对于实际使用和维护任何实际数量的打包程序模板的任何人来说,当前情况都是站不住脚的: https: //github.com/joyent/packer/tree/f-json5

/me 记下本周更新分支

我们已经接近 3 年的“即将推出”......我是包装机的初学者,我很惊讶,至少可以说,它不支持 HCL。 等不及要测试了。

我只是说我的朋友“嘿,lat 将那个糟糕的 json 迁移到 HCL,它是一个 hashicorp 工具,对吧?”。 我错了……

如果感兴趣, yacker (一个 Python 实用程序)会将 Packer 包装在 YAML-to-JSON 解释器中。 这没什么惊天动地的- 它只是为您提供了一个 YAML 包装器,可以在将控制权传递给 Packer 之前将模板和变量文件临时转换为 JSON。

https://yacker.readthedocs.io/en/latest/

包装工队? 为什么你们还不提供HCL? 我几乎在一年前为 YAML 支持创建了小补丁,效果很好,你有理由拒绝它,HCL 即将到来。 但一年后什么都没有改变!
你说的话?

还在来 :wink:

@vtolstov见 #7023

HashiCorp 的内部产品人员决定我们将直接跳过 HCL1 并实施 HCL2; 抱歉,这从未实施,但我保证我们现在正在积极致力于 HCL2 支持。

谢谢你的更新。 我们没有放弃这一点。

谢谢@SwampDragons! 鉴于正在积极开展这项工作,是否应该重新打开此问题?

好点子; 当我们在没有合并的情况下关闭关联的 PR 时,它被意外关闭。

对包装器的 HCL2 支持感到非常兴奋!

@SwampDragons 有关于 HCL 的消息吗?

我们希望(但不希望)在 1.5.0 版本中发布它。 该团队在一个分支中有一个工作原型,但它尚未完善或强化,而且@azr即将推迟一段时间。 目标是到年底,最好是比 12 月更接近 9 月。

几年后我回来了,很惊讶这仍然是开放的。
很高兴它在 1.5 中实现了。

@SwampDragons你对 1.5.0 何时可用(即使是测试版)有任何粗略的时间表吗?

如果更改很复杂(并且可能有很好的原因),那么单独留下一个完美的工具不是会降低开发风险和成本吗,而不是更改核心定义格式,而是提供转换的_适配器_格式-X 到 JSON?

只是一个想法。

我不想轻视这个问题,您可能有非常重要的理由来更改核心格式,但是,考虑到为此花费的时间和精力,如果只是关于用户如何定义他们的文件,那么作为一个项目,是需要_语言适配器yacker吗?

@alanbchristie公平地说,一直以来都没有积极开展工作; 很长一段时间以来,“我们应该考虑这个”问题一直是一个次要的问题,最近是因为我们想看看 HCL2 的推出是如何与 Terraform 0.12 一起进行的,这样我们就可以在尝试自己再次尝试之前从他们的过程中学习. 我认为这个过程不会像 Terraform 那样艰巨,但我无法谈论细节,因为就像我说的,这是@azr 正在进行的一个项目,他目前正在体验父母的幸福。 ;) 当他回来时,我会问他是否可以为你们所有人写一点进展更新。

@NickLarsenNZ我给老板

我是包装工的新手……但老实说,这个问题已经有 5 到 6 年没有解决的事实不仅令人沮丧,而且非常令人沮丧。

在解决方法时使用jq去除评论,意味着每 1 条用 jq 写入的评论可能有 99 条评论未被写入。

我可以继续几天,由 packer 实现的 json 是如何不适合这项任务的,但事实上它不允许评论并鼓励代码/配置重复(为什么我觉得我需要编写一个 packer json伪编译器以启用配置重用)。

锁定以减少噪音; @azr回来了,当他有机会时,我会让他提供有关此问题的最新信息,包括提供 beta 版本。

大家好 ! 我有一些好消息🎉😃

我最近花了很多时间来实现 HCL2 的迁移,你可以在这里找到实现它的 PR:#8423。 一些二进制文件可以在这里找到。
我们正在尽最大努力测试许多不同的情况以避免错误,但是有很多构建器/配置器/后处理器,我们是一个小团队,因此非常欢迎任何帮助来测试它! 如果你确实尝试了这个并发现了一个错误; 请打开一个新问题,说明这是一个 HCL 错误。

当前(旧)设置 Packer 的方式将继续有效,我们目前计划在一段时间内完全支持这两个版本,直到我们有足够的信心弃用旧版本。

示例 hcl 文件

build {
    sources = [
        "source.amazon-ebs.first",
    ]

    provisioner "shell" {
        inline = [
            "sleep 5"
        ]
    }

    post-processor "shell-local" {
        inline = [
            "sleep 5"
        ]
    }
}

source "amazon-ebs" "first" {
    // access_key = "{{user `aws_access_key`}}"
    // secret_key = "{{user `aws_secret_key`}}"

    ami_name = "hcl2-test"
    region = "us-east-1"
    instance_type = "t2.micro"

    kms_key_id = "c729958f-c6ba-44cd-ab39-35ab68ce0a6c"
    encrypt_boot = true
    source_ami_filter {
        filters {
          virtualization-type = "hvm"
          name =  "amzn-ami-hvm-????.??.?.????????-x86_64-gp2"
          root-device-type = "ebs"
        }
        most_recent = true
        owners = ["amazon"]
    }
    launch_block_device_mappings {
        device_name = "/dev/xvda"
        volume_size = 20
        volume_type = "gp2"
        delete_on_termination = "true"
    }
    launch_block_device_mappings {
        device_name = "/dev/xvdf"
        volume_size = 500
        volume_type = "gp2"
        delete_on_termination = true
        encrypted = true
    }

    ami_regions = ["eu-central-1"]
    run_tags {
        Name = "packer-solr-something"
        stack-name = "DevOps Tools"
    }

    communicator = "ssh"
    ssh_pty = true
    ssh_username = "ec2-user"
    associate_public_ip_address = true
}

PS:文档和变量处理来了!

这是好消息@azr ,感谢您和团队。

WRT:弃用 JSON。
您是否打算利用 HCL / HCL2 的内置 JSON 支持?

有 json2hcl 转换器吗? 我从 Netflix OSS 制作了很好的打包脚本,我很想将它们转换为 HCL。

大家好,我对这个变化感到兴奋!

@darkn3rd我计划做一个

@mexisme HCL 库完全理解 JSON,但格式略有变化,因此需要进行一些编辑。 我也会尝试让转换器将文件转换为 JSON(或其他)。


⚠️ 我的第一个例子发生了变化,看起来更像 terraform。

示例 hcl 文件

build {
    sources = [
        "source.amazon-ebs.first",
    ]

    provisioner "shell" {
        inline = [
            "sleep 5"
        ]
    }

    post-processor "shell-local" {
        inline = [
            "sleep 5"
        ]
    }
}

source "amazon-ebs" "first" {
    // access_key = "{{user `aws_access_key`}}"
    // secret_key = "{{user `aws_secret_key`}}"

    ami_name = "hcl2-test"
    region = "us-east-1"
    instance_type = "t2.micro"

    kms_key_id = "c729958f-c6ba-44cd-ab39-35ab68ce0a6c"
    encrypt_boot = true
    source_ami_filter {
        filters {
          virtualization-type = "hvm"
          name =  "amzn-ami-hvm-????.??.?.????????-x86_64-gp2"
          root-device-type = "ebs"
        }
        most_recent = true
        owners = ["amazon"]
    }
    launch_block_device_mappings {
        device_name = "/dev/xvda"
        volume_size = 20
        volume_type = "gp2"
        delete_on_termination = "true"
    }
    launch_block_device_mappings {
        device_name = "/dev/xvdf"
        volume_size = 500
        volume_type = "gp2"
        delete_on_termination = true
        encrypted = true
    }

    ami_regions = ["eu-central-1"]
    run_tags {
        Name = "packer-solr-something"
        stack-name = "DevOps Tools"
    }

    communicator = "ssh"
    ssh_pty = true
    ssh_username = "ec2-user"
    associate_public_ip_address = true
}

可以在这里找到新的二进制文件

我将锁定此问题,因为它已关闭 _30 天_⏳。 这有助于我们的维护人员找到并关注活跃的问题。

如果您发现与此类似的问题,请打开一个新问题并完成问题模板,以便我们可以获取进一步调查所需的所有详细信息。

此页面是否有帮助?
0 / 5 - 0 等级