Packer: Используйте HCL

Созданный на 16 дек. 2014  ·  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 Комментарий

cc @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 , который существует довольно давно: smile :. HCL все еще идет!

Поскольку он все еще готовится, подходящее время для включения файлов с запросом функции? см. https://github.com/mkheironimus/packergen

@jevonearth есть альтернатива до добавления hcl

все еще скоро?

@mitchellh @sethvargo - это тот автор HCL, о котором вы упомянули: https://github.com/hashicorp/hcl/tree/master/hcl/printer

Жду YAML. Не очень в HCL

Обернуть упаковщик функцией bash и преобразовать 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

16 января 2017 г. в 12:31 Рикард фон Эссен [email protected] написал:

Довольно просто обернуть упаковщик функцией bash и преобразовать 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 \ ")); напечатать YAML :: dump (json)»
-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите чат.

HCL

HashiCorp необходимо проявить немного веры в себя и использовать HCL везде, где это возможно. Либо HCL была хорошей идеей, и им следует с ней работать, либо HCL была ошибкой, а Terraform - катастрофой. Очевидно, что последнее неверно. Итак, как новый оценщик / приверженец, я должен сказать, что вызывает беспокойство то, что эти 2 продукта кажутся «двумя спецслужбами, которые не разговаривают друг с другом».

Я с @sethvargo. Давайте наденем символ лютоволка и провозгласим, что "HCL идет". (Не только это, но и сделать это возможным.)

JSON

Нет необходимости вносить какие-либо изменения в добавление комментариев в JSON. Решение было дано нам Дугласом Крокфордом и проиллюстрировано Николасом Чаммасом в The Notorious Two Eight Three https://github.com/mitchellh/packer/issues/283#issuecomment -60039068

YAML

Майнеры Ruby любят YAML и с самого начала дали нам решение использовать его. Это замечательно продемонстрировал Рикард фон Эссен 2 комментария назад https://github.com/mitchellh/packer/issues/1768#issuecomment -272921740 (хотя я бы предпочел использовать ARGF.read как я делаю ниже)

И так далее

