#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