Introduzione

I sistemi di gestione della configurazione sono progettati per semplificare il processo di controllo di un numero elevato di server, per amministratori e team operativi. Ti consentono di controllare molti sistemi diversi in modo automatizzato da una posizione centrale.

Esistono sono molti strumenti di gestione della configurazione popolari disponibili per i sistemi Linux, come Chef e Puppet, questi sono spesso più complessi di quanto molte persone desiderino o abbiano bisogno. Ansible è un'ottima alternativa a queste opzioni perché offre un'architettura che non richiede l'installazione di software speciale sui nodi, utilizzando SSH per eseguire le attività di automazione e i file YAML per definire i dettagli di provisioning.

In questa guida, discuteremo come installare Ansible su un server Ubuntu 20.04 LTS Focal Fossa.

Prerequisiti

Per seguire questo tutorial, avrai bisogno di:

Un nodo di controllo Ansible: il nodo di controllo Ansible è la macchina che useremo per connetterci e controllare gli host Ansible su SSH. Il tuo nodo di controllo Ansible può essere il tuo computer locale o un server dedicato all'esecuzione di Ansible, anche se questa guida presuppone che il tuo nodo di controllo sia un sistema Ubuntu 20.04 LTS. Assicurarsi che il nodo di controllo abbia:

Uno o più host Ansible: un host Ansible è qualsiasi macchina configurata per l'automazione del nodo di controllo Ansible. Questa guida presuppone che i tuoi host Ansible siano server remoti Ubuntu 20.04 LTS . Assicurati che ogni host Ansible abbia:

  • Una coppia di chiavi SSH associata a questo utente.
  • Questo utente può essere root o un utente normale con privilegi sudo.

Installare Ansible

Per iniziare a utilizzare Ansible come mezzo per gestire l'infrastruttura del server, è necessario installare il software Ansible sulla macchina che fungerà da nodo di controllo Ansible. Per questo utilizzeremo i repository Ubuntu predefiniti.

Innanzitutto, aggiorna l'indice dei pacchetti del tuo sistema con:

sudo apt update

A seguito di questo aggiornamento, è possibile installare il software Ansible con:

sudo apt install ansible

Premere Y quando richiesto per confermare l'installazione.

Il tuo nodo di controllo Ansible ora ha tutto il software necessario per amministrare i tuoi host. Successivamente, esamineremo come impostare un file di inventario, in modo che Ansible possa comunicare con i tuoi nodi gestiti.

Configurare il file di inventario

Il file di inventario (Inventory File) contiene informazioni sugli host che gestirai con Ansible. È possibile includere ovunque da una a diverse centinaia di server nel file di inventario e gli host possono essere organizzati in gruppi e sottogruppi. Il file di inventario viene spesso utilizzato anche per impostare variabili che saranno valide solo per host o gruppi specifici, al fine di essere utilizzate all'interno di playbook e modelli. Alcune variabili possono anche influenzare il modo in cui viene eseguito un playbook, come la variabile ansible_python_interpreter che vedremo tra un momento.

Per modificare il contenuto del tuo inventario Ansible predefinito, apri il file /etc/ansible/hosts utilizzando l'editor di testo preferito, sul nodo di controllo Ansible:

sudo nano /etc/ansible/hosts
Nota: sebbene Ansible in genere crei un file di inventario predefinito all'indirizzo etc/ansible/hosts, sei libero di creare file di inventario in qualsiasi posizione che si adatti meglio alle tue esigenze. In questo caso, dovrai fornire il percorso al tuo file di inventario personalizzato con il parametr -io quando esegui comandi e playbook Ansible. L'uso di file di inventario per progetto è una buona pratica per ridurre al minimo il rischio di eseguire un playbook sul gruppo di server sbagliato.

Il file di inventario predefinito fornito dall'installazione Ansible contiene una serie di esempi che è possibile utilizzare come riferimenti per l'impostazione dell'inventario. L'esempio seguente definisce un gruppo denominato [servers] con tre server diversi, ciascuno identificato da un alias personalizzato: server1, server2 e server3. Assicurati di sostituire gli IP evidenziati con gli indirizzi IP dei tuoi host Ansible.

[servers]
server1 ansible_host=111.0.223.333
server2 ansible_host=111.0.223.444
server3 ansible_host=111.0.223.555

[all:vars]
ansible_python_interpreter=/usr/bin/python3
/etc/ansible/hosts

