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


247

Ist es möglich, Befehle auf dem Ansible-Host auszuführen?

Mein Szenario ist, dass ich einen Checkout von einem Git-Server durchführen möchte, der intern gehostet wird (und außerhalb der Firewall des Unternehmens nicht zugänglich ist). Dann möchte ich die Kasse (tarballed) auf den Produktionsserver (extern gehostet) hochladen.

Im Moment möchte ich ein Skript ausführen, das das Auschecken ausführt, es tarballt und dann das Bereitstellungsskript ausführt. Wenn ich dies jedoch in Ansible integrieren könnte, wäre dies vorzuziehen.

Antworten:


347

Ja, Sie können Befehle auf dem Ansible-Host ausführen. Sie können festlegen, dass alle Aufgaben in einem Spiel auf dem Ansible-Host ausgeführt werden, oder Sie können einzelne Aufgaben markieren, die auf dem Ansible-Host ausgeführt werden sollen.

Wenn Sie möchten , ein ganzes Spiel auf dem ansible Host laufen, dann angeben hosts: 127.0.0.1und connection:localim Spiel, zum 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 Lokale Playbooks in der Ansible-Dokumentation.

Wenn Sie nur eine einzelne Aufgabe auf Ihrem Ansible-Host ausführen möchten, können Sie local_actionfestlegen, dass eine Aufgabe lokal ausgeführt werden soll. Beispielsweise:

- 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 Delegierung in der Ansible-Dokumentation.

Bearbeiten: Sie können vermeiden, dass Sie connection: localIhr Spiel eingeben müssen, indem Sie dies Ihrem Inventar hinzufügen:

localhost ansible_connection=local

(Hier würden Sie "localhost" anstelle von "127.0.0.1" verwenden, 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.


8
Ich brauchte auch sudo: noim Delegationsszenario
Danimal

Wie führe ich eine lokale Verbindung als Root-Benutzer aus?
Bilal Usean

@BilalUsean ansible-playbook -K playbook.ymlwo -K für Wurzel
Kush

74

Ich habe ein paar andere Möglichkeiten gefunden, wie Sie diese schreiben können, die meiner Meinung nach etwas besser lesbar sind.

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

ODER

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

3
Interessant, wie würde das mit Befehl funktionieren ? Denn soweit ich weiß, können wir den Parameter free_form nicht verwenden , um den Befehl zu definieren, der ausgeführt werden soll
Ander

@Ander Gleiches gilt für das shellModul.
Ceving

6
Für die Verwendung mit Befehl / Shell möchten Sie die "_raw_params"
mvr

41

Ich möchte mitteilen, dass Ansible über die 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 zum praktischen Erlernen von Ansible hilfreich sein.

Das Beispiel für Code stammt aus diesem guten Artikel:

Ausführen eines Ansible-Playbooks in localhost


2
Welche Bedeutung hat Komma (,) nach localhost? Ich bemerkte, dass es wichtig ist, dass das Kommando funktioniert
Tuomas Toivonen

2
Das nachfolgende Komma definiert ein einfaches Inventar, das auf eine Datei verweist. Es ist eine Art undokumentierter Hack und könnte verschwinden (iirc).
Senorsmile

19

Sie können delegate_toBefehle auf Ihrem Ansible-Host (Admin-Host) ausführen, von dem aus Sie Ihr Ansible-Spiel ausführen. Beispielsweise:

Löschen Sie eine Datei, wenn sie bereits auf dem 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

1
Dies scheint die sauberste Lösung aller bisherigen Antworten zu sein.
Küken

1
Zustimmen. Am wenigsten neue Syntax, am flexibelsten (auch anderswo delegieren). Ein zu beachtender Punkt: Wenn dies becomefür die Aufgabe zutrifft, wird es sich über Sudo und dergleichen beschweren. Dies kann direkt bei der Aufgabe geschehen oder an anderer Stelle vererbt werden.
JL Peyret

4

Um die Antwort von @gordon zu erweitern, hier ein Beispiel für lesbare Syntax und Argumentübergabe mit dem Shell- / Befehlsmodul (diese unterscheiden sich vom Git-Modul darin, dass erforderliche, aber frei formulierte Argumente vorhanden sind, wie von @ander angegeben).

- Name: "Release Tarball wird generiert"
  local_action:
    Modul: Shell
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir: "Dateien / Klone / Webhooks"

2

Aus der Ansible- Dokumentation :

Delegierung Dies ist eigentlich kein rollendes Update-spezifisches Ereignis, tritt jedoch in diesen Fällen häufig auf.

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 für die Steuerung von Ausfallfenstern. Beachten Sie, dass es nicht sinnvoll ist, alle Aufgaben zu delegieren, zu debuggen, add_host, include usw. immer auf dem Controller auszuführen. Es ist auch eine gute Idee, dies mit dem Schlüsselwort 'serial' zu verwenden, um die Anzahl der gleichzeitig ausgeführten Hosts zu steuern:

---

- 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 auf 127.0.0.1 ausgeführt, dem Computer, auf dem Ansible ausgeführt wird. Es gibt auch eine Kurzsyntax, die Sie pro Aufgabe verwenden können: 'local_action'. Hier ist das gleiche Playbook wie oben, jedoch mit der Kurzsyntax für die Delegierung 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 gängiges Muster besteht darin, mit einer lokalen Aktion 'rsync' aufzurufen, 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 SSH-Schlüssel ohne Passphrase oder einen SSH-Agenten haben müssen, damit dies funktioniert. Andernfalls muss rsync nach einer Passphrase fragen.


0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

Das Standardmodul ist das Befehlsmodul, daher commandist kein Schlüsselwort erforderlich.

Wenn Sie einen Befehl mit erhöhten Berechtigungen ausgeben müssen, verwenden Sie ihn -bam Ende desselben Befehls.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.