225 lines
4.0 KiB
Markdown
225 lines
4.0 KiB
Markdown
+++
|
|
title = "Ansible per principianti"
|
|
outputs = ["Reveal"]
|
|
|
|
+++
|
|
|
|
|
|
# Ansible
|
|
### for dummies
|
|
#### (???)
|
|
|
|
---
|
|
|
|
## Cos'è:
|
|
|
|
{{% fragment %}} * E' un software per automatizzare la configurazione (_provisioning_) di un computer {{% /fragment %}}
|
|
|
|
{{% fragment %}} * E' una serie di programmi CLI (`ansible`, `ansible-playbook`, `ansible-galaxy`, `ansible-vault`, ...) {{% /fragment %}}
|
|
|
|
{{% fragment %}} * E' scritto in python {{% /fragment %}}
|
|
|
|
{{% fragment %}} * Si configura in `yaml` (o `ini`, ma preferiamo `yaml`) {{% /fragment %}}
|
|
|
|
---
|
|
|
|
## A cosa serve:
|
|
|
|
* A configurare _automaticamente_ una o più macchine
|
|
|
|
* A tenere traccia facilmente di tutti i passi necessari a configurare una macchina (_infrastructure-as-code_)
|
|
|
|
---
|
|
|
|
{{% section %}}
|
|
|
|
# Concetti base
|
|
|
|
---
|
|
|
|
## Playbook
|
|
|
|
* Un _playbook_ è un documento strutturato (`yaml` o `ini`) che istruisce ansible su cosa fare.
|
|
|
|
* Può contenere tutto il _codice_ che ci serve, ma in generale si usa insieme agli _inventory_ e ai _role_ ed è più che altro un entrypoint.
|
|
|
|
---
|
|
|
|
## Connettore
|
|
|
|
* Ansible interagisce con le macchine da configurare attraverso un connettore.
|
|
|
|
* Lo standard *de facto* è `ssh` (quindi è essenziale avere un minimo di dimestichezza con la sintassi di ssh)
|
|
|
|
---
|
|
|
|
## Inventory
|
|
|
|
* L'_inventory_ è un registro di informazioni
|
|
|
|
* Di default ansible legge l'inventory a `/etc/ansible/hosts`. Si può specificare l'inventory con l'opzione `-i <path>`.
|
|
|
|
---
|
|
|
|
## Inventory
|
|
|
|
```yaml
|
|
---
|
|
all:
|
|
hosts:
|
|
central.machine.org:
|
|
children:
|
|
nice:
|
|
hosts:
|
|
nancy.machine.org:
|
|
manny.machine.org:
|
|
naughty:
|
|
hosts:
|
|
john.machine.org:
|
|
bob.machine.org:
|
|
red:
|
|
hosts:
|
|
charon.machine.org:
|
|
godot.machine.org:
|
|
bob.machine.org:
|
|
blue:
|
|
hosts:
|
|
nancy.machine.org:
|
|
```
|
|
|
|
---
|
|
|
|
## Role
|
|
|
|
* Un _role_ è una funzione autocontenuta
|
|
|
|
* E' una ricetta da applicare ad una macchina ottenere una funzionalità su quella macchina
|
|
|
|
|
|
---
|
|
|
|
## Facts
|
|
|
|
* I _facts_ sono le verità che riguardano una macchina su cui ansible agisce
|
|
|
|
* Sono raccolti ad inizio esecuzione su ogni macchina
|
|
|
|
* Sono locali alla macchina
|
|
|
|
* Possono essere impostati direttamente da un playbook, se ne abbiamo bisogno
|
|
|
|
---
|
|
|
|
## Module
|
|
|
|
* Un _module_ è una libreria che ansible usa per eseguire codice
|
|
|
|
* Rende (più) facile eseguire azioni complesse su una macchina remota
|
|
|
|
* ```sh
|
|
$ ansible-doc -l|wc -l
|
|
3387
|
|
$ ansible-doc -l|grep -E "^apt"
|
|
apt Manages apt-packages
|
|
apt_key Add or remove an apt key
|
|
apt_repo Manage APT repositories via apt-repo
|
|
apt_repository Add and remove APT repositories
|
|
apt_rpm apt_rpm package manager
|
|
```
|
|
|
|
{{% /section %}}
|
|
|
|
---
|
|
|
|
{{% section %}}
|
|
|
|
# Roles
|
|
|
|
---
|
|
|
|
## Role
|
|
|
|
`ansible-galaxy role init gitea`
|
|
|
|
```yaml
|
|
.
|
|
├── defaults
|
|
│ └── main.yml
|
|
├── files
|
|
├── handlers
|
|
│ └── main.yml
|
|
├── meta
|
|
│ └── main.yml
|
|
├── README.md
|
|
├── tasks
|
|
│ └── main.yml
|
|
├── templates
|
|
├── tests
|
|
│ ├── inventory
|
|
│ └── test.yml
|
|
└── vars
|
|
└── main.yml
|
|
```
|
|
|
|
---
|
|
|
|
## Task
|
|
|
|
`tasks/main.yml`
|
|
|
|
```yaml
|
|
---
|
|
- name: Install prerequisites
|
|
apt:
|
|
name: postgres
|
|
state: present
|
|
```
|
|
|
|
---
|
|
|
|
## Task
|
|
|
|
```yaml
|
|
- name: Configure database
|
|
template:
|
|
src: templates/pg_hba.conf.j2
|
|
dest: /var/lib/postgres/pg_hba.conf
|
|
owner: postgres
|
|
group: postgres
|
|
mode: 0600
|
|
notify: restart postgres
|
|
```
|
|
|
|
---
|
|
|
|
## Handler
|
|
|
|
`handlers/main.yml`
|
|
|
|
```yaml
|
|
---
|
|
- name: restart postgres
|
|
systemd:
|
|
name: postgres.service
|
|
state: restarted
|
|
```
|
|
|
|
---
|
|
|
|
## Template
|
|
|
|
`templates/pg_hba.conf.j2`
|
|
```
|
|
{% for client in postgresql_hba_entries %}
|
|
{{ client.type }} {{ client.database }} {{ client.user }} {{ client.address|default('') }} {{ client.ip_address|default('') }} {{ client.ip_mask|default('') }} {{ client.auth_method }} {{ client.auth_options|default("") }}
|
|
{% endfor %}
|
|
```
|
|
|
|
[Jinja syntax](https://jinja.palletsprojects.com/)
|
|
|
|
{{% /section %}}
|
|
|
|
---
|
|
|
|
# FINE
|