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.
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:
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:
- Il file system di una workstation locale - utilizzando strumenti come Terraform per creare l'infrastruttura richiesta o Ansible,
sshescpper installare e configurare il software sulle istanze del server virtuale; - Mirror IBM per aggiornare i sistemi operativi o installare i pacchetti supportati;
- Repository di software Internet o Intranet
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.
- 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. - 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.
-
Clona l'esercitazione repository del codice sorgente:
git clone https://github.com/IBM-Cloud/vpc-tutorials.git -
Definisci una variabile denominata
CHECKOUT_DIRche punta alla directory del codice sorgente:cd vpc-tutorials export CHECKOUT_DIR=$PWD -
Passa alla directory dell'esercitazione:
cd $CHECKOUT_DIR/vpc-app-deploy -
Copia il file di configurazione:
cp export.template export -
Modifica il file
exporte 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_agentindica che viene utilizzata una chiave SSH protetta da passphrase. Abilitare la variabile annullando il commento. Quindi, utilizzaressh-add ~/.ssh/id_rsaper aggiungere la chiave SSH all'agent di autenticazione.
-
-
Carica le variabili nell'ambiente:
source exportAssicurati 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
exportsono in formato Terraform (notare il prefissoTF_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.
-
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 -
Per eseguire il provisioning di un'istanza del server virtuale, esegui il comando CLI
ibmcloud is instance-create. Inshared/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 -
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.shQuindi, esegui questo script:
ssh -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS root@$FRONT_NIC_IP sh /uploaded.shPossono essere necessari alcuni minuti per l'inizializzazione del servizio ssh sul server e altri pochi minuti per il completamento dello script
cloud-init. Lo scriptuploaded.shattenderà 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.
-
Passa alla cartella degli script terraform per questo esempio:
cd $CHECKOUT_DIR/vpc-app-deploy/tfinstance -
Inizializza Terraform:
terraform init -
Applica il piano Terraform:
terraform applyLo script crea un VPC, una VSI e abilita l'accesso SSH.
-
Visualizza l'output generato dal piano:
terraform output -
Potresti copiare e incollare l'output del comando precedente o puoi utilizzare
terraform outputnel 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.
-
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:
- Passa alla cartella degli script terraform:
cd $CHECKOUT_DIR/vpc-app-deploy/tf - Inizializza Terraform:
terraform init - Applica il piano Terraform:
terraform apply - 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.
- Convalida che l'istanza del server virtuale di frontend sia raggiungibile e che abbia accesso in uscita a Internet:
L'output del comando dovrebbe essere:../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hisuccess: 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 - Convalida che il backend possa essere raggiunto tramite l'host bastion e che non abbia accesso a Internet:
L'output del comando dovrebbe essere:../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)"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
- 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.
- Segui le istruzioni per installare Terraform e il plug-in provider IBM Cloud per Terraform nella tua workstation.
- 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.
- Passa alla cartella degli script Ansible per questo esempio:
cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf - Inizializza Terraform:
terraform init - Applica il piano Terraform:
terraform apply - Visualizza l'output generato dal piano:
terraform output - Genera l'inventario Ansible:
cd .. && ./inventory.bash > inventory - 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 - 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.
- Convalida che l'istanza del server virtuale di frontend sia raggiungibile e che abbia accesso in uscita a Internet:
L'output del comando dovrebbe essere:../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hisuccess: 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 - Convalida che il backend possa essere raggiunto tramite l'host bastion e che non abbia accesso a Internet:
L'output del comando dovrebbe essere:../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)"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
-
Rimuovi le risorse create da Terraform:
cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tfe
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.