vSphere에 배포할 때 정적 IP 주소를 사용하려면 Cloud Assembly가 vSphere 사용자 지정 규격을 생성해야 하지만 이는 cloud-init 명령을 방해할 수 있습니다.

문제

  • Cloud Assembly Blueprint에는 vSphere 가상 시스템에 정적 IP 주소를 적용하기 위한 assignment: static이 포함되어 있습니다.
  • 또한 Blueprint에는 cloud-init를 사용하여 실행되는 초기화 명령을 포함하는 cloudConfig 섹션도 포함되어 있습니다.
  • 가상 시스템에 정적 IP를 제공하기 위해 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를 재구성하여 데이터 소스를 OVF로 설정합니다.

    sudo dpkg-reconfigure cloud-init

  3. 다음 파일을 편집합니다.

    /etc/cloud/cloud.cfg

    1. 다음 줄을 추가하여 기존 GOSC(게스트 운영 체제 사용자 지정)를 사용하도록 설정합니다.

      disable_vmware_customization: true

    2. 네트워크 구성이 사용되도록 설정되어 있는지 확인합니다. 사용 안 함 설정이 있으면 삭제하거나 주석 처리합니다.
      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

    • 다음 줄을 [Unit] 섹션 아래에 추가하여 open-vmtools가 dbus.service 후에 시작되도록 구성합니다.

      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. 시작 시 90초의 대기 후 실행되는 cron 작업을 생성합니다. 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. 루트 사용자로 전환할 수 있는지 확인합니다.

      PermitRootLogin yes

    2. 루트에 대한 암호를 설정합니다.

      sudo passwd root

  13. 정리 스크립트를 실행합니다.

    sudo ./script_path/cleaner.sh

  14. (선택 사항) 보안 목적으로 추가적인 루트 로그인을 방지하려면 12단계를 되돌립니다.
  15. 가상 시스템을 종료하고 vSphere을 사용하여 템플릿으로 변환합니다.

템플릿 업데이트

cron 작업은 템플릿을 업데이트할 때마다 실행됩니다. 업데이트에 걸리는 시간이 지연 시간(예: 90초)을 초과하는 경우 템플릿을 종료하기 전에 /etc/cloud/cloug-init.disabled 파일을 다시 추가하고 정리 스크립트를 다시 실행해야 합니다. 그러지 않으면 처음 부팅할 때 cloud-init가 사용되지 않도록 설정되지 않고 사용자 지정 규격을 다시 시작하면 다시 cloud-init 명령이 중단됩니다.

문제 해결

vSphere 사용자 지정 규격이 cloud-init 완료를 방해하는 것으로 의심되는 경우에는 사용자 지정 규격을 일시적으로 사용하지 않도록 설정하고 cloud-init가 예상 대로 완료될 수 있는지 확인합니다. 사용자 지정 규격을 일시적으로 사용하지 않도록 설정하려면 customizationGuestOs: false 속성을 사용합니다.

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