Installa il software su istanze del server virtuale in VPC

Questa esercitazione può comportare degli addebiti. Utilizza lo stimatore costi per generare una stima dei costi basata sul tuo utilizzo previsto.

Questa esercitazione ti guida nel provisioning dell'infrastruttura IBM Cloud® Virtual Private Cloud (VPC) e l'installazione del software sulle istanze del server virtuale (VSI) utilizzando strumenti IaC (Infrastructure as Code) come Terraform e Ansible.

Dopo un'introduzione all'architettura dell'esercitazione, preparerai il tuo ambiente per l'esercitazione ed esaminerai le nozioni di base sull'installazione del software in IBM Cloud. A questo punto puoi decidere di valutare tutte le tecnologie o di passare a una delle sezioni specifiche, come Terraform o Ansible.

Obiettivi

  • Comprendere il software del sistema operativo fornito da IBM.
  • Utilizzare i passi manuali per l'aggiornamento del software del sistema operativo e l'installazione di un nuovo software.
  • Comprendere come utilizzare la CLI IBM Cloud, Terraform e Ansible per automatizzare il provisioning delle risorse e l'installazione del software.

In questa esercitazione, distribuirai la configurazione introdotta in un'altra esercitazione, Frontend pubblico e backend privato in un VPC (Virtual Private Cloud). Eseguirai il provisioning di un server di frontend accessibile da Internet pubblico che comunica con un server di backend senza connettività Internet.

Architettura del frontend pubblico e del backend privato in un Virtual Private Cloud*Schema dell'
dell'

La configurazione include anche un host bastion che funge da server jump che consente una connessione sicura alle istanze di cui è stato eseguito il provisioning senza un indirizzo IP pubblico:

Architettura di Bastion Host
Architettura di Bastion Host

Durante il provisioning delle risorse, distribuirai anche le applicazioni sulle istanze del server virtuale. Quando distribuisci le applicazioni nel cloud, il software può provenire da origini diverse:

  1. Il file system di una workstation locale - utilizzando strumenti come Terraform per creare l'infrastruttura richiesta o Ansible, ssh e scp per installare e configurare il software sulle istanze del server virtuale;
  2. Mirror IBM per aggiornare i sistemi operativi o installare i pacchetti supportati;
  3. Repository di software Internet o Intranet

Diagramma dell'architettura che mostra le diverse origini per installare il software da
Diagramma dell'architettura che mostra le diverse origini per installare il software da

Esplorerai come consumare queste diverse origini.

Prima di iniziare

Crea una chiave SSH di VPC

Quando esegui il provisioning delle istanze del server virtuale, verrà inserita una chiave SSH nelle istanze in modo che tu possa successivamente connetterti ai server.

  1. Se non si dispone di una chiave SSH sul computer locale, fare riferimento a queste istruzioni per creare una chiave per VPC. Per impostazione predefinita, la chiave privata si trova in $HOME/.ssh/id_rsa.
  2. Aggiungi la chiave SSH nella console VPC sotto Compute / SSH keys. Assicurati di creare la chiave nello stesso gruppo di risorse in cui stai per creare le altre risorse in questa esercitazione.

Imposta le variabili di ambiente

Questa esercitazione viene fornita con un codice di esempio per illustrare le diverse opzioni per il provisioning delle risorse e l'installazione o l'aggiornamento del software in un ambiente VPC.

