Рейтинг:0

Terraform + Cloud-Init через extra_config и DataSourceVMware

флаг in

Вопрос:

Кто-нибудь успешно использовал облачные образы terraform + extra_config + Ubuntu для взаимодействия с Cloud Init, предоставляя метаданные/пользовательские данные? Я надеюсь, что это будет взаимодействовать с DataSourceVMware, но на данном этапе не уверен.

Что я делал:

Я использую Terraform для развертывания облачных образов Ubuntu на VMware vSphere 7. Достаточно просто использовать свойства vApp:

... код ниже взят из ресурса "vsphere_virtual_machine" "vm" { }

вап {
    свойства = {
        имя хоста = var.vm_Name_Lower
        идентификатор экземпляра = var.vm_Name_Lower
        пользовательские данные = base64encode (файл ("$ {path.module}/userdata.yml"))
    }
}

Но любая попытка использовать extra_config потерпела неудачу. Я хотел бы иметь возможность предоставить как guestinfo.metadata, так и guestinfo.userdata. Но в настоящее время мои тесты с метаданными (см. ниже) не увенчались успехом, поскольку имя хоста не установлено в виртуальной машине:

данные "cloudinit_config" "метаданные" {
    gzip = правда
    base64_encode = истина
    часть {
        content_type = "текст/облачная конфигурация"
        содержимое = <<-EOF
            локальное имя хоста: testvm
            идентификатор экземпляра: testvm
        EOF
    }
}

... код ниже взят из ресурса "vsphere_virtual_machine" "vm" { }

extra_config = {
    "guestinfo.metadata" = data.cloudinit_config.metadata.rendered
    "guestinfo.metadata.encoding" = "gzip+base64"
}

Я вижу запись в журнале vSphere, подтверждающую отправку extra_config:

config.extraConfig("guestinfo.metadata"): (key = "guestinfo.metadata", value = "H4sIAAAAAAAA/2SOTUvGMBCE74H8h/De11dPQsSDHz14qIK ... вырезано

Использованная литература:

Детали версии:

Клиентская система (на которой работает terraform): Ubuntu 20.04.3 LTS
ESXi: 7.0.2 / Сборка: 18538813
vCenter Server: 7.0.2/сборка: 18455184
Образ облака: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
Терраформ v1.0.7
на linux_amd64
реестр провайдера.terraform.io/hashicorp/template v2.2.0
реестр провайдера.terraform.io/hashicorp/vsphere v1.24.3
Рейтинг:0
флаг cn

Делая то же самое с облачными 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"
  }
флаг cn
https://github.com/NetApp/ez-rancher — вдохновение для части `nc -l 12345` :)
Рейтинг:0
флаг in

Проблема в том, что cloud-init по умолчанию вызывает поставщика источника данных OVF перед новым источником данных VMware (начиная с cloud-init 21.3). Terraform предоставляет данные, которые нравятся поставщику источника данных OVF, и поэтому обрабатывает информацию. Это объясняет, почему «пользовательские данные» свойств vApp принимают облачную конфигурацию.

Решение состоит в том, чтобы удалить поставщика источника данных OVF из cloud-init:

  1. [Веб-браузер[ Скачать OVA: https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.ova
  2. [VC UI] Развертывание из OVF, примите значения по умолчанию (кроме выделения дисков, используйте Thin Provisioning).
  3. [VC UI] Изменить настройки / Параметры виртуальной машины / Параметры загрузки / Задержка загрузки = 2000 мс.
  4. [Пользовательский интерфейс VC] Откройте консоль виртуальной машины.
  5. [Консоль виртуальной машины] Включите виртуальную машину.
  6. [Консоль VM] Удерживайте Shift на экране BIOS (чтобы заставить GRUB отображать меню).
  7. [Консоль виртуальной машины] Выберите Дополнительные параметры для Ubuntu.
  8. [Консоль VM] Выберите последнюю версию ядра с «(режим восстановления)» в конце.
  9. [Консоль VM] Выберите «root / Drop to root shell prompt»
  10. [Консоль VM] Нажмите Enter для обслуживания
  11. [Консоль виртуальной машины] # dpkg-reconfigure cloud-init
  12. [VM Console] Отмените выбор всего, кроме VMware и None
  13. [Консоль ВМ] # cloud-init clean
  14. [Консоль ВМ] # shutdown -h сейчас
  15. [VC UI] Изменить настройки / Параметры виртуальной машины / Параметры загрузки / Задержка загрузки = 0 мс.
  16. [Интерфейс VC] Преобразование в шаблон

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.