Ansible (automation tool) su Fedora 38

Ansible (automation tool) su Fedora 38

Introduzione

In questo articolo, vedremo come poter installare Ansible su Fedora 38 passo per passo e una volta completatp avremo un piccolo ambiente funzionante con un'istallazione di ansible, che controllerà, nel nostro caso, solamente un nodo remoto

Che cos'è Ansible

Ansible è uno strumento di automazione gratuito e open source (senza agent) che gestisce macchine Linux remote tramite protocollo ssh. Il sistema su cui viene installato ansible solitamente è noto come Control Node e le macchine remote gestite da ansible sono chiamate solitamente Managed Node

Prerequisiti

  • Installazione minima di Fedora (almeno due macchine), nel nostro caso utilizzeremo 2 VM (virtual machine) in ambiente virtualizzato vSphere

  • Utente con diritti di ammistrazione sudo su entrambe le macchine (per comodità utilizzeremo utenza root)

  • Macchine già abilitate all'accesso SSH attraverso la porta 22

  • Connettività di rete su entrambe le macchine

Ambiente di Laboratorio

il nostro laboratorio in ambiente VMware vSphere sarà quindi composta da 2 VM Fedora Linux 38 con installazione minima (solo componenti base e Terminal) così suddivise:

  • Control Node - ansible-cn (hostname) - 192.168.8.119 (ipv4)

  • Managed Node - managed-node (hostname) - 192.168.8.120 (ipv4)

su entrambe le vm utilizzeremo solamente utenza di root a scopo puramente dimostrativo e per comodità, in ambienti di produzione non utilizzare MAI utenza di root per effettuare operazioni di control e automation

Aggiorniamo le 2 macchine Fedora

Prima di proseguire con installare e configurare il nostro ambiente di ansible, su entrambe le VM Fedora38 effettuiamo log in e lanciamo il comando:

sudo dnf update -y

una volta lanciato il comando ed effettuato update su entrambe le VM, facciamo anche un reboot in modo da partire da una situazione il più pulito possibile

sudo reboot

Installiamo Ansible con dnf (il package manager di fedora)

Su Fedora38 installare Ansible è relativamente semplice in quanto il suo pacchetto, come le sue dipendenze sono disponibili nei repository ufficiali di Fedora.

Eseguiamo quindi semplicemente il comando dnf per installarlo:

sudo dnf install -y ansible

attendiamo giusto qualche minuto che il pacchetto con tutte le sue dipenzenze venga installato nel sistema

e una volta completata l'installazione, proseguiamo verificando il corretto funzionamento di Ansible usando il comando:

ansible --version

che dovrebbe restituirci come output il versioning di ansible core e i vari componenti che lo compongono , come i file di configurazione

Generazione delle chiavi SSH per l'utenza che farà automation

In questo passaggio vedremo come generare la chiave SSH dell'utenza root che useremo tramite ansible per effettuare automation sui managed node

IMPORTANTE: nell'articolo utilizzeremo utenza di root , ma le operazioni sono valide per qualunque utenza vogliate creare ed utilizzare , la cosa importante è che su entrambi i sistemi l'utenza xxx (la vostra utenza con nome da voi scelto) esista e abbia privilegi sudo

generiamo quindi la chiave ssh per l'utenza scelta (in questo caso root) e proseguiamo condividendo la chiave ssh suui vari sistemi remoti (nel nostro caso managed-node)

per poter generare la chiave ssh , portiamoci prima di tutto sul percorso home dell'utente scelto, per farlo dovremo essere loggati sul terminale con quell'utenza e successivamente lanciare il comando:

cd

e premere invio, questo comando ci riporterà direttamente alla home dell'utente, utilizziamo subito dopo il comando:

ls -1A

questo comando ci darà anche come output le cartelle nascoste sotto la cartella principale della nostra utenza , la cartella che ci interessa in questo momento sarà la cartella .ssh

proseguiamo lanciamo il comando per generare la nuova chiave SSH

ssh-keygen

il comando chiederà diversi input, premiamo solo invio senza inserire nulla e drovremmo avere un output come il seguente:

avremo quindi generato due file sotto la cartella .ssh , che sono id_rsa e id_rsa.pub

questa chiave id_rsa verrà utilizzata dall'automazione di ansible per la connessione in SSH alle macchine remote (managed-node) e l'autenticazione avverrà grazie alla chiave e quindi senza password

per far si che il tutto funzioni dobbiamo prima condividere la chiave generata con il managed-node e possiamo farlo utilizzando il comando

ssh-copy-id root@192.168.8.120

NOTA: il comando ssh-copy-id utilizza la connessione ssh per connettersi al server remoto e copiare l'id sull'utenza con cui ci colleghiamo (sempre root nel nostro caso).

Il comando è così composto, dunque, perchè copierà la chiave ssh dall'utenza di root della VM ansible-cn (192.168.8.119) all'utenza di root della VM managed-node (192.168.8.120).

NB: il comando va quindi eseguito dal Control Node di ansible e l'operazione andrà ripetuta per tutti i vari nodi che vorremmo connettere alla nostra istanza, nel nostro caso solamente uno managed-node

un volta completato, dovremmo aver copiato correttamente la chiave SSH sul managed-node ed essere qundi in grado di collegarci e di gestirlo senza password. Sotto l'utenza di root del managed-node, nella cartella nascosta .ssh della sua home directory, dovremmo avere un file chiamato autorizhed_keys, il quale viene generato appunto quando vengono copiate delle chiavi da altre istanze (altri server o VM)

navigando all'interno del file dovremmo vedere la chiave e il certificato generato sul control-node ansible-cn.

