Linee guida Ansible

Le variabili sono ampiamente utilizzate in Ansible. Ma una delle cose frustranti di Ansible è che offre troppa libertà. Questo ha sia vantaggi che svantaggi. Lo svantaggio è la complessità insieme all'elevata responsabilità e il vantaggio è la flessibilità. Esaminiamo e organizziamo ciò che sappiamo sulle variabili Ansible.
Le variabili possono essere suddivise in due categorie:
- Variabili in file separati (nella tabella sotto "Filesystem").
- Variabili nel codice (nella tabella sottostante "Codice").
Ora, se guardi alla loro priorità, allora tutto va a posto.

Le variabili del file system hanno una precedenza inferiore rispetto alle variabili del codice. Hai notato la suddetta flessibilità e l'eccessiva libertà? Continuiamo ulteriormente con questa conoscenza in mente.
1. Dichiarare le variabili in file separati
È meglio posizionare le variabili in file separati (Inventory
,group_vars
,host_vars
,role/defaults/main.yml
erole/vars/main.yml
). Tutte le variabili "costanti" devono essere definite in modo esplicito. Le variabili costanti sono variabili che influenzano il ruolo o il comportamento del playbook. A differenza delle variabili "temporanee", utilizzate come buffer per memorizzare temporaneamente valori, spesso con ambito limitato. Ad esempio, le variabili dichiarate invars
esiste solo dentroblock
... Per esempio:
- name: Variables scope
hosts: localhost
connection: local
vars:
MY_VAR: "I am global var"
tasks:
- block:
- name: Print variable inside the block.
debug:
var: MY_VAR
vars:
MY_VAR: "I am local var"
- name: Print variable outside the block.
debug:
var: MY_VAR
PLAY [Variables scope]
TASK [Gathering Facts]
ok: [localhost]
TASK [Print variable inside the block.]
ok: [localhost] => {
"MY_VAR": "I am local var"
}
TASK [Print variable outside the block.]
ok: [localhost] => {
"MY_VAR": "I am global var"
}
Quindi, dobbiamo definire le variabili nei file. E tutte le variabili devono essere definite in modo esplicito. C'è un file per il ruolodefaults/main.yml
... I valori in questo file hanno la priorità più bassa, quindi qui possono essere posizionate anche variabili vuote. Ciò semplificherà la vita ai contributori, in particolare a quelli che vedono il codice per la prima volta.
2. Usa il LEGGIMI
Se il ruolo utilizza molte variabili diverse, forse tutte anche necessarie e utili, allora descrivile nel file README. Il comando ansible-galaxy init ti aiuterà in questo generando un modello README. Probabilmente, tu stesso, in un repository sconosciuto, sarai felice di vedere un README con informazioni su ciò che il ruolo si aspetta di vedere dentro e fuori. Un cattivo esempio potrebbe essere la separazione tra codice e descrizione. Ad esempio, il codice è in git e la descrizione è nella pagina wiki. Non vi è alcuna garanzia che i contributori aggiornino sia il codice che la pagina wiki. Di solito, dopo la richiesta pull, il lavoro termina.
3. Usa i prefissi
Tutte le variabili "costanti" (menzionate nel primo suggerimento) devono essere precedute. È meglio usare il nome del ruolo come prefisso. Questo è molto utile quando le variabili per ruoli diversi devono essere collocate nello stesso posto. Ad esempio, cosa succede in un playbook multiruolo se tutti i ruoli utilizzano la variabile porta? Aggiungendo un prefisso, garantiamo che alcune variabili non verranno sovrascritte da altre. Esempio: ruolo è console. la variabile è url, il nome della variabile è consul_url.
4. Assegna un nome alle attività con nomi significativi.
Le attività Ansible hanno nomi. Usa nomi significativi per loro come appaiono nell'output. Ricorda: questo è il tuo log, dal quale in caso di errori puoi capire cosa è andato storto.
Per esempio:
# No name/description
- copy: dest=/tmp/text.txt, content="bla-bla"
- name: Print variable global var.
debug:
var: MY_VAR
TASK [copy]
changed: [localhost]
TASK [Print variable global var.] *
ok: [localhost] => {
"MY_VAR": "I am global var"
}
5. ASCIUTTO (non ripeterti)
Ansible è come un normale linguaggio di programmazione. E proprio come un linguaggio normale, Ansible ha vari meccanismi per aiutarti a seguire il principio DRY (Don't Repeat Yourself). Ma ciò richiede una pianificazione anticipata per l'organizzazione del codice. Quando scrivi il codice, pensa alla riutilizzabilità.
Grandi blocchi:
NOME | URL |
| https://docs.ansible.com/ansible/latest/modules/importplaybook module.html # import-playbook-module |
| https://docs.ansible.com/ansible/latest/modules/import role module.html # import-role-module |
| https://docs.ansible.com/ansible/latest/modules/includerole module.html # include-role-module |
| https://docs.ansible.com/ansible/latest/modules/import task module.html # import-tasks-module |
| https://docs.ansible.com/ansible/latest/modules/includetasks_module.html#include-tasks-module |
Blocchi all'interno di un ruolo:(include/import)tasks
,(include/import)role
... Come può essere utilizzato? Ad esempio, stai utilizzando il modulo uri per inviare richieste API. Diciamo che queste sono richieste POST. Invece di ripetere l'URI 10 volte con tutte le impostazioni, puoi creare qualcosa come un metodo e usarlo ovunque. Simile ai metodi nei linguaggi di programmazione convenzionali, il nostro metodo accetta anche i parametri di input.
Per esempio:send_post.yml
- name: .::::::::::::. [ Sent POST request ] .::::::::::::.
uri:
url: "{{ URL }}"
method: POST
status_code: 200
body: "{{ BODY_VAR | to_nice_json }}"
body_format: json
validate_certs: yes
client_cert: tls.crt
client_key: tls.key
register: return_values
when: BODY_VAR is defined
Questo codice può essere riutilizzato.
- name: Bla-bla
include_tasks: send_post.yml
vars:
URL: "{{ main_url }}/{{ item }}"
BODY_VAR: "{{ item }}"
URL e BODY_VAR sono parametri del metodo.
6. Usa i blocchi
Usobloccare.
Descrivi i parametri dell'attività solo una volta, raggruppandoli. Anche il blocco può essere utilizzato in modo simile per provare/catturare il blocco nei linguaggi di programmazione tradizionali.
- block:
...
rescue:
...
block/rescue
È un'ottima alternativaignore_errors
... Gestione degli errori essenzialmente avanzata. Ciò può essere utile, ad esempio, quando è necessario eseguire del codice in un playbook, anche in caso di errore. Ad esempio, elimina alcuni file.
- block:
- name: .....
- name: .....
- name: .....
always:
file:
path: /tmp/xxxx
state: absent
7. Non usare i moduli di comando e shell
Cerca di non usare i modulicommand
eshell
perché non sono idempotenti. Sebbene ci siano una serie di trucchi che possono aiutare ad alleviare questo problema. Uso:
- when
- creates (se il file esiste, questo passaggio non viene eseguito).
- removes (se il file esiste, viene eseguito questo passaggio).
- changedwhen ...
Tuttavia, se possibile, stai lontano dacommand
eshell
...
8. Non usare i tag
Non utilizzare i tag. I tag possono essere un incubo per le persone che vedono il tuo codice per la prima volta. Le combinazioni di tag aumentano il numero di possibili opzioni per l'esecuzione di un playbook. Ma se non hai scelta, allora dettaglia i tag e le loro combinazioni nel README. Tuttavia, non tutti i tag sono cattivi. Ci sono eccezioni. Per esempio,always
,never
- leggi di più .
skip_ansible_lint
- Saltaansible-lint
per il compito.
9. Principio del minimo privilegio
Usa il principio del privilegio minimo. Parametrobecome
dovrebbe essereno
finché non ne avrai davvero bisogno. Usa semprebecome
chiaramente. Per esempio:
---
- hosts: wordpress
become: no
...
role:
- role: wordpress
tasks/main.yml
---
- name: Install mysql-server pkg
apt:
name: mysql-server
state: present
become: yes
10.Utilizzare la sintassi YAML per i parametri
Usa YAML invece della sintassi in linea. Confronta queste due opzioni:
YAML
- name: Install apache httpd
apt:
name: apache2
state: present
Incorporato
- name: Install apache httpd
apt: pkg=apache2 state=pesent
11. Usa gitignore
Inserisci.gitignore
ai tuoi ruoli se memorizzi il codice in un repository git. pianura.gitignore
potrebbe assomigliare a questo:
*.retry
*/__pycache__
*.pyc
*.log
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
12. Usa i consigli della documentazione di Ansible
Usa le linee guida per organizzare i contenuti dalla pagina ufficiale di ansible
13. Utilizzare una directory separata per i ruoli della comunità
Usa una directory separata per i ruoli della community, insieme alle linee guida del suggerimento precedente.
14. Testa il tuo codice Ansible
Usa i framework per testare il tuo codice Ansible. Ad esempio, molecola . Questo framework ti consente di testare il tuo codice da diverse angolazioni. Oltre ai test tradizionali, può anche eseguire tutti i tipi di linter e controllare il codice per l'idempotenza.
15. Versionamento dei ruoli
Che cos'è il versioning nel mondo di Ansible? Questo è l'approccio utilizzato da git e ti consente di eseguire diverse versioni di ruoli semplicemente specificando la versione. Una versione può essere un tag, un ramo o un commit specifico. Puoi leggere di più su questo qui . Il tuo compito è personalizzare la procedura in base ai requisiti di controllo delle versioni del tuo ruolo.
requisiti.yaml:
---
- src: git@gitlab.company.com:mygroup/ansible.git
scm: git
version: "0.1"
...
Attributi validi:
- src
- sccm
- versione
- nome
La traduzione dell'articolo è stata preparata alla vigilia dell'inizio del corso "DevOps Practices and Tools" .
Invitiamo tutti ad iscriversi ad una lezione demo gratuita del corso sul tema: "Prometeo: avvio rapido" . Durante la lezione, i partecipanti, insieme a un esperto, considereranno l'architettura Prometheus e il suo modo di lavorare con le metriche, oltre ad analizzare come generare avvisi ed eventi nel sistema.