2013-06-19 12 views
51

Voglio correre Ansible in Python senza specificare il file di magazzino attraverso (ANSIBLE_HOST), ma semplicemente:Come eseguire Ansible senza specificare l'inventario ma direttamente l'host?

ansible.run.Runner(
    module_name='ping', 
    host='www.google.com' 
) 

posso effettivamente fare questo in tessuto facilmente, ma solo si chiedono come fare questo in Python. D'altra parte, la documentazione dell'API di Ansible per python non è veramente completa.

risposta

0

Questa non è una risposta completa, ma c'è qualche discussione su questo argomento in this discussion thread. Alla fine del primo post in quella discussione, viene fatto un suggerimento per creare uno script di bash wrapper per ansible-playbook, che è un po 'un hack ma fattibile.

Altre cose che ho preso in considerazione sono l'uso di 'ansible-pull' e la creazione di un plugin di inventario ansible. Sono anche interessato a trovare la risposta a questa domanda e continuerò ad aggiornare questa risposta man mano che trovo ulteriori informazioni.

112

Sorprendentemente, il trucco è quello di aggiungere un ,

# Host and IP address 
ansible all -i example.com, 
ansible all -i 93.184.216.119, 

o

# Requires 'hosts: all' in your playbook 
ansible-playbook -i example.com, playbook.yml 

Il parametro host precede la , può essere un nome host o un indirizzo/v6 IPv4.

+2

IPv6 funziona con Ansible> = 1.3. – trkoch

+0

In Ansible 1.9.1, quando chiami ansible-playbook rimuovi "all" dalla riga di comando, ma lascialo nel playbook.yml. Questa è la risposta giusta "ansible-playbook -i example.com, playbook.yml" – PinoSan

+0

Quindi, cosa dovrei impostare come "host" nel playbook in modo che funzioni con qualsiasi server? – azmeuk

6

Si può fare questo con:

hosts = ["webserver1","webserver2"] 

webInventory = ansible.inventory.Inventory(hosts) 

webPing = ansible.runner.Runner(
    pattern='webserver*', 
    module_name='ping', 
    inventory = webInventory 
).run() 

ciò che è nei padroni di casa diventa vostro inventario e si può cercare con pattern (o fare "tutto").

+0

sai come eseguire il modulo nel contesto local_action, ad esempio i moduli ec2 dovrebbero essere richiamati localhost again (127.0.0.1) e come local_action. grazie – kamiseq

+0

non importa, rispondo alla mia stessa domanda :-) runner = ansible.Runner ( module_name = "ec2_group", complex_args = {}, forchette = parallela, # private_key_file = "~/.ssh/office.pem", inventario = Inventario ([ "127.0.0.1"]), transport = "local" ) return runner.run() – kamiseq

1

Avevo anche bisogno di guidare il Ansible Python API, e preferisco passare gli host come argomenti piuttosto che mantenere un inventario. Ho usato un file temporaneo per aggirare il requisito del Ansible, che può essere utile per gli altri:

from tempfile import NamedTemporaryFile 

from ansible.inventory import Inventory 
from ansible.runner import Runner 

def load_temporary_inventory(content): 
    tmpfile = NamedTemporaryFile() 
    try: 
     tmpfile.write(content) 
     tmpfile.seek(0) 
     inventory = Inventory(tmpfile.name) 
    finally: 
     tmpfile.close() 
    return inventory 

def ping(hostname): 
    inventory = load_temporary_inventory(hostname) 
    runner = Runner(
     module_name='ping', 
     inventory=inventory, 
    ) 
    return runner.run() 
25

So che questa domanda è molto vecchio, ma penso che questo piccolo trucco potrebbe utile per i futuri utenti che hanno bisogno di aiuto per questo:

ansible-playbook -i '10.254.3.133,' site.yml 

se si esegue per host locale:

ansible-playbook -i 'localhost,' --connection=local site.yml 

il trucco è che dopo il nome indirizzo ip/dns, mettere la virgola all'interno delle citazioni e richiede 'hosts: all 'nel tuo libro di esercizi.

Spero che questo possa essere d'aiuto.

+5

Per quello che vale, le virgolette sono un no-op qui. Se usi ''localhost', o' localhost, ', in entrambi i casi' ansible-playbook' riceverà lo stesso argomento dalla shell. E ''localhost',' valuterà allo stesso modo (la chiave qui è che le virgolette sono interpretate dalla shell prima che passi gli argomenti al tuo comando). – larsks

+4

Questo funziona, ma perché nel nome della barba di Merlino è questo comportamento accettabile da parte di ansible ?! Come esattamente le persone si aspettano di sapere questo? Mi sono strappato i capelli cercando la soluzione. – ffledgling

Problemi correlati