Ti guiderà attraverso i passi di esempio su un terminale utilizzando la shell, terraform e ansible. Installerai questi strumenti nei passi successivi. Perché gli script funzionino, devi definire una serie di variabili di ambiente.

  1. Clona l'esercitazione repository del codice sorgente:

    git clone https://github.com/IBM-Cloud/vpc-tutorials.git
    
  2. Definisci una variabile denominata CHECKOUT_DIR che punta alla directory del codice sorgente:

    cd vpc-tutorials
    export CHECKOUT_DIR=$PWD
    
  3. Passa alla directory dell'esercitazione:

    cd $CHECKOUT_DIR/vpc-app-deploy
    
  4. Copia il file di configurazione:

    cp export.template export
    
  5. Modifica il file export e imposta i valori per le variabili di ambiente:

    • TF_VAR_ibmcloud_api_key è una chiave API IBM Cloud. Puoi crearne una dalla console.

    • TF_VAR_ssh_key_name è il nome della chiave pubblica SSH di VPC identificata nella sezione precedente. Questa è la chiave pubblica che verrà caricata nelle istanze del servizio virtuale per fornire un accesso ssh sicuro tramite la chiave privata sulla tua workstation. Utilizza la CLI per verificare che esista:

      ibmcloud is keys
      
    • TF_VAR_resource_group_name è un gruppo di risorse in cui verranno create le risorse. Vedi Creazione e gestione dei gruppi di risorse.

    • TF_VAR_region è una regione in cui verranno create le risorse. Questo comando visualizzerà le aree:

      ibmcloud is regions
      
    • TF_VAR_zone è una zona in cui verranno create le risorse. Questo comando visualizzerà le zone:

      ibmcloud is zones
      
    • TF_VAR_ssh_agent indica che viene utilizzata una chiave SSH protetta da passphrase. Abilitare la variabile annullando il commento. Quindi, utilizzare ssh-add ~/.ssh/id_rsa per aggiungere la chiave SSH all'agent di autenticazione.

  6. Carica le variabili nell'ambiente:

    source export
    

    Assicurati di utilizzare sempre la stessa finestra di terminale nelle sezioni successive o di impostare le variabili di ambiente se utilizzi una nuova finestra. Le variabili di ambiente in export sono in formato Terraform (notare il prefisso TF_VAR_ ) per comodità. Vengono utilizzate nelle sezioni successive.

Nozioni di base sull'installazione del software

Esegui il provisioning delle istanze del server virtuale dalle immagini di base

Quando esegui il provisioning di un'istanza del server virtuale, selezioni l'immagine di base da una serie predefinita di immagini del sistema operativo fornite da IBM. Utilizza ibmcloud is images per trovare l'elenco delle immagini disponibili.

IBM ha dei mirror interni per supportare le immagini IBM. I mirror conterranno le nuove versioni del software nelle immagini fornite da IBM, nonché i pacchetti facoltativi associati alla distribuzione. Gli specchietti fanno parte dei punti finali di servizio disponibili per IBM Cloud VPC. Non ci sono costi di ingresso per la lettura dei mirror.

Prendi in considerazione sia l'aggiornamento degli elenchi di versione disponibili per le istanze con provisioning sia l'upgrade del software installato da questi mirror.

Inizializza e personalizza le istanze cloud con cloud-init

Quando si effettua il provisioning di un'istanza di server virtuale, è possibile specificare uno script cloud-init da eseguire durante l'inizializzazione del server. Cloud-init è un pacchetto multi-distribuzione che gestisce l'inizializzazione anticipata di un'istanza cloud. Definisce una raccolta di formati di file per codificare l'inizializzazione delle istanze cloud.

In IBM Cloud, il contenuto del file cloud-init viene fornito nel parametro user-data al momento del provisioning del server. Vedere Formati dati utente per i contenuti dati utente accettabili. Se devi eseguire il debug dell'esecuzione dello script, cloud-init registra l'output dello script di inizializzazione in /var/log/cloud-init-output.log sulle istanze del server virtuale.

Questo tutorial utilizza uno script di shell denominato install.sh come script di inizializzazione:

#!/bin/bash
set -x
apt-get update
apt-get install -y nginx
indexhtml=/var/www/html/index.html

# Demonstrate the availability of internet repositories.  If www.python.org is availble then other software internet software like
# npm, pip, docker, ...  if isolated only the software from the ibm mirrors can be accessed
if curl -o /tmp/x -m 3 https://www.python.org/downloads/release/python-373/; then
    echo INTERNET > $indexhtml
else
    echo ISOLATED > $indexhtml
fi

In questo script, l'upgrade del software installato e l'installazione di nginx e di altri pacchetti tramite gli strumenti di installazione software forniti dal sistema operativo dimostrano che anche le istanze isolate hanno accesso ai mirror forniti da IBM. Per Ubuntu, i comandi apt-get accederanno ai mirror.

Il comando curl che accede a www.python.org dimostra il tentativo di accedere e potenzialmente installare il software da Internet.

A seconda che l'host disponga o meno di connettività Internet, lo script modifica la pagina index.html servita da nginx.

Carica dal file system ed esegui sull'istanza

