Galassia Ansibile: Collezioni e Ruoli¶
In questo capitolo imparerai come usare, installare e gestire ruoli e collezioni Ansible.
Obiettivi: In questo capitolo imparerai come:
installare e gestire collezioni;
installare e gestire i ruoli.
ansible, ansible-galaxy, ruoli, collezioni
Conoscenza:
Complessità:
Tempo di lettura: 40 minuti
La Galassia Ansible fornisce Ruoli Ansible e Collezioni della Comunità Ansible.
Gli elementi forniti possono essere referenziati nei playbook e pronti da usare
comando ansible-galaxy
¶
Il comando ansible-galaxy
gestisce ruoli e collezioni utilizzando galaxy.ansible.com.
- Per gestire i ruoli:
ansible-galaxy role [import|init|install|login|remove|...]
Sotto comandi | Funzionalità |
---|---|
install |
installare un ruolo. |
remove |
rimuovere uno o più ruoli. |
list |
mostrare il nome e la versione dei ruoli installati. |
info |
visualizzare informazioni su un ruolo. |
init |
generare uno scheletro di un nuovo ruolo. |
import |
importare un ruolo dal sito web della galassia. Richiede un login. |
- Per gestire le collezioni:
ansible-galaxy collection [import|init|install|login|remove|...]
Sotto comandi | Funzionalità |
---|---|
init |
generare uno scheletro di una nuova collezione. |
install |
installare una collezione. |
list |
visualizzare il nome e la versione delle collezioni installate. |
Ruoli Ansible¶
Un ruolo Ansible è un'unità che promuove la riutilizzabilità dei playbook.
Nota
Ulteriori informazioni possono essere trovate qui
Installazione di ruoli utili¶
Al fine di evidenziare l'interesse ad utilizzare i ruoli, vi suggerisco di utilizzare il ruolo alemorvan/patchmanagement
, che vi permetterà di eseguire un sacco di attività (pre-aggiornamento o post-aggiornamento, per esempio) durante il processo di aggiornamento, in poche righe di codice.
Puoi controllare il codice nel repo github del ruolo qui.
- Installare il ruolo. Questo richiede un solo comando:
ansible-galaxy role install alemorvan.patchmanagement
- Creare un playbook per includere il ruolo:
- name: Start a Patch Management
hosts: ansible_clients
vars:
pm_before_update_tasks_file: custom_tasks/pm_before_update_tasks_file.yml
pm_after_update_tasks_file: custom_tasks/pm_after_update_tasks_file.yml
tasks:
- name: "Include patchmanagement"
include_role:
name: "alemorvan.patchmanagement"
Con questo ruolo, puoi aggiungere i tuoi compiti per tutto il tuo inventario o solo per il nodo selezionato.
Creiamo delle attività che saranno eseguite prima e dopo il processo di aggiornamento:
- Crea la cartella
custom_tasks
:
mkdir custom_tasks
- Crea
custom_tasks/pm_before_update_tasks_file.yml
(puoi liberamente cambiare il nome e il contenuto di questo file)
---
- name: sample task before the update process
debug:
msg: "This is a sample tasks, feel free to add your own test task"
- Crea
custom_tasks/pm_after_update_tasks_file.yml
(puoi liberamente cambiare il nome e il contenuto di questo file)
---
- name: sample task after the update process
debug:
msg: "This is a sample tasks, feel free to add your own test task"
E lancia il tuo primo Gestione Patch:
ansible-playbook patchmanagement.yml
PLAY [Start a Patch Management] *************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [192.168.1.11]
TASK [Include patchmanagement] **************************************************************************
TASK [alemorvan.patchmanagement : MAIN | Linux Patch Management Job] ************************************
ok: [192.168.1.11] => {
"msg": "Start 192 patch management"
}
...
TASK [alemorvan.patchmanagement : sample task before the update process] ********************************
ok: [192.168.1.11] => {
"msg": "This is a sample tasks, feel free to add your own test task"
}
...
TASK [alemorvan.patchmanagement : MAIN | We can now patch] **********************************************
included: /home/ansible/.ansible/roles/alemorvan.patchmanagement/tasks/patch.yml for 192.168.1.11
TASK [alemorvan.patchmanagement : PATCH | Tasks depends on distribution] ********************************
ok: [192.168.1.11] => {
"ansible_distribution": "Rocky"
}
TASK [alemorvan.patchmanagement : PATCH | Include tasks for CentOS & RedHat tasks] **********************
included: /home/ansible/.ansible/roles/alemorvan.patchmanagement/tasks/linux_tasks/redhat_centos.yml for 192.168.1.11
TASK [alemorvan.patchmanagement : RHEL CENTOS | yum clean all] ******************************************
changed: [192.168.1.11]
TASK [alemorvan.patchmanagement : RHEL CENTOS | Ensure yum-utils is installed] **************************
ok: [192.168.1.11]
TASK [alemorvan.patchmanagement : RHEL CENTOS | Remove old kernels] *************************************
skipping: [192.168.1.11]
TASK [alemorvan.patchmanagement : RHEL CENTOS | Update rpm package with yum] ****************************
ok: [192.168.1.11]
TASK [alemorvan.patchmanagement : PATCH | Inlude tasks for Debian & Ubuntu tasks] ***********************
skipping: [192.168.1.11]
TASK [alemorvan.patchmanagement : MAIN | We can now reboot] *********************************************
included: /home/ansible/.ansible/roles/alemorvan.patchmanagement/tasks/reboot.yml for 192.168.1.11
TASK [alemorvan.patchmanagement : REBOOT | Reboot triggered] ********************************************
ok: [192.168.1.11]
TASK [alemorvan.patchmanagement : REBOOT | Ensure we are not in rescue mode] ****************************
ok: [192.168.1.11]
...
TASK [alemorvan.patchmanagement : FACTS | Insert fact file] *********************************************
ok: [192.168.1.11]
TASK [alemorvan.patchmanagement : FACTS | Save date of last PM] *****************************************
ok: [192.168.1.11]
...
TASK [alemorvan.patchmanagement : sample task after the update process] *********************************
ok: [192.168.1.11] => {
"msg": "This is a sample tasks, feel free to add your own test task"
}
PLAY RECAP **********************************************************************************************
192.168.1.11 : ok=31 changed=1 unreachable=0 failed=0 skipped=4 rescued=0 ignored=0
Piuttosto facile per un processo così complesso, vero?
Questo è solo un esempio di ciò che può essere fatto utilizzando i ruoli resi disponibili dalla comunità. Dai un'occhiata a galaxy.ansible.com per scoprire i ruoli che potrebbero essere utili per te!
Puoi anche creare i tuoi ruoli per le tue esigenze e pubblicarli su Internet se te la senti. Questo è quanto affronteremo brevemente nel prossimo capitolo.
Introduzione allo sviluppo del ruolo¶
Uno scheletro di ruolo, che serve come punto di partenza per lo sviluppo di ruolo personalizzato, può essere generato dal comando ansible-galaxy
:
$ ansible-galaxy role init rocky8
- Role rocky8 was created successfully
Il comando genererà la seguente struttura ad albero per contenere il ruolo rocky8
:
tree rocky8/
rocky8/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
I ruoli consentono di eliminare la necessità di includere i file. Non c'è bisogno di specificare i percorsi dei file o includere
direttive nei playbook. Devi solo specificare un compito, e Ansible si occupa delle inclusioni.
La struttura di un ruolo è abbastanza evidente da capire.
Le variabili sono semplicemente memorizzate in vars/main.yml
se le variabili non devono essere sovrascritte, oppure in default/main.yml
se vuoi lasciare la possibilità di sovrascrivere il contenuto variabile dall'esterno del tuo ruolo.
I gestori, i file e i modelli necessari per il tuo codice sono memorizzati rispettivamente in handlers/main.yml
, files
e templates
.
Tutto ciò che rimane è definire il codice per le attività del tuo ruolo in tasks/main.yml
.
Una volta che tutto questo funziona bene, è possibile utilizzare questo ruolo nei tuoi playbook. Sarete in grado di utilizzare il vostro ruolo senza preoccuparvi dell'aspetto tecnico dei suoi compiti, durante la personalizzazione del suo funzionamento con variabili.
Lavoro pratico: creare un primo ruolo semplice¶
Implementiamo questo con un ruolo "go anywhere" che creerà un utente predefinito e installerà pacchetti software. Questo ruolo può essere applicato sistematicamente a tutti i tuoi server.
Variabili¶
Creeremo un utente rockstar
su tutti i nostri server. Poiché non vogliamo che questo utente sia sovrascritto, definiamolo nel vars/main.yml
:
---
rocky8_default_group:
name: rockstar
gid: 1100
rocky8_default_user:
name: rockstar
uid: 1100
group: rockstar
Ora possiamo usare queste variabili all'interno dei nostri tasks/main.yml
senza alcuna inclusione.
---
- name: Create default group
group:
name: "{{ rocky8_default_group.name }}"
gid: "{{ rocky8_default_group.gid }}"
- name: Create default user
user:
name: "{{ rocky8_default_user.name }}"
uid: "{{ rocky8_default_user.uid }}"
group: "{{ rocky8_default_user.group }}"
Per testare il tuo nuovo ruolo, creiamo un playbook test-role.yml
nella stessa directory del tuo ruolo:
---
- name: Test my role
hosts: localhost
roles:
- role: rocky8
become: true
become_user: root
e lancialo:
ansible-playbook test-role.yml
PLAY [Test my role] ************************************************************************************
TASK [Gathering Facts] *********************************************************************************
ok: [localhost]
TASK [rocky8 : Create default group] *******************************************************************
changed: [localhost]
TASK [rocky8 : Create default user] ********************************************************************
changed: [localhost]
PLAY RECAP *********************************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Congratulazioni! Ora siete in grado di creare grandi cose con un playbook di solo poche righe.
Vediamo l'uso delle variabili predefinite.
Crea un elenco di pacchetti da installare per impostazione predefinita sui server e un elenco vuoto di pacchetti da disinstallare. Modifica i file defaults/main.yml
e aggiungi questi due elenchi:
rocky8_default_packages:
- tree
- vim
rocky8_remove_packages: []
e usali nei tuoi tasks/main.yml
:
- name: Install default packages (can be overridden)
package:
name: "{{ rocky8_default_packages }}"
state: present
- name: "Uninstall default packages (can be overridden) {{ rocky8_remove_packages }}"
package:
name: "{{ rocky8_remove_packages }}"
state: absent
Verifica il tuo ruolo con l'aiuto del playbook precedentemente creato:
ansible-playbook test-role.yml
PLAY [Test my role] ************************************************************************************
TASK [Gathering Facts] *********************************************************************************
ok: [localhost]
TASK [rocky8 : Create default group] *******************************************************************
ok: [localhost]
TASK [rocky8 : Create default user] ********************************************************************
ok: [localhost]
TASK [rocky8 : Install default packages (can be overridden)] ********************************************
ok: [localhost]
TASK [rocky8 : Uninstall default packages (can be overridden) []] ***************************************
ok: [localhost]
PLAY RECAP *********************************************************************************************
localhost : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ora puoi sovrascrivere i rocky8_remove_packages
nel tuo playbook e disinstallare ad esempio cockpit
:
---
- name: Test my role
hosts: localhost
vars:
rocky8_remove_packages:
- cockpit
roles:
- role: rocky8
become: true
become_user: root
ansible-playbook test-role.yml
PLAY [Test my role] ************************************************************************************
TASK [Gathering Facts] *********************************************************************************
ok: [localhost]
TASK [rocky8 : Create default group] *******************************************************************
ok: [localhost]
TASK [rocky8 : Create default user] ********************************************************************
ok: [localhost]
TASK [rocky8 : Install default packages (can be overridden)] ********************************************
ok: [localhost]
TASK [rocky8 : Uninstall default packages (can be overridden) ['cockpit']] ******************************
changed: [localhost]
PLAY RECAP *********************************************************************************************
localhost : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ovviamente, non c'è limite a quanto si può migliorare il proprio ruolo. Immaginate che per uno dei vostri server, avete bisogno di un pacchetto che è nell'elenco di quelli da disinstallare. Si potrebbe quindi, ad esempio, creare una nuova lista che può essere sovrascritta e quindi rimuovere dall'elenco dei pacchetti da disinstallare quelli nell'elenco dei pacchetti specifici da installare utilizzando il filtro jinja difference()
.
- name: "Uninstall default packages (can be overridden) {{ rocky8_remove_packages }}"
package:
name: "{{ rocky8_remove_packages | difference(rocky8_specifics_packages) }}"
state: absent
Collezioni Ansible¶
Le collezioni sono un formato di distribuzione per i contenuti Ansible che possono includere libri di gioco, ruoli, moduli e plugin.
Nota
Ulteriori informazioni possono essere trovate qui
Per installare o aggiornare una collezione:
ansible-galaxy collection install namespace.collection [--upgrade]
È quindi possibile utilizzare la collezione appena installata usando lo spazio dei nomi e il nome del modulo prima del nome o del ruolo:
- import_role:
name: namespace.collection.rolename
- namespace.collection.modulename:
option1: value
Puoi trovare un indice di raccolta qui.
Installiamo la collezione community.general
:
ansible-galaxy collection install community.general
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Downloading https://galaxy.ansible.com/download/community-general-3.3.2.tar.gz to /home/ansible/.ansible/tmp/ansible-local-51384hsuhf3t5/tmpr_c9qrt1/community-general-3.3.2-f4q9u4dg
Installing 'community.general:3.3.2' to '/home/ansible/.ansible/collections/ansible_collections/community/general'
community.general:3.3.2 was installed successfully
Ora possiamo utilizzare il nuovo modulo disponibile yum_versionlock
:
- name: Start a Patch Management
hosts: ansible_clients
become: true
become_user: root
tasks:
- name: Ensure yum-versionlock is installed
package:
name: python3-dnf-plugin-versionlock
state: present
- name: Prevent kernel from being updated
community.general.yum_versionlock:
state: present
name: kernel
register: locks
- name: Display locks
debug:
var: locks.meta.packages
ansible-playbook versionlock.yml
PLAY [Start a Patch Management] *************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [192.168.1.11]
TASK [Ensure yum-versionlock is installed] **************************************************************
changed: [192.168.1.11]
TASK [Prevent kernel from being updated] ****************************************************************
changed: [192.168.1.11]
TASK [Display locks] ************************************************************************************
ok: [192.168.1.11] => {
"locks.meta.packages": [
"kernel"
]
}
PLAY RECAP **********************************************************************************************
192.168.1.11 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Creare la propria collezione¶
Come per i ruoli, puoi creare la tua collezione con l'aiuto del comando ansible-galaxy
:
ansible-galaxy collection init rocky8.rockstarcollection
- Collection rocky8.rockstarcollection was created successfully
tree rocky8/rockstarcollection/
rocky8/rockstarcollection/
├── docs
├── galaxy.yml
├── plugins
│ └── README.md
├── README.md
└── roles
È quindi possibile memorizzare i propri plugin o ruoli all'interno di questa nuova collezione.