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.
Einen einfachen Shell-Befehl ausführen
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 istlocalhost.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.
Variablen an Shell-Befehle übergeben
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 istlocalhost.vars: Definiert eine Variable namensdirectory_pathmit dem Wert/home/labex.shell: ls "{{ directory_path }}": Führt denls-Befehl aus, um den Inhalt des Verzeichnisses auszugeben, das durch die Variabledirectory_pathreprä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.
Befehlsfehler behandeln
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 istlocalhost.shell: failing-command: Diese Zeile verwendet das Shell-Modul, um den Befehlfailing-commandauszuführen. Die Ausgabe dieses Befehls wird erfasst und in der Variablefailing_command_outputgespeichert. Da das Skriptfailing-commandnicht existiert, muss dieser Befehl fehlschlagen.ignore_errors: yes: Diese Zeile weist Ansible an, alle Fehler zu ignorieren, die während der Ausführung desfailing-commandauftreten. 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 Bedingungfailing_command_output.failederfü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.
Komplexe Shell-Befehle ausführen
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 istlocalhost.shell: Leitet die Ausgabe vonls -l /home/labexin die Datei/home/labex/output.txtum und verwendetgrep, um den Inhalt überprojectzu 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!