Potrebbero esserci dati e software disponibili sul file system del tuo sistema in loco o della pipeline CI/CD che devono essere caricati nell'istanza del server virtuale e quindi eseguiti.

In questi casi, puoi utilizzare la connessione SSH al server per caricare i file con scp e quindi eseguire gli script sul server con ssh. Gli script potrebbero anche richiamare i programmi di installazione del software da Internet o dai tuoi sistemi in loco, supponendo che tu abbia stabilito una connessione, ad esempio una VPN, tra i tuoi sistemi in loco e il cloud.

Il codice del tutorial contiene uno script denominato uploaded.sh che verrà caricato dalla tua postazione di lavoro alle istanze del server virtuale (manualmente o tramite automazione come Terraform e Ansible ).

Nelle sezioni successive, utilizzerai lo script test_provision.bash per verificare che i server siano stati configurati correttamente, che siano in grado (o meno) di accedere a Internet e che lo script uploaded.sh sia stato eseguito correttamente.

Utilizzo della CLI IBM Cloud e degli script di shell

La CLI IBM Cloud fornisce dei comandi per interagire con tutte le risorse che puoi creare in IBM Cloud. Questa sezione spiega come utilizzare questi comandi, ma non si creerà alcuna risorsa. Si consiglia di utilizzare Terraform per distribuire soluzioni complete.

Prima di iniziare

Installa gli strumenti della riga di comando (CLI) seguendo questi passi

Provisioning delle istanze del server virtuale e installazione del software

La CLI ha un plug-in per tutte le funzionalità correlate a VPC, incluse le risorse di calcolo e di rete.

  1. Prima di utilizzare le risorse VPC, impostare la regione e il gruppo di risorse correnti:

    ibmcloud target -g $TF_VAR_resource_group_name -r $TF_VAR_region
    
  2. Per eseguire il provisioning di un'istanza del server virtuale, esegui il comando CLI ibmcloud is instance-create. In shared/install.sh è il file cloud-init utilizzato per inizializzare i server frontend e backend. È possibile passare lo script con il seguente parametro --user-data :

    ibmcloud is instance-create ... --user-data @shared/install.sh
    
  3. Con le VSI di frontend e backend distribuite e in modalità di manutenzione, è possibile inviare uno script, ad esempio, al server di frontend, quindi eseguire lo script per installare il software da Internet. Invia uno script al server di frontend:

    scp -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS shared/uploaded.sh root@$FRONT_NIC_IP:/uploaded.sh
    

    Quindi, esegui questo script:

    ssh -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS root@$FRONT_NIC_IP sh /uploaded.sh
    

    Possono essere necessari alcuni minuti per l'inizializzazione del servizio ssh sul server e altri pochi minuti per il completamento dello script cloud-init. Lo script uploaded.sh attenderà il completamento dell'inizializzazione prima di uscire.

Provisioning dell'infrastruttura con Terraform

Terraform consente di creare, modificare e migliorare le infrastrutture in modo sicuro e prevedibile. È uno strumento open source che codifica le API in file di configurazione dichiarativi che possono essere condivisi tra membri del team, trattati come codice, modificati, revisionati e controllati per quanto riguarda la versione

Prima di iniziare

Segui le istruzioni per installare Terraform e il plug-in provider IBM Cloud per Terraform nella tua workstation.

Esegui il provisioning di una singola istanza del server virtuale

Prima di distribuire un'architettura più complessa e per convalidare l'installazione del provider Terraform, distribuiamo una singola istanza del server virtuale con un IP mobile e quindi accediamo a questo server tramite SSH.

Controlla il main.tf file per un script terraform. Questo utilizza le variabili di ambiente definite in precedenza.

  1. Passa alla cartella degli script terraform per questo esempio:

    cd $CHECKOUT_DIR/vpc-app-deploy/tfinstance
    
  2. Inizializza Terraform:

    terraform init
    
  3. Applica il piano Terraform:

    terraform apply
    

    Lo script crea un VPC, una VSI e abilita l'accesso SSH.

  4. Visualizza l'output generato dal piano:

    terraform output
    
  5. Potresti copiare e incollare l'output del comando precedente o puoi utilizzare terraform output nel seguente modo per effettuare l'accesso SSH nella VSI

    $(terraform output -raw sshcommand)
    

    L'uso degli output in Terraform può essere molto utile se vuoi riutilizzare le proprietà delle risorse in altri script dopo aver applicato un piano Terraform.

  6. Rimuovi le risorse create da Terraform:

    terraform destroy
    