Il sottogruppo all:vars imposta il parametro host ansible_python_interpreter  che sarà valido per tutti gli host inclusi in questo inventario. Questo parametro assicura che il server remoto utilizzi l'eseguibile /usr/bin/python3 Python 3 anziché /usr/bin/python (Python 2.7), che non è presente nelle recenti versioni di Ubuntu.

Al termine, salvare e chiudere il file premendo CTRL+X quindi Y e ENTER per confermare le modifiche.

Quando vuoi controllare il tuo inventario, puoi eseguire:

ansible-inventory --list -y

Vedrai un output simile a questo, ma contenente la tua infrastruttura server come definita nel tuo file di inventario:

all:
  children:
    servers:
      hosts:
        server1:
          ansible_host: 203.0.113.111
          ansible_python_interpreter: /usr/bin/python3
        server2:
          ansible_host: 203.0.113.112
          ansible_python_interpreter: /usr/bin/python3
        server3:
          ansible_host: 203.0.113.113
          ansible_python_interpreter: /usr/bin/python3
    ungrouped: {}

Ora che hai configurato il tuo file di inventario, hai tutto il necessario per testare la connessione ai tuoi host Ansible.

Test della connessione

Dopo aver impostato il file di inventario per includere i server, è tempo di verificare se Ansible è in grado di connettersi a questi server ed eseguire comandi tramite SSH.

Per questa guida, utilizzeremo l'account root di Ubuntu perché in genere è l'unico account disponibile per impostazione predefinita sui server appena creati. Se i tuoi host Ansible hanno già creato un normale utente sudo, sei invece invitato a utilizzare quell'account.

È possibile utilizzare l'argomento -u per specificare l'utente del sistema remoto. Se non fornito, Ansible tenterà di connettersi come utente di sistema corrente sul nodo di controllo.

Dal computer locale o dal nodo di controllo Ansible, eseguire:

ansible all -m ping -u root

Questo comando utilizzerà il modulo ping integrato di Ansible per eseguire un test di connettività su tutti i nodi dall'inventario predefinito, connettendosi come root. Il modulo ping testerà:

  • se gli host sono accessibili;
  • se si dispone di credenziali SSH valide;
  • se gli host sono in grado di eseguire i moduli Ansible usando Python.

Dovresti ottenere un output simile a questo:

server1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Se è la prima volta che ti connetti a questi server tramite SSH, ti verrà chiesto di confermare l'autenticità degli host a cui ti stai connettendo tramite Ansible. Quando richiesto, digitare yes e quindi premere ENTER per confermare.

Quando ricevi una "pong" risposta da un host, significa che sei pronto per eseguire i comandi e i playbook Ansible su quel server.

Eseguire i comandi Ad-Hoc (facoltativo)

Dopo aver verificato che il tuo nodo di controllo Ansible è in grado di comunicare con i tuoi host, puoi iniziare a eseguire comandi e playbook ad hoc sui tuoi server.

Qualsiasi comando che normalmente eseguiresti su un server remoto su SSH può essere eseguito con Ansible sui server specificati nel tuo file di inventario. Ad esempio, puoi controllare l'utilizzo del disco su tutti i server con:

ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           798M  624K  798M   1% /run
/dev/vda1       155G  2.3G  153G   2% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           798M     0  798M   0% /run/user/0

server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  608K  394M   1% /run
/dev/vda1        78G  2.2G   76G   3% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           395M     0  395M   0% /run/user/0

...

Il comando df -h può essere sostituito da qualsiasi comando desideri.

Puoi anche eseguire i moduli Ansible tramite comandi ad-hoc, analogamente a quanto fatto in precedenza con il modulo ping per testare la connessione. Ad esempio, ecco come possiamo utilizzare il modulo apt per installare la versione più recente di vim su tutti i server nel tuo inventario:

ansible all -m apt -a "name=vim state=latest" -u root

Puoi anche scegliere come target singoli host, nonché gruppi e sottogruppi, quando esegui i comandi Ansible. Ad esempio, per utilizzare il comando  uptime di ogni host nel gruppo servers esegui questo comando:

ansible servers -a "uptime" -u root

Possiamo specificare più host separandoli con due punti:

ansible server1:server2 -m ping -u root

Conclusione

In questa guida, hai installato Ansible e impostato un file di inventario per eseguire comandi ad-hoc da un nodo di controllo Ansible.

Dopo aver verificato di essere in grado di connettersi e controllare la propria infrastruttura da una macchina del controller Ansible centrale, è possibile eseguire qualsiasi comando o playbook desiderato su tali host.