2016-12-14 7 views
1

У меня есть то, что, как представляется, как действительный прецедентом для неподдерживаемых - AFAIK - сценарий, используя packer.io и я волнуюсь, я мог бы быть что-то не хватает ...Могу ли я использовать один построитель пакетов с множеством провайдеров и все еще выполнять параллельные сборки?

Так, в упаковщика, я могу добавить:

  • многих builders,
  • имеет различный name за застройщик,
  • использовать построитель name в only сечении provisioners и, наконец,
  • запустите packer build -only=<builder_name>, чтобы эффективно ограничить мою сборку только проводниками в сочетании с конкретным строителем.

Все в порядке.

То, что я сейчас пытаюсь сделать, использует одно и то же базовое изображение, чтобы создать 3 разных сборки (и в результате AMI). Очевидно, что я мог бы просто скопировать-вставить одну и ту же конфигурацию строителя 3 раза, а затем использовать 3 разных провайдера, привязывая их к соответствующему строителю, используя параметр only.

Это чувствует себя полностью расточительно и очень подвержен ошибкам хотя ... Похоже, я должен быть в состоянии использовать тот же строитель и просто предел, которые применяются provisioners ..?

Мое единственное решение для использования 3 скопированных встраиваемых конструкций? Есть ли лучшее решение?

ответ

1

only работает над фильтрами на строителе name, так что это не вариант.

Вы могли бы решить эту проблему с любым из этих aproches:

  1. Preprocess в JSON и создать 3 шаблоны из одного.

  2. Используйте шаблон с пользовательской переменной, определяющей, какая из них будет построена 3 раза. Используйте условия для переменной в сценариях для запуска правильных сценариев.

  3. Создайте базовый AMI с общими частями шаблона, а затем запустите 3 разных сборки, чтобы обеспечить различия.

В общем, упаковщик пытается решить одну вещь, не включая расширенный DSL для описания различных вариантов сборки, которые уменьшает объем. Легко препроцессить и создать json для более сложных случаев использования.

+0

Фактически, 'only' работает над именем' build', который по умолчанию установлен в 'type'. Но вы можете установить собственное имя. https://www.packer.io/docs/templates/provisioners.html#run-on-specific-builds –

+0

Да, правильно. Я обновил свой ответ. Спасибо за указание на это. –

1

У меня была такая же проблема, когда я хочу построить 2 разных ОИМ (один для постановки, один для производства), и единственная разница между ними - это группа, которую можно применять во время подготовки. Создав ответ от @Rickard ov Essen, я написал сценарий bash, используя jq, чтобы дублировать раздел строителя конфигурации.

Вот мой packer.json файл:

{ 
    "builders": [ 
     { 
      "type": "amazon-ebs", 
      "name": "staging", 
      "region": "ap-southeast-2", 
      "source_ami_filter": { 
       "filters": { 
        "virtualization-type": "hvm", 
        "name": "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-*", 
        "root-device-type": "ebs" 
       }, 
       "owners": ["099720109477"], 
       "most_recent": true 
      }, 
      "instance_type": "t2.nano", 
      "ssh_username": "ubuntu", 
      "force_deregister": true, 
      "force_delete_snapshot": true, 
      "ami_name": "my-ami-{{ build_name }}" 
     } 
    ], 
    "provisioners": [ 
     { 
      "type": "ansible", 
      "playbook_file": "provisioning/site.yml", 
      "groups": ["{{ build_name }}"] 
     } 
    ] 
} 

анзибль пользователь Provisioner переменная build_name выбрать, какую анзибль группу для запуска.

Тогда у меня есть Баш скрипт build.sh который запускает пакера сборки:

#!/bin/bash 

jq '.builders += [.builders[0] | .name = "production"]' packer.json > packer_temp.json 

packer build packer_temp.json 

rm packer_temp.json 

Вы можете увидеть, что файл packer_temp.json выглядит на this jqplay.

Если вам нужно добавить больше МАСС вы можете просто держать добавить больше JQ фильтры:

jq '.builders += [.builders[0] | .name = "production"] | .builders += [.builders[0] | .name = "test"] 

Это добавит еще один AMI для test.

 Смежные вопросы

  • Нет связанных вопросов^_^