Как мне использовать одного поставщика для нескольких сборок упаковщика в шаблоне в формате HCL?

#provisioning #packer #hcl #packer-builder #hashicorp-packer

#подготовка #упаковщик #hcl #создатель упаковщика #hashicorp-packer

Вопрос:

Я использую Packer для подготовки виртуальной машины для конвейера CI моего проекта, который размещен на поддерживаемом облачном провайдере. Мои сценарии подготовки немного сложны, поэтому мне нужно тщательно их повторять, чтобы получить их правильно. Чтобы сэкономить деньги, я использую локальный конструктор изображений с теми же поставщиками, что и в cloud builder. Этот локальный образ не будет использоваться в производстве или даже в разработке; он просто помогает мне проверять мои сценарии подготовки (и результирующую среду).

Поскольку я тестирую свои скрипты provisioner, я хочу поделиться одним provisioner блоком со всеми соответствующими build блоками. Однако я ни за что на свете не могу понять, как это сделать; на данный момент я копировал и вставлял свой provisioner блок. only Поле — это единственное поле, которое меняется, поскольку я обычно не хочу создавать локальные и облачные образы одновременно. Как я могу использовать один provisioner блок в нескольких build блоках в шаблоне в формате HCL плюс случайное переопределение?

Вот (упрощенная версия) кода, который я хочу сжать:

 # Variables go here...

source "vagrant" "windows-local" {
  source_path = "gusztavvargadr/visual-studio"
  box_name = "build-runner-windows-local"
  box_version = "v2019.0.2010"
  communicator = "ssh"
  # Other fields omitted for brevity
}

source "amazon-ebs" "windows" {
  access_key = "${var.aws_access_key}"
  ami_name = "build-runner-windows"
  communicator = "winrm"
  instance_type = "t2.micro"
  region = "${var.aws_region}"
  secret_key = "${var.aws_secret_key}"
  source_ami_filter {
    filters = {
      name = "Windows_Server-2019-English-Full-Base-2020.11.11"
      root-device-type = "ebs"
      virtualization-type = "hvm"
    }
    most_recent = true
    owners = ["amazon"]
  }
  # Other fields omitted for brevity
}

build {
  name = "windows-aws"
  sources = ["source.amazon-ebs.windows"]

  provisioner "powershell" {
    environment_vars = [
      "AWS_ACCESS_KEY_ID=${var.aws_access_key}",
      "AWS_SECRET_ACCESS_KEY=${var.aws_secret_key}",
      "AWS_DEFAULT_REGION=${var.aws_region}",
      "A_DOZEN_MORE_VARS=..."
    ]
    only = ["amazon-ebs.windows"] # Note: Not the same value as in the windows-local build
    scripts = [
      "windows/first-script.ps1",
      "windows/second-script.ps1",
      "windows/cleanup.ps1"
    ]
  }
  provisioner "windows-restart" {}

}

build {
  name = "windows-local"
  sources = ["source.vagrant.windows-local"]

  provisioner "powershell" {
    environment_vars = [
      "AWS_ACCESS_KEY_ID=${var.aws_access_key}",
      "AWS_SECRET_ACCESS_KEY=${var.aws_secret_key}",
      "AWS_DEFAULT_REGION=${var.aws_region}",
      "A_DOZEN_MORE_VARS=..."
    ]
    only = ["vagrant.windows-local"]  # Note: Not the same value as in the windows-aws build
    scripts = [
      "windows/first-script.ps1",
      "windows/second-script.ps1",
      "windows/cleanup.ps1"
    ]
  }
  provisioner "windows-restart" {}
}
 

Ответ №1:

Вам просто нужно добавить исходные компоновщики в исходные коды в сборке. В вашем случае это было бы:

 build {
  sources = [
       "source.vagrant.windows-local",
       "source.amazon-ebs.windows"
  ]

  provisioner "powershell" {
    environment_vars = [
      "AWS_ACCESS_KEY_ID=${var.aws_access_key}",
      "AWS_SECRET_ACCESS_KEY=${var.aws_secret_key}",
      "AWS_DEFAULT_REGION=${var.aws_region}",
      "A_DOZEN_MORE_VARS=..."
    ]
    only = ["vagrant.windows-local"]  # Note: Not the same value as in the windows-aws build
    scripts = [
      "windows/first-script.ps1",
      "windows/second-script.ps1",
      "windows/cleanup.ps1"
    ]
  }
  provisioner "windows-restart" {}
}
 

Затем вы можете удалить name из сборки и добавить их в конкретный исходный блок, например:

 source "vagrant" "windows-local" {
  name = "windows-local"
  source_path = "gusztavvargadr/visual-studio"
  box_name = "build-runner-windows-local"
  # ...
}

source "amazon-ebs" "windows" {
  name = "windows-aws"
  access_key = "${var.aws_access_key}"
  ami_name = "build-runner-windows"
  # ...
}
 

Если вам нужна дополнительная информация, вот документ, который может оказаться полезным:
https://www.packer.io/docs/templates/hcl_templates/blocks/build/source
https://www.packer.io/docs/templates/hcl_templates/blocks/build/provisioner