Ansible Shell-Modul

AnsibleAnsibleBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab erfahren Sie, wie Sie das Ansible Shell-Modul verwenden können, um Shell-Befehle auf Remote-Hosts auszuführen. Das Shell-Modul ist nützlich, wenn Sie Shell-Befehle ausführen müssen, die von den vorhandenen Ansible-Modulen nicht abgedeckt werden, oder wenn Sie mehr Flexibilität und Kontrolle über die Ausführung benötigen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible(("Ansible")) -.-> ansible/PlaybookEssentialsGroup(["Playbook Essentials"]) ansible/ModuleOperationsGroup -.-> ansible/command("Execute Commands") ansible/ModuleOperationsGroup -.-> ansible/debug("Test Output") ansible/ModuleOperationsGroup -.-> ansible/shell("Execute Shell Commands") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("Execute Playbook") subgraph Lab Skills ansible/command -.-> lab-289409{{"Ansible Shell-Modul"}} ansible/debug -.-> lab-289409{{"Ansible Shell-Modul"}} ansible/shell -.-> lab-289409{{"Ansible Shell-Modul"}} ansible/playbook -.-> lab-289409{{"Ansible Shell-Modul"}} end

Ausführen eines einfachen Shell-Befehls

In diesem Schritt führen Sie einen einfachen Shell-Befehl auf einem Remote-Host mithilfe des Ansible Shell-Moduls aus.

Zunächst vervollständigen Sie die Datei /home/labex/project/simple_shell_command.yml.
Fügen Sie den folgenden Inhalt zur Playbook-Datei hinzu:

- name: Execute a Simple Shell Command
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Execute ls -l command
      shell: ls -l
      register: command_output

    - name: Display command output
      debug:
        var: command_output.stdout_lines
  • hosts: localhost: Der Zielhost für die Ausführung dieses Ansible-Playbooks ist localhost.
  • gather_facts: false: Deaktiviert das Sammeln von Host-Informationen.
  • shell: ls -l: Gibt den auszuführenden Befehl an.

Zusammenfassend ist der Zweck dieses Playbooks, den Befehl ls -l auf dem lokalen Host auszuführen und die Ausgabe des Befehls anzuzeigen.

Anschließend zeigen Sie die Ausgabe des Befehls im Ansible-Playbook an.

ansible-playbook /home/labex/project/simple_shell_command.yml

Beispielausgabe:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Execute a Simple Shell Command] ******************************************

TASK [Execute ls -l command] ***************************************************
changed: [localhost]

