Quando si esegue la distribuzione in vSphere, un indirizzo IP statico richiede che vRealize Automation Cloud Assembly generi una specifica di personalizzazione di vSphere, che può interferire con i comandi di cloud-init.

Problema

  • Un modello di vRealize Automation Cloud Assembly include assignment: static per applicare un indirizzo IP statico a una macchina virtuale vSphere.
  • Il modello cloud contiene anche una sezione cloudConfig, che include i comandi di inizializzazione eseguiti utilizzando cloud-init.
  • Per assegnare un IP statico alla macchina virtuale, vRealize Automation Cloud Assembly genera dinamicamente una specifica di personalizzazione di vSphere da applicare.
  • Ogni volta che viene applicata una specifica di personalizzazione, l'ultima operazione riavvia la macchina virtuale.
  • La specifica di personalizzazione non sa che i comandi di cloud-init sono in esecuzione, quindi il riavvio li interrompe.
  • I comandi di cloud-init vengono eseguiti solo al primo avvio e non vengono automaticamente rieseguiti quando interrotti.
  • La macchina virtuale risultante rimane solo parzialmente configurata.

Soluzione alternativa

Creare un modello di macchina che includa una disabilitazione temporizzata di cloud-init. Quindi, distribuire le macchine in base al modello in modo che la specifica di personalizzazione e il riavvio possano verificarsi prima di cloud-init.

Procedura di esempio: Ubuntu 18.04

I seguenti passaggi si applicano a Ubuntu 18.04. Potrebbe essere necessario apportare modifiche e adattare le idee presentate qui per altre versioni oppure offerte di Linux.

  1. Creare la macchina virtuale e aggiornarla con i pacchetti e gli aggiornamenti della versione desiderati.

    Si tenga presente che altre offerte di Linux potrebbero non avere cloud-init preinstallato, mentre Ubuntu 18.04 sì.

  2. Riconfigurare cloud-init, impostando l'origine dati su OVF.

    sudo dpkg-reconfigure cloud-init

  3. Modificare il file seguente.

    /etc/cloud/cloud.cfg

    1. Abilitare la personalizzazione del sistema operativo guest tradizionale (GOSC, Guest Operating System Customization) aggiungendo la riga seguente.

      disable_vmware_customization: true

    2. Assicurarsi che la configurazione di rete sia abilitata. Eliminare o commentare l'impostazione di disabilitazione, se presente.
      network:
        # config: disabled

      In alternativa, esaminare tutti i file di configurazione nella directory seguente.

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

      Eliminare tutti i dati che contengono un'impostazione network: {config: disabled}.

  4. Modificare il file seguente.

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

    • Impedire la cancellazione della directory temporanea commentando l'impostazione.

      # D /tmp 1777 root root –

  5. Modificare il file seguente.

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

    • Configurare open-vmtools in modo che inizi dopo dbus.service aggiungendo la riga seguente nella sezione [Unit].

      After=dbus.service

  6. Creare il nuovo file vuoto per disabilitare cloud-init.

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

  7. Creare uno script re_init.sh. Dopo un ritardo del cron job che si sospende per la specifica di personalizzazione, lo script riabilita e inizializza 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. Aggiungere l'autorizzazione di esecuzione per lo script.

    sudo chmod +x re_init.sh

  9. Creare il cron job che verrà eseguito dopo 90 secondi di sospensione all'avvio. Digitare crontab -e e immettere quanto segue:

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

    È possibile applicare più di 90 secondi se il completamento dei riavvii e delle specifiche di personalizzazione richiede più tempo.

  10. Creare uno script cleaner.sh, che pulisce il modello. Sostituire cloudadmin con l'utente configurato durante l'installazione del sistema operativo.

    Lo script di esempio è specifico di Ubuntu. Per creare uno script per altre offerte di Linux, assicurarsi di includere le sezioni evidenziate e obbligatorie.

    #!/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. Aggiungere l'autorizzazione di esecuzione per lo script di pulizia del modello.

    sudo chmod +x cleaner.sh

  12. In Ubuntu 18.04, lo script di pulizia richiede privilegi root. Modificare il file seguente.

    /etc/ssh/sshd_config

    1. Assicurarsi che sia possibile passare all'utente root.

      PermitRootLogin yes

    2. Impostare una password per root.

      sudo passwd root

  13. Eseguire lo script di pulizia.

    sudo ./script_path/cleaner.sh

  14. (Facoltativo) Per motivi di sicurezza, ripristinare il passaggio 12 per evitare ulteriori accessi root.
  15. Arrestare la macchina virtuale e utilizzare vSphere per trasformarla in un modello.

Aggiornamenti dei modelli

Il cron job viene eseguito ogni volta che si aggiorna il modello. Se l'aggiornamento richiede più tempo del ritardo (ad esempio 90 secondi), è necessario aggiungere di nuovo il file /etc/cloud/cloug-init.disabled ed eseguire nuovamente lo script di pulizia prima di arrestare il modello. In caso contrario, cloud-init non verrà disabilitato al primo avvio e il riavvio della specifica di personalizzazione interromperà di nuovo i comandi di cloud-init.

Risoluzione dei problemi

Se si sospetta che la specifica di personalizzazione di vSphere impedisca il completamento di cloud-init, disabilitare temporaneamente la specifica di personalizzazione e determinare se cloud-init può essere terminato come previsto. Per disabilitare temporaneamente la specifica di personalizzazione, utilizzare la proprietà customizeGuestOS: false.

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