Primi passi con Ansible

Installare Ansible su un server è alquanto facile, il difficile è usare e configurare Ansible per comandare i server.

Sono numerose le guide che insegnano ad installare Ansible, il software necessario sul “controllore” ma non serve sui controllati, quindi ci limitiamo a dire che spesso è sufficiente un yum install ansible o un apt install ansible per trovarci con un il software pronto all’uso.

La cosa più complicata è rendere il nostro parco macchine eterogeneo amministrabile da Ansible.

La prima cosa da fare è rendere raggiungibile la porta SSH di tutti i nostri server Linux al server Ansible. Questo va verificato a livello rete e sul firewall del sistema operativo.

Successivamente va creato un utente di servizio per accedere via SSH ai server. L’utente di servizio che andremmo usare può avere una password oppure può utilizzare una chiave. L’uso della chiave è semplice e ci esula in futuro a dover gestire la scadenza delle password ma ci impone di distribuire la chiave.

E’ opportuno anche aggiungere l’utente ai sudoers e senza richiedere la password di root. In questo modo saremo in grado di lanciare programmi e servizi privilegati.

Da ciò si evince che se il nostro parco macchine è eterogeneo predisporre il tutto richiede parecchio tempo ma alla fine della creazione degli account, le cose saranno più semplici.

Vediamo all’atto pratico come fare.

Creare un account su un server Linux è facile nel caso di SUSE, Ubuntu/Debian o Red Hat/CentOS e derivate basta usare il comando useradd più il comando di modifica della password.

useradd -u 1079 -m ansible_service -c "Account di gestione Ansible"
echo ansible_service:R8n7c£PQ£pX£4 | chpasswd

Questo comando va lanciato su ogni server. In questo modo creeremo un utente locale chiamato ansible_service con password R8n7c£PQ£pX£4
Per ora creeremo un utente con una password uguale per tutte le macchine, successivamente la password potrà essere disabilitata per usare l’autenticazione più sicura, mediante chiave.

Abbiamo scelto anche di creare un utente con uid e gid uguale su tutti i sistemi (con numero 1079), notare che il numero non deve essere usato da altri utenti sul sistema.

Per abilitare sudo senza password in Ubuntu/Debian e Red Hat, creiamo un file di configurazione sudoers o usiamo l’editor visudo per appendere la linea in fondo al file.

echo -e "ansible_service\tALL=(ALL)\tNOPASSWD: ALL" > /etc/sudoers.d/090_ansible_service

Se scrivere a mano questi 2 comandi su ogni server vi sembra molto impegnativo, è possibile utilizare dei piccoli trucchi per risparmiare tempo. Per esempio è possibile salvare questi 2 comandi in un file di testo (o uno script bash) da copiare e incollare su tutti i server o distribuirlo tramite una share nfs.

Toshiba 4TB Canvio Basics Portable External Hard Drive,USB 3.2. Gen 1, Black (HDTB440EK3AA)

Se non vogliamo usare la chiave, è opportuno installare sui sistemi da controllare il pacchetto che fornisce il comando sshpass. Per Ubuntu/Debian è sufficiente un apt install sshpass, tuttavia per i sistemi Red Hat e derivate è necessario attivare i repository EPEL (cosa che non desideriamo fare, per cui useremo la chiave).

Configuriamo Ansible sul server di gestione

Il server, sul quale c’è Ansible, è un server Ubuntu 20.04. In questo server non è necessario creare l’account di servizio. Però è importante creare una cartella dove porre i file di configurazione e i playbook che andremmo a creare.
Se l’utente che gestirà Ansible è unico, questi file possono essere salvati nella home dell’utente.
Nel mio caso ho creato una cartella chimata ansible nella quale ho posto 2 sottocartelle: inventory e playbooks.

mkdir ~/ansible/
mkdir ~/ansible/inventory
mkdir ~/ansible/playbooks

Nel nostro ambiente demo abbiamo 4 server: un server Ubuntu 20.04 dove è installato Ansible, un server Oracle Linux 8, un server SuSE Enterprise Linux 15 e un desktop Linux Mint 20 (con SSH). Per questo abbiamo creato un file di inventory contente gli indirizzi IP degli ultimi 3 server da gestire.

nano ~/ansible/inventory/inventory.list

In playbooks ho creato il primo playbook in YAML che fa un ping verso tutti gli host dell’inventory.

nano ~/ansible/playbooks/ping_all_hosts.yaml

Nel quale ho digitato questo:

- hosts: all
  user: ansible_service
  tasks:
    - name: Ping all hosts
      ping:

Per lanciare il playbook in tutti gli host presenti nel file ~/ansible/inventory/inventory.list basta usare il comando:

ansible-playbook -i ~/ansible/inventory/inventory.list ~/ansible/playbooks/ping_all_hosts.yaml

Note: se compare un messaggio “Could not match supplied host pattern, ignoring:” “[WARNING]: No hosts matched, nothing to do”, verificate di aver usato il percorso completo per i file ossia ~/ansible/inventory/inventory.list e non inventory/inventory.list, per esempio.

Alla prima esecuzione del comando verranno mostrati i fingerprint SSH, le successive connessioni non lo mostreranno se abbiamo importato i codici di hash.

Tuttavia il comando non avrà buon fine in quanto non abbiamo passato la password. Il comando PING non è un ping di rete ma un test di connessione via SSH, quindi la password va inviata.

Dobbiamo passare la password nel nostro utente di servizio ansible_service.

ansible-playbook -i ~/ansible/inventory/inventory.list ~/ansible/playbooks/ping_all_hosts.yaml --ask-pass

Se il pacchetto sshpass non è installato, il comando riuscirà ma ci verrà restituito un esito negativo; infatti per l’host 192.168.217.9 e 192.168.217.10 Ansible non ha trovato il comando sshpass.

Quindi abbiamo 2 possibilità. Installare sshpass o attivare l’autenticazione con chiave pubblica. Dovremmo copiare la nostra chiave su tutti gli host. La prima cosa da fare, però, è generare un chiave.

ssh-keygen

Il comando che si può usare per caricare la chiave su tutti gli host è questo:

ssh-copy-id -i ~/.ssh/id_rsa ansible_service@192.168.217.10

Dove 192.168.217.10 è l’IP del server. Dovremmo inserire tutti gli IP dei nostri server.

Ora rilanciando il nostro comando senza ask-password, dovremmo riuscire a collegarci.

ansible-playbook -i ~/ansible/inventory/inventory.list ~/ansible/playbooks/ping_all_hosts.yaml

Di valent

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *