110 votes

Comment exécuter Ansible sans spécifier l'inventaire mais l'hôte directement ?

Je veux exécuter Ansible en Python sans spécifier le fichier d'inventaire par (ANSIBLE_HOST) mais juste par :

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

En fait, je peux faire cela en tissu facilement mais je me demande comment le faire en Python. D'autre part, la documentation de l'API Ansible pour Python n'est pas vraiment complète.

224voto

trkoch Points 2368

De façon surprenante, l'astuce consiste à ajouter un fichier de type ,

# 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 de l'hôte qui précède le , peut être soit un nom d'hôte, soit une adresse IPv4/v6.

69voto

Arbab Nazar Points 10119

Je sais que cette question est très ancienne mais je pense que cette petite astuce pourrait être utile aux futurs utilisateurs qui ont besoin d'aide à ce sujet :

ansible-playbook -i 10.254.3.133, site.yml

si vous l'exécutez pour un hôte local :

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

L'astuce est la suivante : après l'adresse IP/le nom DNS, mettez la virgule entre les guillemets et exigez '. hosts: all dans votre manuel de jeu.

J'espère que cela vous aidera.

14voto

Donn Lee Points 1261

Dans mon cas, je ne voulais pas avoir hosts: all dans mon playbook, parce que ce serait mauvais si quelqu'un exécutait le playbook et oubliait d'inclure -i 10.254.3.133,

C'était ma solution (ansible 2.6) :

$ ansible-playbook myplaybook.yml -e "{target: 10.1.1.1}" -i 10.1.1.1, ...

Et ensuite, dans le livre de jeu :

- hosts: "{{ target }}"
  remote_user: donn
  vars_files:
    - myvars
  roles:
    - myrole

C'est un cas particulier lorsque j'ai besoin de provisionner un hôte et que je ne veux/nécessite pas l'ajouter à l'inventaire.

8voto

seumasmac Points 146

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()

Tout ce qui se trouve dans les hôtes devient votre inventaire et vous pouvez y faire une recherche par motif (ou faire "tout").

1voto

billwanjohi Points 74

J'avais aussi besoin de conduire le Ansible Python API et préfère passer les hôtes comme arguments plutôt que de tenir un inventaire. J'ai utilisé un fichier temporaire pour contourner l'exigence d'Ansible, ce qui peut être utile à d'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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X