Ich möchte Ansible in Python ausführen, ohne die Inventardatei durch (ANSIBLE_HOST) anzugeben, aber nur durch:
ansible.run.Runner(
module_name='ping',
host='www.google.com'
)
Ich kann das eigentlich leicht in Stoff machen, aber ich frage mich nur, wie ich das in Python machen soll. Andererseits ist die Dokumentation der Ansible-API für Python nicht wirklich vollständig.
Ich weiß, dass diese Frage wirklich alt ist, aber ich denke, dass dieser kleine Trick für zukünftige Benutzer hilfreich sein könnte, die Hilfe dafür benötigen:
ansible-playbook -i 10.254.3.133, site.yml
Wenn Sie für einen lokalen Host ausgeführt werden:
Der Trick ist, dass Sie nach der IP-Adresse / dem DNS-Namen das Komma in die Anführungszeichen setzen und '
hosts: all
' in Ihrem Playbook benötigen .Hoffe das wird helfen.
quelle
'localhost,'
oder verwendenlocalhost,
, erhalten Sie in beiden Fällenansible-playbook
das gleiche Argument von der Shell. Und'localhost',
würde genauso auswerten (der Schlüssel hier ist, dass Anführungszeichen von der Shell interpretiert werden, bevor sie die Argumente an Ihren Befehl weitergibt).hosts: all
wenn ich beabsichtige, es jeweils nur auf einem Host auszuführen. Ein Mitarbeiter kann das Playbook ohne ausführen-i
. Dies ist eine schöne Lösung, aber ich suche weiterhin nach etwas Sichererem. Immer noch auf der Suche ...Sie können dies tun mit:
hosts = ["webserver1","webserver2"] webInventory = ansible.inventory.Inventory(hosts) webPing = ansible.runner.Runner( pattern='webserver*', module_name='ping', inventory = webInventory ).run()
Was auch immer in Hosts ist, wird zu Ihrem Inventar und Sie können es mit Muster durchsuchen (oder "alle" tun).
quelle
In meinem Fall wollte ich nicht
hosts: all
in meinem Spielbuch haben, weil es schlecht wäre, wenn jemand das Spielbuch laufen lassen und vergessen würde, es aufzunehmen-i 10.254.3.133,
Dies 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.
quelle
Ich musste auch die Ansible Python-API steuern und würde lieber Hosts als Argumente übergeben, als ein Inventar zu führen. Ich habe eine temporäre Datei verwendet, um die Anforderungen von Ansible zu umgehen, die für andere hilfreich sein können:
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()
quelle
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 Ansible-Playbook zu erstellen, das ein bisschen hackig, aber praktikabel ist.
Andere Dinge, die ich in Betracht gezogen habe, sind die Verwendung von 'Ansible-Pull' und die Erstellung eines Ansible-Inventar-Plugins. Ich bin auch daran interessiert, die Antwort auf diese Frage zu finden, und ich werde diese Antwort weiter aktualisieren, sobald ich weitere Informationen finde.
quelle