Wanneer u naar vSphere implementeert, vereist een statisch IP-adres dat vRealize Automation Cloud Assembly een vSphere-aanpassingsspecificatie genereert, die de cloud-init-opdrachten kan verstoren.

Probleem

  • Een vRealize Automation Cloud Assembly-blueprint bevat assignment: static om een statisch IP-adres toe te passen op een virtuele vSphere-machine.
  • De blueprint bevat ook een sectie cloudConfig, die initialisatiecommando's bevat die worden uitgevoerd met cloud-init.
  • Om de virtuele machine een statisch IP-adres te geven, genereert vRealize Automation Cloud Assembly dynamisch een vSphere-aanpassingsspecificatie die moet worden toegepast.
  • Telkens wanneer een aanpassingsspecificatie wordt toegepast, wordt de virtuele machine opnieuw gestart door de laatste bewerking.
  • De aanpassingsspecificatie weet niet dat cloud-init-opdrachten worden uitgevoerd, zodat het opnieuw opstarten wordt onderbroken.
  • De cloud-init-opdrachten worden alleen uitgevoerd na de eerste keer opstarten en worden niet automatisch hersteld wanneer ze worden onderbroken.
  • De resulterende virtuele machine blijft slechts gedeeltelijk geconfigureerd.

Tijdelijke oplossing

Maak een machinesjabloon die een getimed uitschakelen van cloud-init bevat. Implementeer vervolgens machines op basis van de sjabloon zodat de aanpassingsspecificatie en herstart kunnen plaatsvinden vóór cloud-init.

Voorbeeldprocedure—Ubuntu 18.04

De volgende stappen zijn van toepassing op Ubuntu 18.04. Mogelijk moet u aanpassingen aanbrengen en de ideeën die hier worden weergegeven aanpassen voor andere Linux-versies of -aanbiedingen.

  1. Maak de virtuele machine en werk deze bij met de gewenste versie-updates en -pakketten.

    Houd er rekening mee dat op andere Linux-aanbiedingen cloud-init mogelijk niet vooraf is geïnstalleerd, maar op Ubuntu 18.04 wel.

  2. Configureer cloud-init opnieuw en stel de gegevensbron in op OVF.

    sudo dpkg-reconfigure cloud-init

  3. Bewerk het volgende bestand.

    /etc/cloud/cloud.cfg

    1. Schakel de traditionele aanpassing van het gastbesturingssysteem (GOSC) in door de volgende regel toe te voegen.

      disable_vmware_customization: true

    2. Zorg ervoor dat de netwerkconfiguratie is ingeschakeld. Verwijder, of maak een opmerking van, de instelling, indien deze bestaat.
      network:
        # config: disabled

      U kunt ook alle configuratiebestanden in de volgende directory controleren.

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

      Verwijder alle bestanden die een network: {config: disabled}-instelling bevatten.

  4. Bewerk het volgende bestand.

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

    • Voorkom dat de tijdelijke directory wordt gewist door een opmerking te maken van de instelling.

      # D /tmp 1777 root root –

  5. Bewerk het volgende bestand.

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

    • Configureer open-vmtools om te starten na dbus.service door de volgende regel toe te voegen onder de sectie [Unit].

      After=dbus.service

  6. Maak een nieuw, leeg bestand dat cloud-init uitschakelt.

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

  7. Maak een re_init.sh-script. Na een cron-taakvertraging die de aanpassingsspecificatie onderbreekt, schakelt het script cloud-init opnieuw in en initialiseert het deze.
    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. Voeg het uitvoeringsrecht voor het script toe.

    sudo chmod +x re_init.sh

  9. Maak de cron-taak die na 90 seconden slaapstand wordt uitgevoerd bij het opstarten. Typ crontab -e en voer het volgende in:

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

    U kunt meer dan 90 seconden toepassen als de aanpassingsspecificaties en het opnieuw opstarten langer duren.

  10. Maak een cleaner.sh-script dat de sjabloon wist. Vervang cloudadmin door uw eigen gebruiker die u instelt tijdens de installatie van het besturingssysteem.

    Het voorbeeldscript is specifiek voor Ubuntu. Als u een script voor andere Linux-aanbiedingen wilt maken, moet u ervoor zorgen dat u de gemarkeerde, verplichte secties toevoegt.

    #!/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. Voeg het uitvoeringsrecht toe voor het opschoningsscript van de sjabloon toe.

    sudo chmod +x cleaner.sh

  12. In Ubuntu 18.04 heeft het opschoningsscript rootrechten nodig. Bewerk het volgende bestand.

    /etc/ssh/sshd_config

    1. Zorg ervoor dat u kunt overschakelen naar de rootgebruiker.

      PermitRootLogin yes

    2. Stel een wachtwoord in voor root.

      sudo passwd root

  13. Voer het opschoningsscript uit.

    sudo ./script_path/cleaner.sh

  14. (Optioneel) Omwille van de beveiliging draait u stap 12 terug om verdere rootaanmeldingen te voorkomen.
  15. Sluit de virtuele machine af en gebruik vSphere om er een sjabloon van te maken.

Sjabloonupdates

De cron-taak wordt uitgevoerd telkens wanneer u de sjabloon bijwerkt. Als uw update langer duurt dan de vertraging (bijvoorbeeld 90 seconden), moet u het bestand /etc/cloud/cloug-init.disabled opnieuw toevoegen en het opschoningsscript opnieuw uitvoeren voordat u de sjabloon afsluit. Anders wordt cloud-init niet uitgeschakeld tijdens de eerste keer opstarten en gaat het opnieuw starten van de aanpassingsspecificatie terug naar het onderbreken van de cloud-init-opdrachten.

Problemen oplossen

Als u vermoedt dat de vSphere-aanpassingsspecificatie het voltooien van cloud-init verhindert, schakelt u tijdelijk de aanpassingsspecificatie uit en bepaalt u of cloud-init correct kan eindigen. Om de aanpassingsspecificatie tijdelijk uit te schakelen, gebruikt u de eigenschap customizeGuestOS: false.

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