it-swarm.com.de

Wie führe ich Ansible aus, ohne das Inventar, sondern den Host direkt anzugeben?

Ich möchte Ansible in Python ausführen, ohne die Inventardatei durch (ANSIBLE_Host) anzugeben, sondern nur durch:

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

Ich kann das in Stoff einfach tun, frage mich aber einfach, wie man das in Python macht. Auf der anderen Seite ist die Dokumentation der Ansible-API für Python nicht wirklich vollständig.

59
Ngoc Tran

Überraschenderweise besteht der Trick darin, einen , anzufügen.

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

oder

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

Der Hostparameter vor dem , kann entweder ein Hostname oder eine IPv4/v6-Adresse sein.

132
trkoch

Ich weiß, dass diese Frage wirklich alt ist, denke aber, dass dieser kleine Trick für zukünftige Benutzer hilfreich sein könnte, die Hilfe benötigen:

ansible-playbook -i 10.254.3.133, site.yml

wenn Sie für den lokalen Host laufen:

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

Der Trick ist, dass nach IP-Adresse/DNS-Namen das Komma in die Anführungszeichen gesetzt wird und "hosts: all" in Ihrem Playbook benötigt wird.

Hoffe das wird helfen. 

29
Arbab Nazar

Sie können dies mit:

hosts = ["webserver1","webserver2"]

webInventory = ansible.inventory.Inventory(hosts)

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

Was in Hosts enthalten ist, wird zu Ihrem Inventar und Sie können es mit pattern suchen (oder "all" tun).

6
seumasmac

Ich musste auch die Ansible Python API betreiben und würde Hosts eher als Argumente übergeben, als ein Inventar zu führen. Ich habe eine temporäre Datei verwendet, um die Anforderungen von Ansible zu umgehen, was für andere hilfreich sein kann:

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

In meinem Fall wollte ich hosts: all nicht in meinem Playbook haben, da es schlecht wäre, wenn jemand das Playbook ausgeführt und vergessen hätte, -i 10.254.3.133, einzuschließen.

Das war meine Lösung (Ansible 2.6):

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

Und dann im Spielbuch:

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

Dies ist ein spezieller Anwendungsfall, wenn ich einen Host bereitstellen muss und ihn nicht zum Inventar hinzufügen möchte/muss.

0
Donn Lee

Dies ist keine vollständige Antwort, aber es gibt einige Diskussionen zu diesem Thema in diesem Diskussionsthread . Am Ende des ersten Beitrags in diesem Thread wird vorgeschlagen, ein Wrapper-Bash-Skript für das Ansible-Playbook zu erstellen, das zwar ein bisschen hackt, aber machbar ist.

Andere Dinge, die ich in Betracht gezogen habe, sind die Verwendung von 'Ansible-Pull' und die Erstellung eines Inventory-Plug-Ins. Ich bin auch daran interessiert, die Antwort auf diese Frage zu finden. Ich werde diese Antwort ständig aktualisieren, wenn ich weitere Informationen finde.

0
bnsmith

Es scheint keinen direkten Weg zu geben, ein Muster zu geben. Dies ist mein Hack, um es zu lösen.

echo fldn[3789:3799].mysite.com >test; ansible all -i test -m ping
0
Abhijith