При развертывании в vSphere с использованием статического IP-адреса службе vRealize Automation Cloud Assembly требуется создать спецификацию настройки vSphere, и эта спецификация может вступать в конфликт с командами cloud-init.

Проблема

  • Шаблон vRealize Automation Cloud Assembly содержит аргумент assignment: static для применения статического IP-адреса к виртуальной машине vSphere.
  • Облачный шаблон также содержит раздел cloudConfig, который включает команды инициализации, выполняемые с помощью cloud-init.
  • Чтобы назначить статический IP-адрес виртуальной машине, vRealize Automation Cloud Assembly динамически создает спецификацию настройки vSphere, которую необходимо применить.
  • При каждом применении спецификации настройки последняя операция перезапускает виртуальную машину.
  • Спецификация настройки не содержит информацию о том, что выполняются команды cloud-init, поэтому процесс перезапуска прерывает их.
  • Команды cloud-init выполняются только при первой загрузке и не восстанавливаются автоматически в случае прерывания.
  • В результате виртуальная машина настраивается только частично.

Решение

Создайте шаблон компьютера, который позволяет отключать команду cloud-init по времени. Затем разверните компьютеры с помощью шаблона, чтобы спецификация настройки и перезапуск могли выполняться до cloud-init.

Пример процедуры: Ubuntu 18.04

Следующая процедура применима к Ubuntu 18.04. Возможно, для других версий Linux или продуктов потребуется внести изменения и адаптировать предлагаемое ниже решение.

  1. Создайте виртуальную машину и установите все необходимые обновления версий и пакеты.

    Обратите внимание, что в других решениях Linux команда cloud-init может не быть доступна по умолчанию, как в Ubuntu 18.04.

  2. Перенастройте cloud-init, установите для datasource значение OVF.

    sudo dpkg-reconfigure cloud-init

  3. Отредактируйте следующий файл.

    /etc/cloud/cloud.cfg

    1. а.Включите обычную настройку гостевых операционных систем (GOSC), добавив следующую строку.

      disable_vmware_customization: true

    2. б.Убедитесь, что конфигурация сети включена. Удалите или закомментируйте параметр disable, если он существует.
      network:
        # config: disabled

      Кроме того, проверьте все файлы конфигурации в следующем каталоге.

      /etc/cloud/cloud.cfg.d/*

      Удалите все файлы, содержащие параметр network: {config: disabled}.

  4. Отредактируйте следующий файл.

    /usr/lib/tmpfiles.d/tmp.conf

    • Чтобы запретить очистку временного каталога, закомментируйте соответствующий параметр.

      # D /tmp 1777 root root –

  5. Отредактируйте следующий файл.

    /lib/systemd/system/open-vmtools.service

    • Настройте open-vmtools на запуск после dbus.service, добавив следующую строку в разделе [Unit].

      After=dbus.service

  6. Создайте новый пустой файл, который отключает cloud-init.

    sudo touch /etc/cloud/cloud-init.disabled

  7. Создайте сценарий re_init.sh. После задержки задания cron, которое приостанавливается для выполнения спецификации настройки, сценарий повторно включает и инициализирует cloud-init.
    sudo rm -rf /etc/cloud/cloud-init.disabled
    sudo cloud-init init
    sleep 20
    sudo cloud-init modules --mode config
    sleep 20
    sudo cloud-init modules --mode final
  8. Добавьте разрешение на запуск сценария.

    sudo chmod +x re_init.sh

  9. Создайте задание cron, которое будет выполняться с задержкой в 90 секунд при запуске. Наберите crontab -e и введите следующее выражение:

    @reboot ( sleep 90 ; sh /script_path/delay_init.sh )

    Если для выполнения спецификации настройки и перезапуска требуется больше времени, можно указать значение больше 90 секунд.

  10. Создайте сценарий cleaner.sh, который очищает шаблон. Вместо cloudadmin укажите пользователя, который был настроен при установке операционной системы.

    Пример сценария предназначен для Ubuntu. Чтобы создать сценарий для других вариантов Linux, включите выделенные обязательные разделы.

    #!/bin/bash
    
    # Add usernames to add to /etc/sudoers for passwordless sudo
    users=("ubuntu" "cloudadmin")
    
    for user in "${users[@]}"
    do
    cat /etc/sudoers | grep ^$user
    RC=$?
    if [ $RC != 0 ]; then
    bash -c "echo \"$user ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers"
    fi
    done
    
    #grab Ubuntu Codename
    codename="$(lsb_release -c | awk {'print $2}')"
    
    
    #Stop services for cleanup
    service rsyslog stop
    
    #clear audit logs
    if [ -f /var/log/audit/audit.log ]; then
    cat /dev/null > /var/log/audit/audit.log
    fi
    if [ -f /var/log/wtmp ]; then
    cat /dev/null > /var/log/wtmp
    fi
    if [ -f /var/log/lastlog ]; then
    cat /dev/null > /var/log/lastlog
    fi
    
    #cleanup persistent udev rules
    if [ -f /etc/udev/rules.d/70-persistent-net.rules ]; then
    rm /etc/udev/rules.d/70-persistent-net.rules
    fi
    
    #cleanup /tmp directories
    rm -rf /tmp/*
    rm -rf /var/tmp/*
    
    #cleanup current ssh keys
    #rm -f /etc/ssh/ssh_host_*
    
    #cat /dev/null > /etc/hostname
    
    #cleanup apt
    apt-get clean
    
    #Clean Machine ID
    
    truncate -s 0 /etc/machine-id
    rm /var/lib/dbus/machine-id
    ln -s /etc/machine-id /var/lib/dbus/machine-id
    
    #Clean Cloud-init
    cloud-init clean --logs --seed
    
    #cleanup shell history
    history -w
    history -c
    
  11. Добавьте разрешение на запуск сценария очистки шаблона.

    sudo chmod +x cleaner.sh

  12. В Ubuntu 18.04 для сценария очистки требуются полномочия привилегированного пользователя. Отредактируйте следующий файл.

    /etc/ssh/sshd_config

    1. а.Проверьте возможность переключения на учетную запись привилегированного пользователя (root).

      PermitRootLogin yes

    2. б.Установите пароль для пользователя root.

      sudo passwd root

  13. Запустите сценарий очистки.

    sudo ./script_path/cleaner.sh

  14. (Необязательно) Для обеспечения безопасности отмените шаг 12, чтобы предотвратить другие сеансы входа для пользователя root.
  15. Выключите виртуальную машину и используйте vSphere, чтобы преобразовать ее в шаблон.

Обновления шаблона

Задание cron запускается при каждом обновлении шаблона. Если обновление занимает больше времени, чем задержка (например, 90 секунд), необходимо повторно добавить файл /etc/cloud/cloug-init.disabled и повторно запустить сценарий очистки перед выключением шаблона. В противном случае служба cloud-init не будет отключена при первой загрузке и перезапуск спецификации настройки будет прерывать выполнение команд cloud-init.

Устранение неполадок

Если вы предполагаете, что спецификация настройки vSphere препятствует завершению выполнения cloud-init, временно отключите данную спецификацию и определите, может ли cloud-init завершаться должным образом. Чтобы временно отключить спецификацию настройки, используйте свойство customizeGuestOS: false.

    properties:
      image: ubuntu
      cpuCount: 1
      totalMemoryMB: 8192
      customizeGuestOS: false