Я не думаю, что это возможно с собственным форматом шаблона упаковщика, потому что упаковщик использует формат JSON для конфигурации, который, насколько я знаю, не поддерживает механизмы управления потоком, такие как условный оператор. Но должно быть возможно заархивировать подобное поведение с помощью пользовательских переменных. и поставщик оболочки.
Идея
Самый простой способ — установить пользовательскую переменную из команды сборки и передать эти переменные от упаковщика. к сценарию инициализатора оболочки, который определяет значение пользовательской переменной и вызывает соответствующий скрипт инициализатора, например. марионетка, соль,...
Отказ от ответственности:
Я не проверял этот подход, но он должен дать вам подсказку о том, что я имею в виду, и, возможно, вы сможете найти еще лучшее решение. ;-)
Подход к решению проблем
<сильный>1. Определите переменную, которая указывает используемый поставщик:
Существует несколько способов определения пользовательской переменной,
вызвав команду сборки упаковщика с флагом -var (см. конец ответа)
определить пользовательские переменные в файле шаблона коробки
The packer box template file: **template.json**
"variables": [
"using_provision_system": "puppet"
]
"provisioners": [
{...}
определить файл определения переменной и указать путь к нему в команде сборки с -var-file
The variable file: **variables.json**
Is a great alternative if you want to define variables in a seperate file.
{
"using_provision_system": "puppet"
}
<сильный>2. Вызов сценария оболочки, который вызывает сценарии поставщика:
Теперь измените команду execute_command таким образом, чтобы «главный» сценарий вызывался с определенной переменной в качестве аргумента.
"provisioners": [
{
"execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}' '{{user `using_provision_system`}}'",
"override": {
"virtualbox-iso": {
"scripts": [
call_provisioner_script.sh
]
}
},
"type": "shell",
}
]
Обратите внимание, нам нужно указать только один скрипт. Этот один «главный» сценарий принимает переданную переменную в качестве аргумента и сравнивает значение с некоторыми предопределенными именами поставщиков в условии переключения. (Коротко: он выбирает, какие сценарии подготовки будут выполняться.)
основной сценарий предоставления: call_provisioner_script.sh
case $1 in
puppet*) sh puppet_provisioner.sh
*) sh shell_provisioner.sh
Будьте осторожны!
Поскольку этот сценарий будет выполняться внутри вашего устройства, вам может потребоваться загрузить сценарии на устройство до того, как эта команда будет выполнена.
<сильный>3. Последний шаг — собрать коробку :)
Вызов команды сборки упаковщиков:
#define variable in build command (first option from above)
$ packer build -var 'using_provision_system=puppet' template.json
#define variables in variable file and set path in build command
$ packer build -var-file=variables.json template.json
Вместо использования пользовательских переменных, возможно, должен быть способ установить переменные среды в вашем поле и использовать переменную этого типа для указания поставщика.
19.04.2015
only=["base" "puppet"]
. Затем запуск упаковщика с-only=base,puppet
в качестве cli-аргумента должен выполнить шаги подготовкиbase
иpuppet
. По крайней мере, я этого ожидал :) 21.05.2021only=["puppet" "salt"...]
для базового поставщика иonly=["puppet"]
для марионеточного. Тогда должно быть достаточно запустить оба провайдера (базовый и марионеточный) сpacker -only=puppet
. 21.05.2021