Come richiedere all’utente un host di destinazione in Ansible?

Voglio scrivere un playbook bootstrapper per nuove macchine in Ansible che riconfigurerà le impostazioni di rete. Al momento della prima esecuzione, le macchine di destinazione avranno un indirizzo assegnato da DHCP.

L’utente che deve eseguire il playbook conosce l’indirizzo IP assegnato di una nuova macchina. Vorrei chiedere all’utente il valore.

vars_prompt modulo vars_prompt consente di ottenere input dall’utente, tuttavia è definito nella sezione host che impedisce efficacemente l’indirizzo host come valore richiesto.

È ansible senza utilizzare uno script wrapper che modifica il file di inventario?

Il modo giusto per farlo è quello di creare un host dinamico con add_host e posizionarlo in un nuovo gruppo, quindi avviare una nuova riproduzione destinata a quel gruppo. In questo modo, se hai altre connessioni vars che devono essere impostate in anticipo (credenziali / chiavi / ecc.) Puoi impostarle su un gruppo vuoto nell’inventario, quindi aggiungere l’host dynamicmente. Per esempio:

 - hosts: localhost gather_facts: no vars_prompt: - name: target_host prompt: please enter the target host IP private: no tasks: - add_host: name: "{{ target_host }}" groups: dynamically_created_hosts - hosts: dynamically_created_hosts tasks: - debug: msg="do things on target host here" 

Potresti passarlo invece con extra-vars .

Basta rendere la sezione hosts una variabile come {{ hosts_prompt }} e quindi passare l’host sulla riga di comando in questo modo:

 ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10" 

O se stai usando il percorso predefinito del file di inventario di /etc/ansible/hosts puoi semplicemente usare:

 ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10" 

Aggiunta alla risposta di Matt per più host.

l’esempio di input sarebbe 192.0.2.10,192.0.2.11

 - hosts: localhost gather_facts: no vars_prompt: - name: target_host prompt: please enter the target host IP private: no tasks: - add_host: name: "{{ item }}" groups: dynamically_created_hosts with_items: "{{ target_host.split(',') }}" - hosts: dynamically_created_hosts tasks: - debug: msg="do things on target host here" 

Disclaimer: la risposta accettata offre la migliore soluzione al problema. Mentre questo funziona è basato su un hack e lo lascio come riferimento.

Ho scoperto che era ansible utilizzare un hack attualmente non documentato (credito a Bruce P per indicarmi il post) che trasforma il valore del parametro -i / --inventory in un elenco ad hoc di host ( riferimento ). Con solo l’hostname / indirizzo IP e uno spazio finale (come sotto) si riferisce a un singolo host senza che sia necessario il file di inventario.

Comando:

 ansible-playbook -i "192.168.1.21," playbook.yml 

Di conseguenza, playbook.yml può essere eseguito su tutti gli host (che nell’esempio precedente sarà uguale a un singolo host 192.168.1.21 ):

 - hosts: all 

L’elenco potrebbe contenere più di un indirizzo IP -i "192.168.1.21,192.168.1.22"