Esegui il provisioning di sottoreti e istanze del server virtuale

Il set di file Terraform nella cartella vpc-app-deploy/tf del repository vpc-tutorials implementa l'architettura del frontend pubblico e del backend privato in un tutorial sul cloud privato virtuale.

Lo script vpc-app-deploy/tf/main.tf contiene la definizione delle risorse. Importa un modulo Terraform condiviso con quest'altro tutorial:

   module vpc_pub_priv {
     source = "../../vpc-public-app-private-backend/tfmodule"
     basename = "${local.BASENAME}"
     ssh_key_name = "${var.ssh_key_name}"
     zone = "${var.zone}"
     backend_pgw = false
     profile = "${var.profile}"
     image_name = "${var.image_name}"
     resource_group_name = "${var.resource_group_name}"
     maintenance = "${var.maintenance}"
     frontend_user_data = "${file("../shared/install.sh")}"
     backend_user_data = "${file("../shared/install.sh")}"
   }

In questa definizione:

  • backend_pgw controlla se il server di backend ha accesso a Internet pubblico. Un gateway pubblico può essere connesso alla sottorete di backend. Il frontend ha un IP mobile assegnato che fornisce un IP pubblico e un gateway all'Internet. Ciò consentirà di aprire l'accesso a Internet per l'installazione del software. Il backend non avrà accesso a Internet.
  • frontend_user_data, backend_user_data puntano agli script di inizializzazione cloud-init.

Con Terraform, tutte le risorse possono avere degli strumenti di provisioning associati. Lo strumento di provisioning null_resource non esegue il provisioning di una risorsa cloud ma può essere utilizzato per copiare i file nelle istanze del server. Questo costrutto viene utilizzato nello script per copiare il uploaded.sh file e quindi eseguirlo come mostrato di seguito. Per connettersi ai server, Terraform supporta l'utilizzo dell'host bastion come previsto nel tutorial:

   resource "null_resource" "copy_from_on_prem" {
     connection {
       type        = "ssh"
       user        = "root"
       host        = "${module.vpc_pub_priv.frontend_network_interface_address}"
       private_key = "${file("~/.ssh/id_rsa")}"
       bastion_user        = "root"
       bastion_host        = "${local.bastion_ip}"
       bastion_private_key = "${file("~/.ssh/id_rsa")}"
     }
     provisioner "file" {
       source      = "../shared/${local.uploaded}"
       destination = "/${local.uploaded}"
      }
     provisioner "remote-exec" {
       inline      = [
         "bash -x /${local.uploaded}",
        ]
     }
   }

Per eseguire il provisioning delle risorse:

  1. Passa alla cartella degli script terraform:
    cd $CHECKOUT_DIR/vpc-app-deploy/tf
    
  2. Inizializza Terraform:
    terraform init
    
  3. Applica il piano Terraform:
    terraform apply
    
  4. Visualizza l'output generato dal piano:
    terraform output
    

Verifica la configurazione dei server virtuali

