it-swarm.com.de

Führen Sie den Befehl auf dem Ansible-Host aus

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.

200
Ross

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.

298
Lorin Hochstein

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
61
Gordon Dickens

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: 

Betreibbares Spielbuch im localhost

26
mxf

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
10
c_agrawal

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" 
4
mvr

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.

0
Android Control

sie können auf diese Weise versuchen

0
omi
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
0
Deepak kumar