Configurazione e Testing dell'installazione di Ansible

Per testare l'installazione ansible, proveremo a gestire il sistema remoto managed-node (192.168.8.120) per farlo dovremmo prima settare alcune configurazioni di ansible tra cui:

  • ansible.cfg

    file che contenente le configurazioni base di ansible

  • hosts

    che farà da database dell'inventario delle macchine gestite

portiamoci quindi da terminale sotto al persorso /etc/ansible nel quale troveroemo i file di configurazione, con il comando:

cd /etc/ansible

partiamo editando il file ansible.cfg utilizando l'editor di testo nano (già presente in fedora) lanciamolo con il comando:

sudo nano ansible.cfg

ci si aprirà l'editor di testo nano, con caricato il file ansible.cfg dal quale potremmo apportare le modifiche appunto alla configurazione di ansible, inseriamo nel file le linee a seguire:

[defaults]
inventory = ./hosts
remote_user = root
host_key_checking = False

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

con quanto inserito sopra setteremo alle configurazioni di ansible , in ordine, che il file dell'inventario sarà appunto il file hosts presente nella medesima directory sotto /etc/ansible e che l'utenza che dovrà utilizzare per effetuare task di automation sarà appunto root.

nella seconda parte della configurazione [privilege_escalation], definirà l'elevazione dell'utenza come sudo , nel caso aveste usato un'utenza creata ad-hoc.

inseriamo quindi le configurazioni all'interno del file:

e premiamo CTRL+O per salvare le modifiche e successivamente CTRL+X per chiudere l'editor.

ora ripetiamo il passaggio precedente editando anche il file hosts, nel quale aggiungeremo il nostro managed-node (192.168.8.120) , in modo tale che ansible possa distinguere i diversi sistemi inventariati.

dalla folder di ansible dunque, lanciamo il comando:

sudo nano hosts

e ci si aprirà nuovmente l'editor di testo nano, con caricato il file hosts nel quale inseriremo tutte le macchine managed al nostro inventario,nel nostro caso inseriremo:

[managed-node]
192.168.8.120

premiamo CTRL+O per salvare le modifiche e successivamente CTRL+X per chiudere l'editor.

Ora possiamo finalmente testare la nostra installazione di ansible con un paio di semplici comandi

test del ping del nodo remoto

ansible managed-node -m ping

il cui output (se abbiamo configurato tutto a dovere) dovrebbe restituirci:

ora lanciamo un ulteriore comando un pò più "avanzato" , con il quale faremo eseguire ad ansible un comando bash sul sistema remoto:

esecuzione di un comando bash sul nodo remoto

ansible managed-node -m shell -a 'cat /etc/os-release'

il comando lancierà il comando bash cat /etc/os-release (che ci consente di avere come output info sulla distribuzione linux) sul nodo remoto, che dovrebbe restituirci come output:

fin qua tutto perfetto, i comandi sopra ci confermano che la connettività è presente tra il control-node e il managed-node, poiché il test del ping pong e del recupero info da shell ci han restituito esito positivo.

Ansible - Creazione di un Playbook

In questa parte ci addentriamo, nel lato divertente di ansible i PlayBook

i PlayBook, sono dei file YAML che permettono di costruire dei task di automazione che ansbile può utilizzare per compiere azioni.

creeremo ora un playbook di esempio per installare vsftpd (servizio per creare server FTP /FTPS) sul nostro managed-node (192.168.8.120)

sotto il percorso /etc/ansible creaimo la folder playbook

mkdir playbook && cd playbook

ora all'interno di questa cartella (che ospiterà tutti i PlayBook che creeremo in futuro) creiamo dunque un nuovo file avvalendoci sempre del nostro editor di testo nano

sudo nano vsftpd.yaml

nano ci aprirà un editor vuoto con caricato il nuovo file, inseriamo queste linee

---
- name: Playbook to Install FTP Server (vsftpd)
  hosts: managed-node
  tasks:
  - name: Install vsftpd
    package:
      name: vsftpd
      state: present

  - name: Start vsftpd service
    service:
      name: vsftpd
      state: started
      enabled: yes

questo playbook installerà e attiverà il servizio vsftpd , nel playbook viene definito anche il nodo remoto su cui effettuare l'installazione:

hosts: managed-node

premiamo nuovamente CTRL+O per salvare le modifiche e successivamente CTRL+X per chiudere l'editor.

Siamo finalmente pronti a lanciare il nostro PlayBook, lanciamolo utilizzando il comando:

ansible-playbook vsftpd.yaml

che dovrebbe restituirci come output:

dove il risultato è visibile nella sezione PLAY RECAP con 3 ok in verde per ogni task compiuto dal PlayBook.

possiamo inoltre effettivamente verificare che il servizio si sia avviato corrrettamente sul nodo remoto, lanciando un'ulteriore comando ansible:

ansible managed-node -m shell -a 'systemctl status vsftpd'

se tutto è avvenuto con successo e l'installazione come da output precedente è andata a buon fine sul nodo remoto, ci aspettiamo il seguente output:

che ci conferma che il servizio è installato e attivo sul nostro managed-node (192.168.8.120)

Conclusioni

in questo articolo abbiamo visto passo per passo, come installare e configurare ansible sul control-node (base Fedora), come aggiugere e gestire un managed-node (base Fedora) effettuando autenticazione sullo stesso in modalità passwordless grazie alla chuiave ssh, abbiamo visto una panoramica dei comandi principali che ansible può eseguire e abbiammo creato ed eseguito un PlayBook.

per questo articolo è tutto, se avete dubbi o domande lascio aperta la sezione commenti.

Grazie per la lettura!!