Ora che Terraform ha distribuito le risorse, puoi convalidare che il loro provisioning sia stato eseguito correttamente.

  1. Convalida che l'istanza del server virtuale di frontend sia raggiungibile e che abbia accesso in uscita a Internet:
    ../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    L'output del comando dovrebbe essere:
    success: httpd default file was correctly replaced with the following contents:
    INTERNET
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    
  2. Convalida che il backend possa essere raggiunto tramite l'host bastion e che non abbia accesso a Internet:
    ../test_provision.bash $(terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(terraform output -raw BASTION_IP_ADDRESS)"
    
    L'output del comando dovrebbe essere:
    success: httpd default file was correctly replaced with the following contents:
    ISOLATED
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    

Rimuovi le risorse

  1. Rimuovi le risorse create da Terraform:
    terraform destroy
    

Installazione del software con Ansible

Ansible è uno strumento di gestione della configurazione e di provisioning, simile a Chef e Puppet, progettato per automatizzare le implementazioni di applicazioni multilivello e il provisioning nel cloud. Scritto in Python, Ansible utilizza la sintassi YAML per descrivere le attività di automazione, il che lo rende facile da imparare e utilizzare.

Sebbene Ansible possa essere utilizzato per il provisioning delle risorse VPC e l'installazione del software, questa sezione utilizza Terraform per eseguire il provisioning delle risorse VPC e Ansible per distribuire il software.

Prima di iniziare

In questa sezione viene utilizzato sia Terraform che Ansible.

  1. Segui le istruzioni per installare Terraform e il plug-in provider IBM Cloud per Terraform nella tua workstation.
  2. Seguire queste istruzioni per installare Ansible.

Playbook Ansible

Un playbook Ansible fornisce le attività da eseguire. L'esempio che segue presenta una serie di attività necessarie per installare nginx e caricare uno script. Noterai delle somiglianze con lo script cloud-init trattato in precedenza. Lo script uploaded.sh è identico.

- hosts: FRONT_NIC_IP BACK_NIC_IP
  remote_user: root
  tasks:
  - name: update apt cache manual
    # this should not be required but without it the error: Failed to lock apt for exclusive operation is generated
    shell: apt update
    args:
      executable: /bin/bash
  - name: update apt cache
    apt:
      update_cache: yes
  - name: ensure nginx is at the latest version
    apt:
      name: nginx
      state: latest
    notify:
    - restart nginx
  - name: execute init.bash
    script: ./init.bash
  - name: upload execute uploaded.sh
    script: ../shared/uploaded.sh
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

Inventario Ansible

Ansible funziona contemporaneamente su più sistemi nella tua infrastruttura. L'inventario Ansible contiene l'elenco di questi sistemi. Il tutorial fornisce uno script inventory.bash per generare l'inventario dell' Ansible e dall'output di Terraform.

#!/bin/bash
TF=tf
printf 'all:
  children:
    FRONT_NIC_IP:
      hosts:
        %s
    BACK_NIC_IP:
      hosts:
        %s
' $(cd $TF; terraform output -raw FRONT_NIC_IP) $(cd $TF; terraform output -raw BACK_NIC_IP)

Esegui il provisioning di sottoreti e istanze del server virtuale

La directory vpc-app-deploy/ansible/tf contiene una configurazione Terraform simile a quella descritta nella sezione precedente, tranne per il fatto che l'installazione del software è stata rimossa. Lo script Ansible installerà il software dai mirror e quindi caricherà il software dalla tua workstation.

  1. Passa alla cartella degli script Ansible per questo esempio:
    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    
  2. Inizializza Terraform:
    terraform init
    
  3. Applica il piano Terraform:
    terraform apply
    
  4. Visualizza l'output generato dal piano:
    terraform output
    
  5. Genera l'inventario Ansible:
    cd .. && ./inventory.bash > inventory
    
  6. Esegui il provisioning del software sul server di frontend:
    ansible-playbook -T 40 -l FRONT_NIC_IP -u root \
      --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \
      -i inventory lamp.yaml
    
  7. Esegui il provisioning del software sul server di backend:
    ansible-playbook -T 40 -l BACK_NIC_IP -u root \
      --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \
      -i inventory lamp.yaml
    

Verifica la configurazione dei server virtuali

Ora che Terraform ha distribuito le risorse e Ansible ha installato il software, puoi convalidare che il loro provisioning sia stato eseguito correttamente.

  1. Convalida che l'istanza del server virtuale di frontend sia raggiungibile e che abbia accesso in uscita a Internet:
    ../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    L'output del comando dovrebbe essere:
    success: httpd default file was correctly replaced with the following contents:
    INTERNET
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    
  2. Convalida che il backend possa essere raggiunto tramite l'host bastion e che non abbia accesso a Internet:
    ../test_provision.bash $(cd tf && terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(cd tf && terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(cd tf && terraform output -raw BASTION_IP_ADDRESS)"
    
    L'output del comando dovrebbe essere:
    success: httpd default file was correctly replaced with the following contents:
    ISOLATED
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    

Rimuovi le risorse

  1. Rimuovi le risorse create da Terraform:

    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    

    e

    terraform destroy
    

A seconda della risorsa potrebbe non essere eliminata immediatamente, ma conservata (per impostazione predefinita per 7 giorni). È possibile recuperare la risorsa eliminandola in modo permanente o ripristinarla entro il periodo di conservazione. Consultare questo documento su come utilizzare il recupero delle risorse.