Ansible APT Package Manager è l’equivalente per Ubuntu del RedHat yum package manager. Come qualsiasi altro modulo Ansible, è costruito per interfacciarsi con uno specifico comando Unix, in questo caso apt e apt-get.
Ricordiamo che è sempre raccomandato utilizzare i moduli di Ansible piuttosto che lanciare comandi Unix grezzi attraverso il modulo shell, questo perché l’utilizzo dei moduli Ansible garantiscono una maggiore standardizzazione e fault tolerance ai nostri Ansible Playbooks.
Vediamo quindi ora come utilizzare il modulo apt di Ansible.
Tabella dei Contenuti
Introduzione al modulo apt di Ansible
Il modulo apt di Ansible gestisce i package apt nei sistemi Debian o Ubuntu.
Tipicamente in una macchina Ubuntu per installare un package eseguiremmo questo comando
sudo apt install nginx
In Ansible questa cosa la possiamo realizzare nel seguente modo
---
- name: Playbook to install NGINX
hosts: webservers
become: true
tasks:
- name: Ansible apt install nginx
apt:
name: nginx
state: present
Differenza tra apt e apt-get
Erroneamente si pensa che apt e apt-get siano la stessa cosa e che possiamo quindi usarli intercambiabilmente.
Apt è una interfaccia di front-end per apt-get che cerca di risolvere certe mancanze presenti in apt-get.
Direttamente dal blog di Debian prendiamo questa frase per capire la differenza tra apt e apt-get:
apt is a second command-line based front end provided by APT which overcomes some design mistakes of apt-get.
Quindi apt può fare tutto quello che apt-get può fare, migliorandone l’interazione con l’utente.
Il modulo apt di Ansible, così come è concepito, favorisce il comando apt rispetto ad apt-get, passando eventualmente a quest’ultimo in modo del tutto automatico nei casi in cui necessario.
Cosa fare però se volessimo forzare Ansible ad usare apt-get invece di apt?
Forzare l'uso di apt-get in Ansible
Per obbligare Ansible ad usare apt-get invece di apt, possiamo utilizzare il parametro force_apt_get
L’esempio precedente in cui installiamo nginx diventerebbe quindi così
---
- name: Playbook to install NGINX
hosts: webservers
become: true
tasks:
- name: Ansible apt install nginx
apt:
name: nginx
state: present
force_apt_get: yes
Rimuovere un package con Ansible apt
Per rimuovere un pacchetto utilizzando il modulo apt di Ansible, tutto ciò che è necessario fare è utilizzare state: absent
---
- name: Playbook to install NGINX
hosts: webservers
become: true
tasks:
- name: Ansible apt install nginx
apt:
name: nginx
state: absent
Aggiornare la cache di apt con Ansible
La prima fase da seguire quando ci si appronta ad installare un pacchetto mediante apt è quella di aggiornare la cache locale di apt.
In un playbook Ansible, per aggiornarla dobbiamo usare il parametro update_cache
---
- name: Esempio di Ansible apt module
hosts: web
become: true
tasks:
- name: Ansible apt update
register: updatesys
apt:
update_cache: yes
Nel caso in cui volessimo aggiornare la cache di apt solo se più vecchia di un certo tempo è sufficiente aggiungere il parametro cache_valid_time
---
- name: Esempio di Ansible apt module
hosts: web
become: true
tasks:
- name: Ansible apt update se cache più vecchia di un'ora
register: updatesys
apt:
update_cache: yes
cache_valid_time: 3600
Aggiornare un singolo package con Ansible apt
L’aggiornamento di un singolo pacchetto può essere fatto indicando il parametro state: latest
---
- name: Esempio di Ansible apt module
hosts: web
become: true
tasks:
- name: Ansible apt update se cache più vecchia di un'ora
register: updatesys
apt:
name: openssl
state: latest
update_cache: yes
Eseguire l'update e l'upgrade di tutti i pacchetti
Mantenere aggiornati i pacchetti installati è assolutamente necessario per mantenere sicuro e integro il nostro sistema. Possiamo quindi automatizzarlo tramite Ansible con il seguente Playbook
---
- name: Ansible apt module examples
hosts: web
become: true
tasks:
- name: Ansible Update Cache and Upgrade all Packages
register: updatesys
apt:
name: "*"
state: latest
update_cache: yes
- name: Show the last line from the previous task to check the stats
debug:
msg: "{{updatesys.stdout_lines|last}}"
Come installare una lista di pacchetti con Ansible apt
Se in un colpo solo volessimo installare una lista di pacchetti, possiamo utilizzare un Playbook così costruito
---
- name: Ansible apt module examples
hosts: web
become: yes
tasks:
- name: Ansible apt to install multiple packages - LAMP
register: updatesys
apt:
update_cache: yes
name:
- firewalld
- apache2
- mariadb-server
- php
- php-mysql
state: present
Installare una specifica versione di un package con Ansible apt
A volte può essere necessario installare una specifica verisone di un package. Il nostro Playbook Ansible sarà quindi simile al seguente
---
- name: Ansible apt module examples
hosts: web
become: true
tasks:
- name: Ansible apt install tomcat Version 8.0.32
register: updatesys
apt:
update_cache: yes
name: tomcat8=8.0.32-1ubuntu1.11
state: present
In questo esempio abbiamo installato la versione 8.0.32 di tomcat.
Installare un file .deb o un package usando Ansible apt
Il modulo apt di Ansible può essere utilizzato anche per installare i package .deb oppure per scaricare il file da un URL remoto e successivamente installarlo.
In questo esempio il Playbook si occupa di installare filebeat utilizzando il relativo .deb package.
Il file è già stato scaricato ed è contenuto nella directory locale /tmp
---
- name: Ansible apt module examples
hosts: web
become: true
tasks:
- name: Ansible install filebeat deb file from local
apt:
deb: /tmp/filebeat-7.6.0-amd64.deb
In quest’altro esempio invece, il file .deb deve ancora essere scaricato e pertanto ne indichiamo il suo URL.
Sarà quindi Ansible apt a scaricare il file .deb dal percorso remoto ed installarlo senza alcun intervento manuale.
---
- name: Ansible apt module examples
hosts: web
become: true
tasks:
- name: Ansible install filebeat deb file from url
apt:
deb: https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.0-amd64.deb
Validare se un package è installato usando Ansible apt
Quando, prima di effettuare una qualsiasi operazione, vogliamo validare con Ansible la presenza o meno sul sistema di un certo package, possiamo farlo utilizzando il modulo apt e l’opzione check_mode.
Il metodo però consigliato per questo tipo di validazione è quello che passa per l’utilizzo del modulo package_facts. Qui di seguito li Playbook di esempio
---
- name: Ansible validate if the packages are installed
hosts: web
become: true
tasks:
- name: Gather Package facts
package_facts:
manager: auto
- name: Validating if the package is installed or not
debug:
msg: "{{item}} is installed"
when: '"{{item}}" in ansible_facts.packages'
with_items:
- apache2
- nginx
- filebeat
Rimuovere i pacchetti inutilizzati usando Ansible apt
Per ripulire il sistema dai pacchetti inutilizzati si può utilizzare il modulo apt di Ansible nel seguente modulo
---
- name: Remove useless packages from the cache
apt:
autoclean: yes
- name: Remove dependencies that are no longer required
apt:
autoremove: yes
Questo comando ripulisce la cache dai package non più utilizzati e ne rimuove le dipendenze che non sono più necessarie.
Link utili
Per maggiori dettagli sul funzionamento del modulo apt fare riferimento alla documentazione ufficiale Ansible https://docs.ansible.com/ansible/latest/collections/ansible/builtin/apt_module.html