Ist es möglich, Befehle auf dem Ansible-Host auszuführen?
Mein Szenario ist, dass ich einen Checkout von einem git-Server nehmen möchte, der intern gehostet wird (und außerhalb der Firewall des Unternehmens nicht erreichbar ist). Dann möchte ich die Kaufabwicklung auf den Produktionsserver hochladen (extern gehostet).
Im Moment schaue ich mir an, ein Skript auszuführen, das die Kasse ausführt, das Archiv erstellt und dann das Bereitstellungsskript ausführt - aber wenn ich es in Ansible integrieren könnte, wäre das vorzuziehen.
Ja, Sie können auf dem Ansible Host Befehle ausführen. Sie können festlegen, dass alle Tasks in einem Spiel auf dem Ansible Host ausgeführt werden, oder Sie können einzelne Tasks für die Ausführung auf dem Ansible Host markieren.
Wenn Sie ein gesamtes Spiel auf dem Ansible Host ausführen möchten, geben Sie im Spiel hosts: 127.0.0.1
und connection:local
an. Beispiel:
- name: a play that runs entirely on the ansible Host
hosts: 127.0.0.1
connection: local
tasks:
- name: check out a git repository
git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path
Weitere Informationen finden Sie unter Local Playbooks in der Ansible-Dokumentation.
Wenn Sie nur eine einzelne Task auf Ihrem Ansible Host ausführen möchten, können Sie mit local_action
angeben, dass eine Task lokal ausgeführt werden soll. Zum Beispiel:
- name: an example playbook
hosts: webservers
tasks:
- ...
- name: check out a git repository
local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path
Weitere Informationen finden Sie unter Delegation in der Ansible-Dokumentation.
Bearbeiten: Sie können es vermeiden, in Ihrem Spiel connection: local
eingeben zu müssen, indem Sie dies Ihrem Inventar hinzufügen:
localhost ansible_connection=local
(Hier verwenden Sie "localhost" anstelle von "127.0.0.1", um auf das Spiel zu verweisen).
Bearbeiten: In neueren Versionen von ansible müssen Sie die obige Zeile nicht mehr zu Ihrem Inventar hinzufügen. Ansible geht davon aus, dass sie bereits vorhanden ist.
Ich habe ein paar andere Möglichkeiten gefunden, wie Sie diese schreiben können, die IMHO etwas lesbarer sind.
- name: check out a git repository
local_action:
module: git
repo: git://foosball.example.org/path/to/repo.git
dest: /local/path
OR
- name: check out a git repository
local_action: git
args:
repo: git://foosball.example.org/path/to/repo.git
dest: /local/path
Ich möchte mitteilen, dass Ansible via Shell auf localhost ausgeführt werden kann:
ansible all -i "localhost," -c local -m Shell -a 'echo hello world'
Dies kann für einfache Aufgaben oder für das praktische Lernen von Ansible hilfreich sein.
Das Codebeispiel stammt aus diesem guten Artikel:
Sie können delegate_to
verwenden, um Befehle auf Ihrem Ansible-Host (Admin-Host) auszuführen, von wo Sie Ihr Ansible-Spiel ausführen. Zum Beispiel:
Löschen Sie eine Datei, wenn sie bereits auf Ansible Host vorhanden ist:
- name: Remove file if already exists
file:
path: /tmp/logfile.log
state: absent
mode: "u+rw,g-wx,o-rwx"
delegate_to: 127.0.0.1
Erstellen Sie eine neue Datei auf dem Ansible Host:
- name: Create log file
file:
path: /tmp/logfile.log
state: touch
mode: "u+rw,g-wx,o-rwx"
delegate_to: 127.0.0.1
Wenn Sie die Antwort von @gordon erweitern, finden Sie hier ein Beispiel für eine lesbare Syntax und Argumentübergabe mit Shell/Command-Modul (diese unterscheiden sich vom git-Modul darin, dass es Argumente gibt, die frei sind, wie von @ander angegeben)
- name: "Release-Archiv wird generiert" local_action: Modul: Shell _raw_params: git archive - format Zip - Ausgabeversion.Zip HEAD chdir: "files/clones/webhooks"
Aus der Ansible Dokumentation :
Delegation Dies ist nicht wirklich ein Update, sondern wird in solchen Fällen häufig angezeigt.
Wenn Sie eine Aufgabe auf einem Host mit Bezug auf andere Hosts ausführen möchten, verwenden Sie das Schlüsselwort "delegate_to" für eine Aufgabe. Dies ist ideal, um Knoten in einem Pool mit Lastenausgleich zu platzieren oder zu entfernen. Es ist auch sehr nützlich, um Ausfallfenster zu steuern. Beachten Sie, dass es nicht sinnvoll ist, alle Aufgaben zu delegieren, debug, add_Host, include usw. immer auf dem Controller ausgeführt zu werden. Die Verwendung des Schlüsselworts "Serial" zur Steuerung der Anzahl der Hosts, die gleichzeitig ausgeführt werden, ist ebenfalls eine gute Idee:
---
- hosts: webservers
serial: 5
tasks:
- name: take out of load balancer pool
command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
delegate_to: 127.0.0.1
- name: actual steps would go here
yum:
name: acme-web-stack
state: latest
- name: add back to load balancer pool
command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
delegate_to: 127.0.0.1
Diese Befehle werden unter 127.0.0.1 ausgeführt. Dies ist der Computer, auf dem Ansible ausgeführt wird. Es gibt auch eine Abkürzungssyntax, die Sie pro Task verwenden können: 'local_action'. Hier ist dasselbe Spielbuch wie oben, jedoch unter Verwendung der Abkürzungssyntax zum Delegieren an 127.0.0.1:
---
# ...
tasks:
- name: take out of load balancer pool
local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}
# ...
- name: add back to load balancer pool
local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}
Ein übliches Muster ist die Verwendung einer lokalen Aktion zum Aufrufen von "rsync", um Dateien rekursiv auf die verwalteten Server zu kopieren. Hier ist ein Beispiel:
---
# ...
tasks:
- name: recursively copy files from management server to target
local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/
Beachten Sie, dass Sie SSP-Schlüssel ohne Passphrase oder einen ssh-agent konfiguriert haben müssen, damit dies funktioniert, andernfalls muss rsync nach einer Passphrase fragen.
sie können auf diese Weise versuchen
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"
Das Standardmodul ist das Befehlsmodul. Daher ist das Schlüsselwort command
nicht erforderlich.
Wenn Sie einen Befehl mit erhöhten Rechten ausgeben müssen, verwenden Sie am Ende desselben Befehls -b
.
ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b