2013-06-19 1 views
51

Je veux courir Ansible en Python sans spécifier le fichier d'inventaire à (ANSIBLE_HOST) mais juste par:Comment exécuter Ansible sans spécifier l'inventaire mais l'hôte directement?

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

Je peux réellement faire en tissu facilement, mais simplement se demander comment faire en Python. D'un autre côté, la documentation de l'API Ansible pour python n'est pas vraiment complète.

Répondre

0

Ce n'est pas une réponse complète, mais il y a une discussion de ce sujet dans this discussion thread. À la fin du premier message dans ce fil, une suggestion est faite pour créer un script bash wrapper pour ansible-playbook, ce qui est un peu un hack mais réalisable.

D'autres choses que j'ai envisagées sont l'utilisation de 'ansible-pull' et la création d'un plugin d'inventaire ansible. Je suis également intéressé à trouver la réponse à cette question, et je vais continuer à mettre à jour cette réponse que je trouve plus d'informations.

112

De manière surprenante, l'astuce consiste à ajouter un ,

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

ou

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

Le paramètre hôte précédant la , peut être soit un nom d'hôte ou une adresse IPv4/v6.

+2

IPv6 fonctionne avec Ansible> = 1.3. – trkoch

+0

Dans Ansible 1.9.1, lorsque vous appelez ansible-playbook, supprimez "all" de la ligne de commande mais laissez-le dans playbook.yml. C'est la bonne réponse "ansible-playbook -i example.com, playbook.yml" – PinoSan

+0

Ensuite, que dois-je définir comme "hôte" dans le playbook de sorte qu'il fonctionne avec n'importe quel serveur? – azmeuk

6

Vous pouvez le faire avec:

hosts = ["webserver1","webserver2"] 

webInventory = ansible.inventory.Inventory(hosts) 

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

Ce qui est dans votre inventaire devient hôtes et vous pouvez rechercher avec motif (ou faire « tout »).

+0

savez-vous comment exécuter le module dans le contexte local_action, par exemple les modules ec2 doivent être appelés par le biais de localhost (127.0.0.1) et sous le nom local_action. merci – kamiseq

+0

nevermind, je réponds à ma propre question :-) runner = ansible.Runner ( module_name = "ec2_group", complex_args = {}, fourches = paralel, # private_key_file = "~/.ssh/office.pem", inventaire = inventaire ([ "127.0.0.1"]), transport = "local" ) return runner.run() – kamiseq

1

Je devais également piloter le Ansible Python API, et je préférerais passer les hôtes comme arguments plutôt que de garder un inventaire. J'ai utilisé un fichier temporaire pour contourner l'exigence de Ansible, qui peut être utile pour les autres:

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

Je sais que cette question est vraiment vieux, mais pense que ce petit pourrait truc utile pour les futurs utilisateurs qui ont besoin d'aide pour cela:

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

si vous exécutez pour hôte local:

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

l'astuce est que après le nom adresse ip/dns, mettez la virgule dans les citations et exige 'hosts: all 'dans votre cahier des charges.

Espérons que cela aidera.

+5

Pour ce que ça vaut, les guillemets sont ici non-op. Si vous utilisez '' localhost '' ou 'localhost ', dans les deux cas' ansible-playbook' recevra le même argument du shell. Et ''host local '', évaluerait de la même manière (la clé ici est que les citations sont interprétées par le shell avant qu'il ne passe les arguments à votre commande). – larsks

+4

Cela fonctionne, mais pourquoi au nom de la barbe de Merlin est ce comportement acceptable de la part de l'ansible ?! Comment exactement les gens sont-ils censés le savoir? Je me suis arraché les cheveux à la recherche de cette correction. – ffledgling

Questions connexes