#packer #packer-builder #hashicorp-packer
#упаковщик #упаковщик-конструктор #hashicorp-упаковщик
Вопрос:
Пример использования — использовать файл переменных УПАКОВЩИКА для создания AWS AMI в регионах «us-east-1» и «us-east-2». У меня может быть два отдельных файла для регионов NV и OH. Но я пытаюсь выяснить, можно ли это сделать, используя тот же файл переменных.
Основываясь на значении переменной ‘PACKER_BUILD_REGION‘ в файле Packer_Var_File.json, моя сборка упаковщика должна выбрать значение, специфичное только для региона NV или OH. Есть предложения, как этого добиться?
Команда сборки упаковщика: packer build -var-file Packer_Var_File.json Packer_Build_File.json
Подробная информация о файле Packer_Var_File.json, как указано ниже
{
"PACKER_BUILD_REGION": "NV",
"1": "This Section to defined 'North Verginia' REGION SPECIFIC Varianles for AMI Build",
"!": "================================================================================",
"NV_region": "us-east-1",
"NV_vpc_id": "vpc-00112233",
"NV_subnet_id": "subnet-001122334455",
"NV_ssh_keypair_name": "NV_SSH_KEY",
"NV_ssh_private_key_file": "{{user `NV_ssh_keypair_name`}}.pem",
"NV_security_group_ids": "sg-0101010,sg-0202020,sg-03030303",
"2": "This Section to defined 'OHIO' REGION SPECIFIC Varianles for AMI Build",
"@": "======================================================================",
"OH_region": "us-east-2",
"OH_vpc_id": "vpc-33221100",
"OH_subnet_id": "subnet-554433221100",
"OH_ssh_keypair_name": "OH_SSH_KEY",
"OH_ssh_private_key_file": "{{user `OH_ssh_keypair_name`}}.pem",
"OH_security_group_ids": "sg-121314,sg-131517",
"3": "This Section to defined all COMMON Varianles for AMI Build",
"#": "==========================================================",
"KEY_region": "{{user `PACKER_BUILD_REGION`}}_region",
"KEY_vpc_id": "{{user `PACKER_BUILD_REGION`}}_vpc_id",
"KEY_subnet_id": "{{user `PACKER_BUILD_REGION`}}_subnet_id",
"KEY_source_ami": "{{user `PACKER_BUILD_REGION`}}_source_ami",
"KEY_ssh_keypair_name": "{{user `PACKER_BUILD_REGION`}}_ssh_keypair_name",
"KEY_ssh_private_key_file": "{{user `PACKER_BUILD_REGION`}}_ssh_private_key_file",
"KEY_security_group_ids": "{{user `PACKER_BUILD_REGION`}}_security_group_ids",
"region": "{{ user `KEY_region` }}",
"vpc_id": "{{user `KEY_vpc_id` }}",
"subnet_id": "{{user `KEY_subnet_id` }}",
"ssh_keypair_name": "{{user `KEY_ssh_keypair_name` }}",
"ssh_private_key_file": ".\{{user `KEY_ssh_private_key_file`}}",
"security_group_ids": "{{user `KEY_security_group_ids` }}",
"aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}",
"instance_type": "t3.large",
"iam_profile_name": "Agent_iam_Access",
"ami_description": "AMI on Windows Server 2019 with JDK 1.8.0_251, Chrome Driver 83.0.3987.106, Chrome Browser 83.0.3987.149, and Selenium 3.7.1 Jar",
"ami_regions": "us-east-1,us-east-2",
"ami_users": "01223334444,43322211110"
}
Ответ №1:
Вы можете использовать env
переменные в файле упаковщика. Переменные среды могут использоваться в вашем шаблоне с помощью пользовательских переменных. Функция env доступна только в пределах значения по умолчанию пользовательской переменной, что позволяет по умолчанию использовать пользовательскую переменную в качестве переменной среды.
Я только что протестировал это с помощью простой сборки упаковщика.
var.json
{
"Data": "{{ env `name`}}"
}
main.json
{
"builders": [
{
"type": "file",
"content": "{{user `Data`}}",
"target": "dummy_artifact"
}
]
}
Итак, теперь я должен установить переменную env
name=test1 packer build -var-file var.json main.json
name=test2 packer build -var-file var.json main.json
При первом запуске содержимое файла будет создано как test1, а при втором — как test2.
Итак, теперь давайте вернемся к вашему примеру, если вы примените тот же метод к своему файлу, он не будет работать должным образом. Пример показан ниже:
{
"PACKER_BUILD_REGION": "{{env `MY_CUSTOM_BUILD_REGION `}}"
}
вы не можете использовать переменную внутри переменной. Если вы используете это, то оно не будет работать так, как вы ожидаете, потому что конечное значение будет NV_region
вместо us-east-1
итак, вам нужно обновить файл переменных.
Чтобы вы не могли изменять переменные с помощью переменных, лучше использовать два разных файла для настройки, или вы можете написать свой собственный скрипт bash для генерации переменных, а затем изменить свой файл переменных для извлечения значения env
.