# Capitolo 5 – Comandi Ad-Hoc e Operatività Quotidiana

I comandi ad-hoc permettono di eseguire operazioni rapide sui nodi gestiti senza scrivere un playbook.

Sono utili per:

- Verifiche veloci
- Interventi urgenti
- Troubleshooting
- Operazioni una tantum

Non sostituiscono i playbook in ambienti strutturati, ma sono uno strumento operativo fondamentale per un sysadmin.

---

## 5.1 Sintassi Base

Struttura generale:

```bash
ansible <gruppo_host> -m <modulo> -a "<argomenti>"
```

Esempio:

```bash
ansible all -m ping
```

Componenti:

- `<gruppo_host>` → gruppo definito nell’inventory
- `-m` → modulo da utilizzare
- `-a` → argomenti del modulo

---

## 5.2 Verifica Connettività

Test base su tutti i server:

```bash
ansible all -m ping
```

Se tutto è configurato correttamente, l’output sarà:

- SUCCESS
- Nessun errore SSH
- Nessun errore Python

---

## 5.3 Eseguire Comandi Remoti

### Modulo command

Esegue un comando senza passare dalla shell.

```bash
ansible all -m command -a "uptime"
```

Caratteristiche:

- Non interpreta pipe
- Non interpreta redirect
- Non interpreta variabili shell

È più sicuro rispetto a `shell`.

---

### Modulo shell

Usa la shell del sistema remoto.

```bash
ansible all -m shell -a "df -h | grep /dev/sda1"
```

Usare solo quando necessario.

Best practice: preferire sempre moduli nativi.

---

## 5.4 Gestione Pacchetti

Installare un pacchetto su gruppo web:

```bash
ansible web -m apt -a "name=nginx state=present update_cache=yes"
```

Rimuovere un pacchetto:

```bash
ansible web -m apt -a "name=nginx state=absent"
```

Versione generica (cross-distribution):

```bash
ansible all -m package -a "name=htop state=present"
```

---

## 5.5 Gestione Servizi

Avviare un servizio:

```bash
ansible web -m service -a "name=nginx state=started"
```

Riavviare:

```bash
ansible web -m service -a "name=nginx state=restarted"
```

Abilitare all’avvio:

```bash
ansible web -m service -a "name=nginx enabled=yes"
```

---

## 5.6 Gestione Utenti

Creare un utente:

```bash
ansible all -m user -a "name=deploy shell=/bin/bash groups=sudo append=yes"
```

Rimuovere un utente:

```bash
ansible all -m user -a "name=deploy state=absent remove=yes"
```

---

## 5.7 Copiare File

Copiare file locale su remoto:

```bash
ansible web -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt owner=root group=root mode=0644"
```

---

## 5.8 Uso di Privilege Escalation

Se necessario eseguire come root:

```bash
ansible all -m apt -a "name=vim state=present" --become
```

Se `become` è già abilitato in ansible.cfg, non serve specificarlo.

---

## 5.9 Limitare l’Esecuzione

Eseguire solo su un host specifico:

```bash
ansible web01 -m command -a "hostname"
```

Limitare tramite opzione `--limit`:

```bash
ansible all -m ping --limit web
```

---

## 5.10 Esecuzione Parallela e Fork

Ansible esegue operazioni in parallelo.

Numero default: 5 fork.

Modificabile:

```bash
ansible all -m ping -f 20
```

Oppure in ansible.cfg:

```
forks = 20
```

---

## 5.11 Output e Debug

Aumentare verbosità:

```bash
ansible all -m ping -vvv
```

Livelli disponibili:

- -v
- -vv
- -vvv
- -vvvv

Utile per troubleshooting SSH o problemi di autenticazione.

---

## 5.12 Quando Usare i Comandi Ad-Hoc

Utilizzare quando:

- Serve un controllo rapido
- È richiesta un’azione urgente
- Non è necessario mantenere traccia strutturata

Non utilizzare quando:

- L’operazione deve essere ripetibile
- Serve versionamento
- È una configurazione strutturale

In questi casi è corretto scrivere un playbook.

---

## Conclusione

I comandi ad-hoc sono uno strumento operativo quotidiano per il sysadmin.

Permettono interventi rapidi e controllati, ma non sostituiscono l’automazione strutturata.

Nel prossimo capitolo entreremo nel cuore di Ansible: i Playbook.