Делая то же самое с облачными OVA Ubuntu, я нашел небольшой обходной путь. Это не идеально, так как включает перезагрузку, то есть вам нужен местный исполнитель
provisioner, чтобы определить, когда экземпляр фактически завершен, но он работает.
Допустим, у вас есть два файла yaml, которые вы используете для пользовательских данных. Первый из них вы передаете с помощью свойств vApp с именем vapp-userdata.yaml
а затем второй, который вы передаете для источника данных VMware с именем гость-userdata.yaml
Что-то подобное в Terraform
вап {
свойства = {
пользовательские данные = base64encode (data.template_file.vapp_userdata [count.index]. Rendered)
}
}
extra_config = {
"guestinfo.metadata" = base64encode(data.template_file.guest-metadata[count.index].рендеринг)
"guestinfo.metadata.encoding" = "base64"
"guestinfo.userdata" = base64encode(data.template_file.userdata.рендеринг)
"guestinfo.userdata.encoding" = "base64"
}
В вашей vapp-userdata.yaml
есть write_file
действие, которое перезаписывает текущие определения источников данных и удаляет ОВФ
как вы уже достигли этой точки.
записи_файлы:
- путь: /etc/cloud/cloud.cfg.d/90_dpkg.cfg
владелец: корень: корень
разрешения: "0644"
содержание: |
datasource_list: [VMware, нет]
Затем внизу заканчиваем перезагрузкой
power_state:
тайм-аут: 600
режим: перезагрузка
Когда виртуальная машина перезагрузится после этой последней команды, она прочитает в VMware
источник данных, определенный в новой конфигурации cloud-init, и будет обрабатывать ваши гость-userdata.yaml
и метаданные.yaml
если вы тоже это определили.
Что касается обнаружения, когда он закончен, я все еще пытаюсь найти лучший способ сделать это. Самый простой способ начать нк -л 12345
в конце гость-userdata.yaml
и иметь локального поставщика, который продолжает работу, когда он может подключиться к TCP/12345
, но это оставляет вас с открытым слушателем netcat на TCP/12345
что далеко от идеала.
Если вы найдете лучший способ, ответьте :)
Редактировать
Там определенно будет лучший способ сделать это, но...
На дне гость-userdata.yaml
выполнить команду:
- mkdir -p /mnt/общая папка
- sysctl -w vm.overcommit_memory=1
- sysctl -w ядро.panic=10
- sysctl -w ядро.panic_on_oops=1
- curl https://releases.rancher.com/install-docker/${docker_version}.sh | ш
- usermod -aG докер убунту
-nc -l 1234 и ncpid=$! #запустить nc и получить PID
- спать 20
- kill $ncpid #kill PID, как только Terraform успеет подключиться
Затем в качестве поставщика в конце вашего .tf
файл
поставщик "local-exec" {
# Дождаться cmds cloud-init userdata
# Netcat: z (сканировать только порт), w1 (подождать 1 секунду)
command = "count=0; until $(nc -zw1 ${self.default_ip_address} 1234); do sleep 1; count=`expr $count + 1`; done"
}