TASK [Display command output] **************************************************
ok: [localhost] => {
    "command_output.stdout_lines": [
        "total 16",
        "-rwxrwxrwx 1 labex root 285 Mar  8 13:33 complex_shell_commands.yml",
        "-rwxrwxrwx 1 labex root 221 Mar  8 13:33 handle_command_failure.yml",
        "-rwxrwxrwx 1 labex root 222 Mar  8 13:33 pass_variables.yml",
        "-rwxrwxrwx 1 labex root 266 Mar  8 13:36 simple_shell_command.yml"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Hier ist "command_output.stdout_lines":[...] die Ausgabe von ls -l auf dem Zielhost.

Übergeben von Variablen an Shell-Befehle

In diesem Schritt erfahren Sie, wie Sie Variablen aus Ihrem Ansible-Playbook an Shell-Befehle übergeben können, die mit dem Shell-Modul ausgeführt werden.

Zunächst vervollständigen Sie die Datei /home/labex/project/pass_variables.yml.
Fügen Sie den folgenden Inhalt zur Playbook-Datei hinzu:

- name: Pass Variables to Shell Commands
  hosts: localhost
  gather_facts: false
  vars:
    directory_path: /home/labex

  tasks:
    - name: Execute ls command with a variable
      shell: ls "{{ directory_path }}"
      register: variable_command_output

    - name: Display variable command output
      debug:
        var: variable_command_output.stdout_lines
  • hosts: localhost: Der Zielhost für die Ausführung dieses Ansible-Playbooks ist localhost.
  • vars: Definiert eine Variable namens directory_path mit dem Wert /home/labex.
  • shell: ls "{{ directory_path }}": Führt den ls-Befehl aus, um den Inhalt des Verzeichnisses auszugeben, das durch die Variable directory_path repräsentiert wird.

Zusammenfassend führt dieses Playbook den ls-Befehl mit einer Variable aus, die einen Verzeichnispfad (/home/labex) auf dem lokalen Host darstellt, und zeigt die Ausgabe des Befehls an.

Anschließend zeigen Sie die Ausgabe des Befehls im Ansible-Playbook an.

ansible-playbook /home/labex/project/pass_variables.yml

Beispielausgabe:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Pass Variables to Shell Commands] ****************************************

TASK [Execute ls command with a variable] **************************************
changed: [localhost]

TASK [Display variable command output] *****************************************
ok: [localhost] => {
    "variable_command_output.stdout_lines": [
        "Code",
        "Desktop",
        "golang",
        "project"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Hier ist "variable_command_output.stdout_lines": [...] die Ausgabe von ls /home/labex auf dem Zielhost.

Umgang mit Befehlsfehlern

In diesem Schritt erfahren Sie, wie Sie Befehlsfehler behandeln können, wenn Sie Shell-Befehle mit dem Shell-Modul ausführen. Sie werden Fälle behandeln, in denen der Shell-Befehl einen Nicht-Null-Abfahrtsstatus zurückgibt, was auf einen Fehler hinweist.

Zunächst vervollständigen Sie die Datei /home/labex/project/handle_command_failure.yml.
Fügen Sie den folgenden Inhalt zur Playbook-Datei hinzu:

- name: Handle Command Failure
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Execute a failing command
      shell: failing-command
      register: failing_command_output
      ignore_errors: yes

    - name: Handle command failure
      debug:
        msg: "The command failed. Performing fallback action."
      when: failing_command_output.failed
  • hosts: localhost: Der Zielhost für die Ausführung dieses Ansible-Playbooks ist localhost.
  • shell: failing-command: Diese Zeile verwendet das Shell-Modul, um den Befehl failing-command auszuführen. Die Ausgabe dieses Befehls wird erfasst und in der Variable failing_command_output gespeichert. Da das Skript failing-command nicht existiert, muss dieser Befehl fehlschlagen.
  • ignore_errors: yes: Diese Zeile weist Ansible an, alle Fehler zu ignorieren, die während der Ausführung des failing-command auftreten. Dadurch kann das Playbook auch dann fortgesetzt werden, wenn der Befehl fehlschlägt.
  • debug: Dieses Modul verwendet das Debug-Modul, um eine Nachricht anzuzeigen, die lautet: "The command failed. Performing fallback action." Diese Nachricht wird nur angezeigt, wenn die Bedingung failing_command_output.failed erfüllt ist, was darauf hinweist, dass die vorherige Befehlsausführung fehlgeschlagen ist.

Zusammenfassend versucht das Playbook, einen Befehl auszuführen, der fehlschlagen soll, ignoriert alle Fehler, die während seiner Ausführung auftreten, und zeigt dann eine Nachricht an, die darauf hinweist, dass der Befehl fehlgeschlagen ist und eine Fallback-Aktion basierend auf dem Fehlschlagsstatus des Befehls ausgeführt wird.

Anschließend zeigen Sie die Ausgabe des Befehls im Ansible-Playbook an.

ansible-playbook /home/labex/project/handle_command_failure.yml

Beispielausgabe:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Handle Command Failure] **************************************************

TASK [Execute a failing command] ***********************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "failing-command", "delta": "0:00:00.009169", "end": "2024-03-08 13:46:22.701946", "msg": "non-zero return code", "rc": 127, "start": "2024-03-08 13:46:22.692777", "stderr": "/bin/sh: line 1: failing-command: command not found", "stderr_lines": ["/bin/sh: line 1: failing-command: command not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Handle command failure] **************************************************
ok: [localhost] => {
    "msg": "The command failed. Performing fallback action."
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

Das Vorhandensein von "msg": "The command failed. Performing fallback action." zeigt an, dass die Ausführung des failing-command-Befehls fehlgeschlagen ist.

Ausführen komplexer Shell-Befehle

In diesem Schritt führen Sie komplexere Shell-Befehle mithilfe des Shell-Moduls aus. Sie werden die Verwendung von Befehlsumleitungen, Pipelines und komplexen Befehlsstrukturen untersuchen.

Zunächst vervollständigen Sie die Datei /home/labex/project/complex_shell_commands.yml.
Fügen Sie den folgenden Inhalt zur Playbook-Datei hinzu:

- name: Execute Complex Shell Commands
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Execute complex command
      shell: ls -l /home/labex | grep 'project' > /home/labex/output.txt
      register: complex_command_output

    - name: Display complex command output
      debug:
        var: complex_command_output.stdout_lines
  • hosts: localhost: Der Zielhost für die Ausführung dieses Ansible-Playbooks ist localhost.
  • shell: Leitet die Ausgabe von ls -l /home/labex in die Datei /home/labex/output.txt um und verwendet grep, um den Inhalt über project zu filtern.

Zusammenfassend führt dieses Playbook einen komplexen Shell-Befehl auf dem lokalen Host aus, filtert die Ausgabe und leitet sie in eine Datei um, und zeigt dann die Ausgabe der Befehlsausführung an.

Führen Sie dann den Ansible-Playbook-Befehl aus.

ansible-playbook /home/labex/project/complex_shell_commands.yml

Beispielausgabe:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Execute Complex Shell Commands] ******************************************

TASK [Execute complex command] *************************************************
changed: [localhost]

TASK [Display complex command output] ******************************************
ok: [localhost] => {
    "complex_command_output.stdout_lines": []
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Schließlich zeigen Sie den Inhalt der Datei /home/labex/output.txt an:

cat /home/labex/output.txt

Beispielausgabe:

drwxr-xr-x 1 labex labex 4096 Mar 8 13:49 project

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab zum Ansible Shell-Modul erfolgreich abgeschlossen. Sie haben gelernt, wie Sie das Shell-Modul verwenden können, um Shell-Befehle auf Remote-Hosts auszuführen, Variablen an Befehle zu übergeben, Befehlsfehler zu behandeln und komplexe Shell-Befehle auszuführen.

Das Shell-Modul bietet große Flexibilität und Kontrolle bei der Ausführung von Shell-Befehlen in Ihren Ansible-Playbooks. Seien Sie jedoch vorsichtig, wenn Sie es verwenden, da das Ausführen beliebiger Shell-Befehle Sicherheitsrisiken bergen kann. Stellen Sie immer sicher, dass Sie den Befehlen vertrauen und alle benutzereingaben bereinigen.

Nachdem Sie nun ein gutes Verständnis des Shell-Moduls haben, können Sie es nutzen, um verschiedene Automatisierungsaufgaben auszuführen und Ihre Remote-Hosts effizient zu verwalten. Viel Spaß beim Schreiben von Ansible-Skripten!