Non ho mai usato Ansible ma da alcune settimane cerco di capire cosa potrebbe essere Ansible buono in confronto agli scrips della shell - Il che dimostra, almeno nel mio caso, che le campagne pubblicitarie ossessionanti che gestiscono sono efficaci! Dopo molti tentativi falliti, il che dimostra come la loro documentazione non riesca a rispondere a una delle domande più ovvie, penso di aver finalmente capito:
Ora, guardiamo il video introduttivo e andiamo a caso come potenziale nuovo utente attraverso il materiale introduttivo su Ansible e confrontiamolo con ciò che un programmatore esperto di shell può produrre subito.
La mia conclusione è che oltre allo scripting della shell, Ansible offre essenzialmente 1. La possibilità di verificare che un sistema sia d'accordo con uno stato desiderato, 2. la capacità di integrarsi con Ansible Tower, che è un sistema a pagamento che sembra includere capacità di monitoraggio. In alcuni casi importanti, come quando si implementa il modello di server immutabile, il punto 1 probabilmente non è molto utile, quindi l'elenco è piuttosto sottile.
La mia conclusione è che i vantaggi offerti da Ansible rispetto allo shell-scripting, come presentato dalla documentazione, potrebbero essere sensati in alcuni casi ottimistici ben coperti dai moduli disponibili, ma sono piccoli o addirittura ipotetici nel caso generale. Per un abile programmatore di shell, probabilmente questi benefici sono probabilmente controbilanciati da altri aspetti del compromesso.
Ma questo forse dimostra solo quanto male sia il materiale introduttivo!
Il video di avvio rapido:
C'è un video di avvio rapido . Si inizia con una pagina in cui si afferma che ... beh, queste non sono realmente affermazioni, si tratta di elenchi puntati, un artefatto comunemente usato per sospendere il giudizio critico nelle presentazioni (poiché la logica non è mostrata, non può essere criticata!)
1. Ansible è semplice:
1.1 Automazione leggibile dall'uomo - Le specifiche sono documenti tecnici, come potrebbe
name: upgrade all packages
yum:
name: '*'
state: latest
essere più facile da leggere rispetto all'invocazione yum corrispondente trovata in uno script di shell? Inoltre, chiunque abbia avuto contatti con AppleScript muore ridendo quando legge “automazione leggibile dall'uomo”.
1.2 Non sono richieste competenze di codifica speciali - Che cos'è la codifica se non la scrittura di specifiche formali? Hanno condizionali, variabili, quindi, come non codifica? E perché avrei bisogno di qualcosa che non posso programmare, che d'ora in poi sarebbe inflessibile? L'affermazione è felicemente inaccurata!
1.3 Compiti eseguiti in ordine - Beh, forse alcuni appassionati di codegolf sono a conoscenza di linguaggi che eseguono compiti in disordine, ma l'esecuzione di compiti in ordine sembra quasi eccezionale.
1.4 Diventa produttivo rapidamente - I programmatori shell specializzati sono produttivi ora. Questa contro-argomentazione è seria tanto quanto l'argomento iniziale.
2. Ansible è potente
Un popolare trucco da venditore per vendere artefatti è ingannare le persone nel credere che acquisiranno il "potere" di questi artefatti. La storia della pubblicità di automobili o bevande isotoniche dovrebbe fornire un elenco convincente di esempi.
Qui Ansible può eseguire la “distribuzione di app” - ma sicuramente lo script di shell lo fa, “gestione della configurazione” ma questa è una semplice affermazione dello scopo dello strumento, non una funzionalità, e “orchestrazione del flusso di lavoro” che sembra un po 'pretenziosa ma nessun esempio va oltre ciò che GNU Parallel può fare.
3. Ansible è senza agente
Per popolare la colonna, hanno scritto in tre modi diversi che questo ha solo bisogno di ssh, che, come tutti sanno è un demone e non ha nulla a che fare con questi agenti che pervadono la gestione della configurazione mondiale!
Il resto del video
Il resto del video introduce inventari, che sono elenchi statici di risorse (come server) e mostra come distribuire Apache su tre server contemporaneamente. Questo in realtà non corrisponde al modo in cui lavoro, in cui le risorse sono altamente dinamiche e possono essere enumerate dagli strumenti della riga di comando forniti dal mio provider cloud e consumati dalle mie funzioni shell utilizzando l' |
operatore pipe . Inoltre, non distribuisco Apache su tre server contemporaneamente, piuttosto, costruisco un'immagine di istanza master che uso quindi per avviare 3 istanze che sono repliche esatte l'una dell'altra. Quindi la parte "orchestrante" dell'argomentazione non sembra molto pertinente.
Documentazione casuale fase 1: integrazione con EC2
EC2 è il servizio di elaborazione di Amazon, l'interazione con esso è supportata da alcuni moduli Ansible . (Vengono forniti anche altri noti provider di cloud computing):
# demo_setup.yml
- hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Provision a set of instances
ec2:
key_name: my_key
group: test
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: 5
count_tag:
Name: Demo
instance_tags:
Name: Demo
register: ec2
Lo script shell corrispondente sarebbe essenzialmente identico a YAML sostituito da JSON:
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --image-id …
}
o la versione JSON
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --cli-input-json "$(provision_a_set_of_instances__json)"
}
provision_a_set_of_instances__json()
{
cat <<EOF
{
"ImageId": …
}
EOF
}
Entrambe le versioni sono essenzialmente identiche, la maggior parte del payload è l'enumerazione dei valori di inizializzazione in strutture YAML o JSON.
Documentazione casuale fase 2: consegna continua e aggiornamenti continui
La maggior parte di questa guida non mostra alcuna caratteristica davvero interessante: introduce variabili (IIRC, anche gli script di shell hanno variabili)! E un modulo Ansible gestisce mysql, quindi se invece di cercare “come faccio a creare un utente mysql con privilegi su XY "e termina con qualcosa di simile
# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF
cerchi "come faccio a creare un utente mysql con privilegi su XY in ansible " e finisci con
- name: Create Application DB User
mysql_user: name={{ dbuser }} password={{ upassword }}
priv=*.*:ALL host='%' state=present
La differenza probabilmente non è ancora molto significativa. In quella pagina scopriamo anche che Ansible ha un linguaggio di meta-programmazione modello
{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}
Quando vedo questo, mi capita di trovarmi davvero nella mia zona di comfort. Questo tipo di semplice meta-programmazione per linguaggi dichiarativi è esattamente lo stesso paradigma teorico dei Makefile BSD! Che mi è capitato di aver programmato ampiamente Questo estratto ci mostra che la promessa di lavorare con il file YAML è rotta (quindi non posso far funzionare i miei playbook attraverso un parser YAML, ad es .). Ci mostra anche che Ansible deve discutere l'arte sottile dell'ordine di valutazione: dobbiamo decidere se le variabili sono espanse nella "parte dichiarativa" della lingua o nella meta-parte "imperativa" della lingua. Qui la programmazione della shell è più semplice, non esiste una meta-programmazione, a parte l' approvvigionamento esplicito eval
o di script esterni. L'ipotetico estratto di shell equivalente sarebbe
enumerate_group 'monitoring' | {
while read host; do
…
done
}
la cui complessità rispetto alla variante Ansible è probabilmente tollerabile: usa solo i semplici, regolari, noiosi costrutti del linguaggio.
Documentazione casuale fase 3: strategie di test
Infine, incontriamo quella che risulta essere la prima caratteristica davvero interessante di Ansible: “Le risorse Ansible sono modelli di stato desiderato. Pertanto, non dovrebbe essere necessario testare l'avvio dei servizi, l'installazione dei pacchetti o altre cose del genere. Ansible è il sistema che garantirà che queste cose siano dichiaratamente vere. Invece, asserisci queste cose nei tuoi playbook. ”Ora inizia a essere un po 'interessante, ma:
A parte una manciata di situazioni standard prontamente implementate dai moduli disponibili, dovrò alimentare da solo i bit che implementano il test, che probabilmente implicherà alcuni comandi di shell.
Il controllo della conformità delle installazioni potrebbe non essere molto rilevante nel contesto in cui è implementato il modello di server immutabile: in cui tutti i sistemi in esecuzione sono generalmente generati da un'immagine principale (immagine di istanza o immagine docker per esempio) e mai aggiornati - sono sostituiti da nuovo invece.
Preoccupazione non risolta: la manutenibilità
Il materiale introduttivo di Ansible ignora la questione della manutenibilità. Con praticamente nessun sistema di tipi, lo shell-scripting ha la facilità di manutenibilità di JavaScript, Lisp o Python: i refactoring estesi possono essere raggiunti con successo solo con l'aiuto di una vasta suite di test automatizzati - o almeno progetti che consentono facili test interattivi. Detto questo, mentre lo script di shell è la lingua franca dalla configurazione e manutenzione del sistema, quasi ogni linguaggio di programmazione ha un'interfaccia con la shell. È quindi assolutamente possibile sfruttare il vantaggio di manutenibilità dei linguaggi avanzati, usandoli per incollare insieme i vari bit di bit di configurazione della shell. Per OCaml, ho scritto Rashell ciò fornisce essenzialmente una mano di schemi di interazione comuni per i sottoprocessi, il che rende sostanzialmente banale la traduzione degli script di configurazione in OCaml.
A parte Ansible, la struttura molto debole dei playbook e la presenza di una funzionalità di meta-programmazione rendono la situazione essenzialmente grave come lo è per gli script di shell, con i punti negativi che non è ovvio come scrivere test unitari per Ansible e l'argomento dell'introduzione ad hoc di un linguaggio di livello superiore non può essere imitato.
Idempotenza delle fasi di configurazione
La documentazione di Ansible attira l'attenzione sulla necessità di scrivere passaggi di configurazione idempotenti. Più precisamente, i passaggi di configurazione devono essere scritti in modo tale che la sequenza di passaggi aba possa essere semplificata in ab , ovvero non è necessario ripetere il passaggio di configurazione. Questa è una condizione più forte dell'idempotenza. Poiché Ansible consente ai playbook di utilizzare comandi shell arbitrari, Ansible stesso non è in grado di garantire il rispetto di questa condizione più forte. Questo si basa solo sulla disciplina del programmatore.