Commit c3700ccb authored by JackV's avatar JackV
Browse files

Rename Ansible.md to content.md

parent 0dfcfe6e
## Ansible
Di cosa tratteremo oggi?
* Cosa è Ansible e perché mi può tornare utile? <!-- .element: class="fragment" -->
* Un po' di definizioni sui termini utilizzati <!-- .element: class="fragment" -->
* Demo <!-- .element: class="fragment" -->
---
# Ansible: Cosa è?
![Ansible Logo](https://www.ansible.com/hubfs/2017_Images/BrandPage/Brand-Assets/Community/Ansible-Mark-RGB_Gray.svg) <!-- .element height="30%" width="30%" -->
----
## Ansible
[Ansible](https://en.wikipedia.org/wiki/Ansible_(software) è un software che si occupa di automatizzare la configurazione di macchine remote o del deploy di applicazioni.
----
## Caratteristiche principali:
- **Minimale**: non richiede che i nodi abbiano un particolare software installato (solo python e OpenSSH).
- **Sicuro** : Tutte le operazioni vengono eseguite (generalmente) mediante SSH.
- **Semplice**: I file che compongono il nostro progetto sono tutti files di testo leggibili, generalmente YAML.
- **Idempotente** : Le operazioni che verranno eseguite avranno sempre il medesimo risultato
----
## Quando mi può servire?
* Se voglio riprodurre un'installazione/configurazione sempre uguale su più server <!-- .element: class="fragment" -->
* Se voglio fare un'installazione articolata e noiosa più e più volte <!-- .element: class="fragment" -->
* Se voglio aver modo di riprodurre l'installazione in caso di problemi oppure voglio farla scalare <!-- .element: class="fragment" -->
----
## Come installarlo
Per [installarlo](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html?) si può:
- Usare il package manager della propia versione di GNU/Linux
- Installarlo con pip: `$ pip install ansible`
- Eseguirlo da [sorgente](https://releases.ansible.com/ansible/)
---
## Un po' di definizioni...
Prima di iniziare a vedere degli esempi, definiamo alcuni concetti di Ansible
---
## Inventory
Per Ansible la lista degli host (macchine remote) su cui andremo a lavorare è chiamata **inventory**
----
## Inventory
Una inventory può essere sia in formato *INI* che in *JSON*.
Generalmente, il JSON viene utilizzato in caso di inventory create dinamicamente. <!-- .element: class="fragment" -->
----
## Inventory
Nell'inventory possiamo definire gli host:
- Singolarmente <!-- .element: class="fragment" -->
- Come gruppi <!-- .element: class="fragment" -->
- Come gruppi di gruppi <!-- .element: class="fragment" -->
----
## Esempio Inventory
```INI
# Definisco un gruppo
[webserver_centos]
webcentos.example.com
webcentos2.example.com
[webserver_ubuntu]
# Definisco degli host con variabile numerica
web[0:4].example.com
# Definisco un gruppo di gruppi
[webserver:children]
webserver_centos
webserver_ubuntu
```
---
## Playbook
Un **playbook** è un file contenente una serie di comandi che ci permettono di definire un insieme di istruzioni (**tasks**) che verranno eseguite su ogni host (o gruppo di host)
----
## Playbook
I playbook sono in formato **YAML**.
I playbook sono i task che vogliamo vengano eseguiti, nel modo e con le opzioni specificate.
----
## Esempio Playbook
In realtà, questo esempio è un singolo **play**.
I playbook possono contenere più play.
```YAML
---
- hosts: all # Definisco il gruppo a cui applicare la descrizione
remote_user: root # Definisco come mi autentico
tasks: # Definisco le operazioni da eseguire
- name: Latest apache # Il nome mostrato all'esecuzione
yum:
name: httpd
state: latest
# Posso definire altri task da eseguire
- name: ensure apache is running (and enable it at boot)
service:
name: httpd
state: started
enabled: yes
```
---
## Variables
Oltre a definire i comandi che devono essere eseguiti, all'interno del playbook possiamo anche definire delle variabili.
----
## Un Esempio
```YAML
- hosts: webserver
vars:
http_port: 80
```
----
## Variables
Le variabili possono essere utilizzate richiamandole con:
```DJANGO
{{ http_port }}
```
---
Tutto molto bello, ma come faccio a definire le istruzioni che voglio fare eseguire agli host che ho definito?
---
## Tasks, Moduli e Handlers
All'interno del play definiamo una lista di istruzioni, con relative opzioni, che verranno eseguite.
Questa lista è definita dal blocco **tasks**.
----
## Tasks, Moduli e Handlers
Le istruzioni definite all'interno dei tasks non sono libere, ma sono definite mediante una serie di "unità di lavoro" configurabili: [i moduli](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html)
----
## Task, Moduli e Handlers
Se volessi eseguire una di queste unità **solo** se una unità precedente è stata eseguita con successo posso utilizzare gli **handlers**
----
## Un esempio:
```YAML
---
- hosts: all
become: yes
tasks:
- name: "Creo utente"
user:
name: "antani"
state: present
notify: "Scrivo ciao"
handlers:
- name "Scrivo ciao"
shell: echo "Ciao" >> /home/antani/ciao.txt
```
---
## CLI
Ok, ora so leggere e so come è fatto (circa) un playbook.
Come faccio ad eseguirlo?
----
## CLI
Per eseguire un playbook:
```bash
ansible-playbook -i /path/alla/mia/inventory /path/al/playbook.yml
```
----
## CLI
Possiamo anche eseguire un singolo modulo, senza dover per forza utilizzare un playbook
```bash
ansible -i /path/alla/mia/inventory [host target | all ] -m [nome modulo]
```
----
## CLI
Un modulo comodo da eseguire è il modulo `setup`, che ci consente di fare una raccolta di informazioni delle macchine target:
```bash
ansible -i /path/alla/mia/inventory [host target | all ] -m setup
```
---
Prima di iniziare a mostrare degli esempi e a fare delle piccole demo, alcune note importanti su Ansible.
---
## N.B. 1:
# Come funziona Ansible
----
## Come funziona Ansible
Quando eseguiamo il nostro playbook, Ansible fa le seguenti operazioni:
1. Instaura una connessione con la macchina target <!-- .element: class="fragment" -->
2. Copia su quella macchina i moduli che dovrà eseguire <!-- .element: class="fragment" -->
3. Esegue una raccolta di informazioni sulla macchina target (modulo setup) <!-- .element: class="fragment" -->
4. Esegue (dalla macchina target) le operazioni che abbiamo configurato <!-- .element: class="fragment" -->
---
## N.B. 2:
# Privilege Escalation
----
## Privilege Escalation
Ansible permette di cambiare l'utente usato per instaurare la connessione e di scalare ad un utente con privilegi di amministrazione.
Questo procedimento si chiama **Privilege Escalation**.
----
## Privilege Escalation
Per farlo basta usare nel playbook:
```YAML
become: yes
become_user: root
become_method: sudo
```
---
## N.B. 3:
# Ansible Doc
----
## Ansible Doc
Quando siete in dubbio con un modulo, usate la documentazione con `ansible-doc`.
----
## Ansible Doc
Per mostrare la lista dei plugin disponibili:
```bash
ansible-doc -l
```
Per mostrare la documentazione di uno dei plugin:
```bash
ansible-doc copy
```
---
# Demo!
---
Di cosa *non* abbiamo parlato?
* Ansible Vault <!-- .element: class="fragment" -->
* Ansible Galaxy <!-- .element: class="fragment" -->
* Ansible AWX <!-- .element: class="fragment" -->
---
# Ansible Vault
----
## Ansible Vault
Con Ansible Vault possiamo salvare delle informazioni sensibili (password, indirizzi ip, ecc) all'interno del playbook.
Queste informazioni saranno salvate cifrate e ci verrà richiesta la password prima del loro utilizzo.
---
# Ansible Galaxy
----
## Ansible Galaxy
[Ansible Galaxy](https://galaxy.ansible.com/) è un hub dove vengono condivisi diversi playbook e da cui possiamo attingere nel momento in cui vogliamo riutilizzarli.
----
## Ansible Galaxy: CLI
Ansible Galaxy è utilizzabile mediante il comando `ansible-galaxy`
----
## Ansible Galaxy: CLI
```
ansible-galaxy [options]
```
- **search** ci permette di cercare un determinato termine
- **info** ci permette di avere più informazioni su un playbook specifico
- **install** ci permette di installare il playbook specificato per poterlo poi utilizzare
---
# Ansible AWX
----
## Ansible AWX
Ansible AWX (nome Community di Ansible Tower) è una "torre di controllo" da cui possiamo eseguire i playbook caricati.
A differenza di Ansible, è una applicazione web che ci permette di eseguire i vari playbook senza usare la CLI <!-- .element: class="fragment" -->
----
## Ansible AWX
Funzionalità interessanti:
- **Realtime jobs update**: Possiamo avere un output del task eseguito, per ogni macchina, in tempo reale
- **Logs**: Possiamo vedere chi ha eseguito cosa e quando
- **Scheduling**: Possiamo schedulare quando eseguire un playbook, quando fare l'update dell'inventory e altre task.
- **Gestione Multi Utente**: Possiamo avere più utente divisi in più gruppi, ognuno con diversi livelli di permessi
---
# Links
- [Ansible Webpage](https://www.ansible.com/)
- [Ansible Docs Page](https://docs.ansible.com/)
- [Ansible from beginner to pro](https://books.google.it/books?id=D-wmDQAAQBAJ&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false)
# Intro e outro dentro l'HTML
## Ansible
Il markdown contiene solo il contenuto.
Di cosa tratteremo oggi?
Di base si possono fare le slide anche in HTML se si vogliono animazioni buffe.
* Cosa è Ansible e perché mi può tornare utile? <!-- .element: class="fragment" -->
* Un po' di definizioni sui termini utilizzati <!-- .element: class="fragment" -->
* Demo <!-- .element: class="fragment" -->
---
# Ansible: Cosa è?
![Ansible Logo](https://www.ansible.com/hubfs/2017_Images/BrandPage/Brand-Assets/Community/Ansible-Mark-RGB_Gray.svg) <!-- .element height="30%" width="30%" -->
----
## Ansible
[Ansible](https://en.wikipedia.org/wiki/Ansible_(software) è un software che si occupa di automatizzare la configurazione di macchine remote o del deploy di applicazioni.
----
This is a long dash -- made of two little dashes (`--`).
## Caratteristiche principali:
- **Minimale**: non richiede che i nodi abbiano un particolare software installato (solo python e OpenSSH).
- **Sicuro** : Tutte le operazioni vengono eseguite (generalmente) mediante SSH.
- **Semplice**: I file che compongono il nostro progetto sono tutti files di testo leggibili, generalmente YAML.
- **Idempotente** : Le operazioni che verranno eseguite avranno sempre il medesimo risultato
----
This dash is even longer --- and it is made of three little dashes (`---`).
## Quando mi può servire?
"Quoting" is fun and easy. `"`Plain quoting`"` is ugly.
* Se voglio riprodurre un'installazione/configurazione sempre uguale su più server <!-- .element: class="fragment" -->
* Se voglio fare un'installazione articolata e noiosa più e più volte <!-- .element: class="fragment" -->
* Se voglio aver modo di riprodurre l'installazione in caso di problemi oppure voglio farla scalare <!-- .element: class="fragment" -->
----
# Heading level 1
## Come installarlo
Per [installarlo](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html?) si può:
- Usare il package manager della propia versione di GNU/Linux
- Installarlo con pip: `$ pip install ansible`
- Eseguirlo da [sorgente](https://releases.ansible.com/ansible/)
## Heading level 2
---
### Heading level 3
## Un po' di definizioni...
#### Heading level 4
Prima di iniziare a vedere degli esempi, definiamo alcuni concetti di Ansible
There are **no** more heading levels.
---
## Inventory
Per Ansible la lista degli host (macchine remote) su cui andremo a lavorare è chiamata **inventory**
----
```python
import sys
## Inventory
Una inventory può essere sia in formato *INI* che in *JSON*.
Generalmente, il JSON viene utilizzato in caso di inventory create dinamicamente. <!-- .element: class="fragment" -->
----
## Inventory
Nell'inventory possiamo definire gli host:
- Singolarmente <!-- .element: class="fragment" -->
- Come gruppi <!-- .element: class="fragment" -->
- Come gruppi di gruppi <!-- .element: class="fragment" -->
----
x = 1 + 2
## Esempio Inventory
if x > 2:
pass
```INI
# Definisco un gruppo
[webserver_centos]
webcentos.example.com
webcentos2.example.com
try:
with open('/dev/null') as f:
pass
except IOError:
raise Exception('Error!')
finally:
sys.exit()
[webserver_ubuntu]
# Definisco degli host con variabile numerica
web[0:4].example.com
# Definisco un gruppo di gruppi
[webserver:children]
webserver_centos
webserver_ubuntu
```
---
## Playbook
Un **playbook** è un file contenente una serie di comandi che ci permettono di definire un insieme di istruzioni (**tasks**) che verranno eseguite su ogni host (o gruppo di host)
----
## Playbook
I playbook sono in formato **YAML**.
I playbook sono i task che vogliamo vengano eseguiti, nel modo e con le opzioni specificate.
----
## Esempio Playbook
In realtà, questo esempio è un singolo **play**.
I playbook possono contenere più play.
```YAML
---
- hosts: all # Definisco il gruppo a cui applicare la descrizione
remote_user: root # Definisco come mi autentico
tasks: # Definisco le operazioni da eseguire
- name: Latest apache # Il nome mostrato all'esecuzione
yum:
name: httpd
state: latest
# Posso definire altri task da eseguire
- name: ensure apache is running (and enable it at boot)
service:
name: httpd
state: started
enabled: yes
```
---
## Variables
Oltre a definire i comandi che devono essere eseguiti, all'interno del playbook possiamo anche definire delle variabili.
----
- Do you remember bullet list?
```python
bullet_list = ["Do you remember bullet list?"]
```
- You can also allign code to bullet lists!
```python
bullet_list.append("You can also allign code to bullet lists!")
```
- It's not too hard!
```python
if not hard:
bullet_list.append("It's not too hard!")
```
\ No newline at end of file
## Un Esempio
```YAML
- hosts: webserver
vars:
http_port: 80
```
----
## Variables
Le variabili possono essere utilizzate richiamandole con:
```DJANGO
{{ http_port }}
```
---
Tutto molto bello, ma come faccio a definire le istruzioni che voglio fare eseguire agli host che ho definito?
---
## Tasks, Moduli e Handlers
All'interno del play definiamo una lista di istruzioni, con relative opzioni, che verranno eseguite.
Questa lista è definita dal blocco **tasks**.
----
## Tasks, Moduli e Handlers
Le istruzioni definite all'interno dei tasks non sono libere, ma sono definite mediante una serie di "unità di lavoro" configurabili: [i moduli](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html)
----
## Task, Moduli e Handlers
Se volessi eseguire una di queste unità **solo** se una unità precedente è stata eseguita con successo posso utilizzare gli **handlers**
----
## Un esempio:
```YAML
---
- hosts: all
become: yes
tasks:
- name: "Creo utente"
user:
name: "antani"
state: present
notify: "Scrivo ciao"
handlers:
- name "Scrivo ciao"
shell: echo "Ciao" >> /home/antani/ciao.txt
```
---
## CLI
Ok, ora so leggere e so come è fatto (circa) un playbook.
Come faccio ad eseguirlo?
----
## CLI
Per eseguire un playbook:
```bash
ansible-playbook