Имя переменных динамического упаковщика

#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

  1. name=test1 packer build -var-file var.json main.json
  2. 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 .