Мне нравится, что HashiCorp позволяет легко использовать столько или меньше их продуктов, сколько вам нужно. Это хорошо согласуется с философией unix (как резюмировал Питер Х. Салус в «Четверть века 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

Я создаю небольшой PR для шаблонов yaml, для моего ограниченного тестирования он отлично работает для меня.

Определенно то, что мы планируем исследовать. Но пока, поскольку это не то, на что мы нацелены на 1.0, я собираюсь закрыть это. Пожалуйста, просмотрите список рассылки для получения более подробной информации о 1.0.

Пора снова открыть выпуск. Определенно HCL должен быть языком конфигурации по умолчанию в Packer.

PS: До сих пор не понимает, почему почти все проблемы были закрыты, есть проекты, вехи и теги для управления проблемами.

Мы планируем это сделать. Поскольку это такой масштабный ремонт, мы хотим убедиться, что делаем его хорошо. Следующим шагом для нас является прохождение нашего RFC-процесса, который будет отдельным вопросом.

Я приветствую JSON5, YAML и HCL. Чистый JSON - это больно.

@ darkn3rd Мы чувствуем вашу боль, и это достаточно болезненно, что мы, Джойент, поддерживаем ветку JSON5, которая отслеживает master потому что текущая ситуация неприемлема для любого, кто действительно использует и поддерживает любое реальное количество шаблонов упаковщиков: https: //github.com/joyent/packer/tree/f-json5

/ me делает мысленную заметку об обновлении ветки на этой неделе

У нас почти 3 года "в ближайшее время" ... Я новичок с упаковщиком и удивлен, мягко говоря, тем, что он не поддерживает HCL. Не могу дождаться, чтобы проверить это.

Я просто сказал своему другу: «Эй, лат, перенеси этот ужасный json в HCL, это же инструмент hashicorp, верно?». Как я был неправ ...

Если это интересно, yacker (утилита Python) оборачивает Packer в интерпретатор YAML-to-JSON. Это ничего поразительное - это только предоставляет вам YAML-обертку , которая преобразует шаблон и переменные файлы временно в JSON перед передачей управления упаковщиком.

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

Команда упаковщиков? Почему вы до сих пор не предоставляете HCL? Я создаю небольшой патч для поддержки YAML почти год назад, он работает нормально, и вы отклоняете его по причине, что скоро появится HCL. Но за год ничего не изменилось!
Что вы скажете?

Все еще идет

@vtolstov см. # 7023

Специалисты по внутренним продуктам в HashiCorp решили, что мы собираемся пропустить HCL1 и вместо этого внедрить HCL2; извините, это так и не было реализовано, но я обещаю, что мы активно работаем над поддержкой HCL2 прямо сейчас.

Спасибо за обновление. Мы не отказались от этого.

Спасибо, @SwampDragons! Учитывая, что над этим активно работают, следует ли снова открыть этот вопрос?

Хорошая точка зрения; он был случайно закрыт, когда мы закрыли связанный PR без слияния.

Очень рад за поддержку HCL2 с упаковщиком!

@SwampDragons Есть новости о HCL, пожалуйста?

Мы надеемся (но не обещаем) выпустить это с выпуском 1.5.0. У команды есть рабочий прототип в ветке, но он еще не доработан и не укреплен, и, придется подсовывать его чуть позже. Цель - до конца года, желательно ближе к сентябрю, чем к декабрю.

Я вернулся через несколько лет и был удивлен, что он все еще открыт.
Рад, что он уже в пути в 1.5.

@SwampDragons У вас есть приблизительные сроки, когда 1.5.0 будет доступна (даже в виде бета-версии)?

Если изменение является сложным (и для этого могут быть очень веские причины), то не намного ли меньше риск и стоимость разработки, если оставить в покое совершенно хороший инструмент, и вместо того, чтобы изменять основной формат определения, предоставьте _adapters_, которые конвертируют формат-X в JSON?

Просто мысль.

Я не хочу упрощать проблему, и у вас могут быть действительно важные причины для изменения основного формата, но, учитывая время и усилия, которые тратятся на это, если речь идет только о том, как пользователи определяют свои файлы, то как проект, это нужны ли _языковые адаптеры_, такие как yacker ?

@alanbchristie Честно говоря, все это время активно не работали; эта проблема долгое время оставалась позади, «мы должны подумать об этом», совсем недавно, потому что мы хотели посмотреть и увидеть, как развертывание HCL2 идет с Terraform 0.12, чтобы мы могли извлечь уроки из их процесса, прежде чем пытаться сделать это снова сами . Я не думаю, что это будет почти такой же трудный процесс, как для Terraform, но я не могу говорить о деталях, потому что, как я уже сказал, это проект, над которым работает

@NickLarsenNZ В дорожной карте, которую я показываю моему боссу, написано где-то в октябре или ноябре. Если хотите, я могу связаться с вами, как только у нас будет тестовая сборка.

Я новичок в упаковщике ... но буду честен, тот факт, что эта проблема не решалась в течение 5-6 лет, не только обескураживает, но и крайне расстраивает.

Использование jq для удаления комментариев во время обходного пути означает, что, вероятно, есть 99 комментариев, которые остались незаписанными на каждый 1 комментарий, написанный с помощью jq для удаления.

Я мог бы несколько дней говорить о том, что json, реализованный упаковщиком, не подходит для этой задачи, но тот факт, что он не допускает комментариев и поощряет дублирование кода / конфигурации (почему я чувствую, что мне нужно написать упаковщик json псевдокомпилятор для повторного использования конфигурации).

Заблокирован для уменьшения шума; @azr вернулся, и я попрошу его сообщить обновленную информацию по этой проблеме, включая предоставление бета-сборок, когда у него будет возможность.

Всем привет ! У меня хорошие новости 🎉 😃

Недавно мне потребовалось довольно много времени, чтобы осуществить переход на 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.
Правильно ли вы планируете использовать встроенную поддержку JSON в HCL / HCL2?

Есть ли конвертер json2hcl? У меня есть хорошо сделанные сценарии упаковщика из Netflix OSS, которые я хотел бы преобразовать в HCL.

Привет всем, я очень рад этому изменению!

@ darkn3rd Я планирую сделать конвертер для конкретного упаковщика, чтобы пользователи могли быстро попробовать его, не слишком много копируя, вставляя и редактируя.

@mexisme Библиотека HCL полностью понимает JSON, но формат немного изменен, поэтому потребуются некоторые правки. Я попробую преобразовать файл в JSON (или что-то еще) с помощью конвертера.


⚠️ мой первый пример изменился и немного больше похож на терраформ.

Пример файла 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 рейтинги