2015-10-19 6 views
38

Questo è un frammento di un playbook che sto usando (server.yml):Override ospita variabile Ansible playbook dalla riga di comando

- name: Determine Remote User 
    hosts: web 
    gather_facts: false 
    roles: 
    - { role: remote-user, tags: [remote-user, always] } 

mio file hosts ha diversi gruppi di server, per esempio

[web] 
x.x.x.x 

[droplets] 
x.x.x.x 

Ora voglio eseguire ansible-playbook -i hosts/<env> server.yml e sovrascrivere hosts: web da server.yml per eseguire questo playbook per [droplets].

Posso eseguire l'override come una volta, senza modificare direttamente server.yml?

Grazie.

risposta

50

non credo Ansible fornisce questa funzionalità, che dovrebbe. Qui c'è qualcosa che si può fare:

hosts: "{{ variable_host | default('web') }}"

e si può passare variable_host sia da linea di comando o da un file Vars, ad esempio:

ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)" 
+2

È necessaria una piccola correzione. Dovrebbe essere 'hosts:" {{variable_host | default ('web')}} "' – SPM

+0

oh sì, mio ​​male. Grazie per avermelo indicato :) – wallydrag

+10

Ecco una nota che ritengo possa completare la risposta per i principianti inesperti alla ricerca di questa soluzione: Esempio: 'ansible-playbook server.yml --extra-vars" variable_host = newtarget (s) "' – Frobbit

2

Se si desidera eseguire un'attività associata a un host, ma su un host diverso, è necessario provare delegate_to.

Nel tuo caso, si dovrebbe delegare alla tua localhost (master ansible) e chiamando ansible-playbook comando

25

Per chi potrebbe venire in cerca di una soluzione .
Giocare Libro

- hosts: '{{ host }}' 
    tasks: 
    - debug: msg="Host is {{ ansible_fqdn }}" 

inventario

[web] 
x.x.x.x 

[droplets] 
x.x.x.x 

Comando:ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets" Quindi è possibile specificare il nome del gruppo nel extra-vars

+0

Cordiali saluti, questa dovrebbe essere la risposta corretta. – OzNetNerd

4

Questo è un po 'tardi , ma penso che potresti usare lo --limit or -l comando per limitare il pattern a host più specifici. (Versione 2.3.2.0)

Si potrebbe avere - hosts: all (or group) tasks: - some_task

e poi ansible-playbook playbook.yml -l some_more_strict_host_or_pattern e utilizzare il flag --list-hosts per vedere su che ospita questa configurazione sarebbe applicato.

+2

Sono molto nuovo ad ansible ma considero questa una soluzione molto efficace, molto più compatta rispetto alle altre. Perché è stato downvoted? –

+1

Questo è pericoloso. Nel caso in cui ci si dimentichi di 'limite' la lista degli host interessati dal playbook potrebbe causare molti danni. –

+0

Trovo che usando '--extra-vars" variable_host = newtarget (s) "' proprio come la soluzione accettata è una soluzione pericolosa e più complicata. Utilizza un host predefinito di 'web' che potrebbe essere applicato anche qui invece di' all'. È possibile utilizzare un gruppo di host rigido come predefinito per evitare di commettere errori e utilizzare il flag '--list-hosts' per avere una chiara comprensione di quali host si stanno influenzando. –