Einführung in die Ansible-Konsole
In früheren Ansible-Tutorials haben wir gesehen, wie einfach es ist, die grundlegenden Konzepte dieses fantastischen Automatisierungstools zu verstehen, wie man seine ersten Playbooks schreibt, wie man Aufgaben in Rollen organisiert und wie man Ansible Vault verwendet, um sensible Daten zu schützen. Dieses Mal konzentrieren wir uns auf ein interaktives Tool, mit dem wir Aufgaben im Handumdrehen ausführen können, die auf einzelne Hosts oder Hostgruppen abzielen: die Ansible-Konsole.
In diesem Tutorial lernen Sie:
- So installieren Sie die Ansible-Konsole auf den am häufigsten verwendeten Linux-Distributionen
- So verwenden Sie die Ansible-Konsole
Einführung und Installation
Die Ansible-Konsole ist eine Read Eval Print Loop (REPL)-Umgebung, von der aus wir Aufgaben im laufenden Betrieb ausführen und ihre Ergebnisse sofort visualisieren können. Das Dienstprogramm ansible-console ist Teil des Pakets ansible-core, das wir auf Fedora und Fedora-basierten Distributionen mit dem folgenden Befehl installieren können:
sudo dnf install ansible-coreUm die Installation unter Debian und auf Debian-Basis-Distributionen durchzuführen, können wir stattdessen Folgendes ausführen:
sudo apt install ansible-core
Verwenden Sie Archlinux? Das ansible-core-Paket ist im "Extra"-Repository verfügbar, so dass es einfach mit pacman installiert werden kann:
sudo pacman -S ansible-coreEs ist auch möglich, das Paket auf distributionsunabhängige Weise zu installieren, indem pip verwendet wird:
pip install --user ansible-coreAufrufen der ansible-console
Wir verwenden ansible-console praktisch auf die gleiche Weise wie ansible-playbook, da sich die beiden Dienstprogramme die überwiegende Mehrheit der Optionen teilen. Die einfachste Möglichkeit zum Aufrufen der Konsole besteht darin, Folgendes auszuführen:
ansible-consoleUnsere Shell-Eingabeaufforderung ändert sich, um zu bestätigen, dass die Ansible-REPL-Umgebung Befehle akzeptiert:
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
Welcome to the ansible console. Type help or ? to list commands.
doc@all (0)[f:5]$Die oben angezeigte Warnmeldung ist darauf zurückzuführen, dass wir keine Lagerbestandsdatei angegeben haben. In solchen Fällen generiert Ansible einen impliziten localhost für uns, wenn wir "localhost" als Ziel verwenden. Sie können sehen, dass sich dies in der Eingabeaufforderung der Konsole widerspiegelt, wobei "doc" für den Ansible-"Remote-Benutzer" und "all" für die Hostgruppe steht, auf die wir abzielen.
doc@all (0)[f:5]$Standardmäßig wird der Benutzer, als der wir die ansible-console aufrufen, auch für Remote-Verbindungen verwendet. Ein anderes kann jedoch als Argument für die Option --user angegeben werden, wenn wir die Konsole aufrufen, oder von der Konsole selbst aus, indem wir den Befehl remote_user ausführen:
doc@all (0)[f:5]$ remote_user usernameDa, wie in der Warnung angegeben, die Gruppe "all" nicht mit dem impliziten localhost übereinstimmt, können wir in der Eingabeaufforderung eine 0 zwischen den Klammern sehen, die die Anzahl der übereinstimmenden Hosts angibt. Danach sehen wir in eckigen Klammern die Anzahl der verfügbaren Forks: 5 (die Standardeinstellung). Forks sind die gleichzeitigen Verbindungen, die Ansible für eine Aufgabe verwenden kann. Die Anzahl der verfügbaren Forks kann beim Aufruf der Konsole als Argument für die Option -f angegeben werden:
ansible-console -f 7Alternativ kann es von der Konsole selbst aus mit dem fork-Befehl geändert werden:
doc@all (0)[f:5]$ forks 7Da unsere aktuelle Konfiguration mit keinem Host übereinstimmt, haben die Aufgaben, die wir ausführen werden, keine Auswirkungen. Da wir im Moment nur auf den impliziten localhost abzielen können, um etwas Effektives zu tun, sollten wir zu ihm "wechseln", mal sehen, wie es geht.
Targeting bestimmter Hosts oder Gruppen
Wie können wir über die Ansible-Konsole auf einen bestimmten Host (oder eine bestimmte Hostgruppe) abzielen? Wir können dies mit dem Befehl cd tun, als ob wir das Arbeitsverzeichnis ändern würden. Um beispielsweise den impliziten localhost als Ziel zu verwenden, würden wir Folgendes ausführen:
doc@all (0)[f:5]$ cd localhost
Die Eingabeaufforderung spiegelt sofort die Änderung des Ziels wider:
doc@localhost (1)[f:5]$Beachten Sie, dass die Anzahl der übereinstimmenden Hosts wie erwartet auf 1 angestiegen ist. Der Befehl cd kann auch als Ziel für bestimmte Hosts oder Gruppen verwendet werden, die explizit in einer Inventardatei definiert sind. Sehen wir uns ein Beispiel an. Angenommen, wir haben das folgende, sehr einfache, ansible Inventar, das in einer Datei mit dem Namen inventory.ini gespeichert ist:
[workstations]
localhost ansible_connection=local
[servers]
feanor ansible_host=192.168.0.39
Im Inventar haben wir explizit einen "localhost" und zwei Gruppen definiert: "workstations " (einschließlich localhost) und "servers ", die nur einen Host (feanor) enthalten. Um die Ansible-Konsole auf diese Inventardatei zu verweisen, übergeben wir sie als Argument an die Option -i:
ansible-console -i inventory.iniDie Eingabeaufforderung der Konsole meldet die Anzahl der übereinstimmenden Hosts:
doc@all (2)[f:5]$Um eine Liste der verfügbaren Hosts zu erhalten, können wir den Befehl list verwenden:
doc@all (2)[f:5]$ list
localhost
feanor
Um die verfügbaren Gruppen aufzulisten, verwenden wir stattdessen Listengruppen:
doc@all (2)[f:5]$ list groups
all
servers
ungrouped
workstations
Oben sehen wir die Gruppen, die wir explizit in der Inventardatei definiert haben, die in der Ausgabe des Befehls erscheinen, zusammen mit zwei anderen Gruppen, die automatisch von Ansible erstellt werden: "all " und "ungrouped ". Ersteres ist die Gruppe, die alle verfügbaren Hosts umfasst, letzteres stellt eine Möglichkeit dar, alle Hosts zu referenzieren, die nicht Teil einer Gruppe sind.
Um zu einer bestimmten Gruppe zu wechseln, können wir cd verwenden, genau wie in den vorherigen Beispielen:
doc@all (2)[f:5]$ cd workstationsAbrufen einer Liste der verfügbaren Module
Wie wir bereits wissen, sind die Ansible-Funktionalitäten in Modulen organisiert. Um alle verfügbaren Module in der Ansible-Konsole aufzulisten, können wir den Befehl help verwenden:
doc@all (2)[f:5]$ helpDie Liste wird auf dem Bildschirm ausgedruckt (Ausgabe gekürzt):
Documented commands (type help <topic>):
========================================
EOF
amazon.aws.autoscaling_group
amazon.aws.autoscaling_group_info
amazon.aws.aws_az_info
amazon.aws.aws_caller_info
amazon.aws.cloudformation
amazon.aws.cloudformation_info
amazon.aws.cloudtrail
amazon.aws.cloudtrail_info
amazon.aws.cloudwatch_metric_alarm
amazon.aws.cloudwatch_metric_alarm_info
amazon.aws.cloudwatchevent_rule
amazon.aws.cloudwatchlogs_log_group
amazon.aws.cloudwatchlogs_log_group_info
amazon.aws.cloudwatchlogs_log_group_metric_filter
[...]
Um Hilfe zu einem bestimmten Modul zu erhalten, können wir wieder den Befehl "help" verwenden, diesmal mit dem Namen des Moduls als Argument. Um beispielsweise die Dokumentation des Moduls ansible.builtin.file zu lesen, würden wir Folgendes ausführen:
doc@all (2)[f:5]$ help ansible.builtin.fileHier ist das Ergebnis des Aufrufs des obigen Befehls:
Manage files and file properties
Parameters:
path Path to the file being managed.
state If C(absent), directories will be recursively deleted, and files or symlinks will be unlinked. In the case of a directory, if C(diff) is declared, you will see the files and folders deleted listed under C(path_contents). Note that C(absent) will not cause C(file) to fail if the C(path) does not exist as the state did not change.
src Path of the file to link to.
recurse Recursively set the specified file attributes on directory contents.
force Force the creation of the symlinks in two cases: the source file does not exist (but will appear later); the destination exists and is a file (so, we need to unlink the C(path) file and create symlink to the C(src) file in place of it).
follow This flag indicates that filesystem links, if they exist, should be followed.
modification_time This parameter indicates the time the file's modification time should be set to.
modification_time_format When used with C(modification_time), indicates the time format that must be used.
access_time This parameter indicates the time the file's access time should be set to.
access_time_format When used with C(access_time), indicates the time format that must be used.
mode The permissions the resulting filesystem object should have.
owner Name of the user that should own the filesystem object, as would be fed to I(chown).
group Name of the group that should own the filesystem object, as would be fed to I(chown).
seuser The user part of the SELinux filesystem object context.
serole The role part of the SELinux filesystem object context.
setype The type part of the SELinux filesystem object context.
selevel The level part of the SELinux filesystem object context.
unsafe_writes Influence when to use atomic operation to prevent data corruption or inconsistent reads from the target filesystem object.
attributes The attributes the resulting filesystem object should have.
Ausführen einer Aufgabe
Das Ausführen einer Aufgabe über die Ansible-Konsole ist ziemlich einfach. Alles, was wir tun müssen, ist, das Modul aufzurufen, das wir verwenden möchten, und die erforderlichen Parameter bereitzustellen. Nehmen wir an, wir möchten ein Python-Paket mit pip unter Verwendung des Moduls ansible.builtin.pip installieren, das nur auf "localhost " abzielt. Hier ist, was wir tun würden. Zuerst würden wir mit dem Befehl cd auf "localhost" umschalten:
doc@all (2)[f:5]$ cd localhostDann rufen wir das Modul auf und übergeben den Namen des Pakets, das wir als Argument installieren möchten, an den Parameter "name". Im folgenden Beispiel installieren wir youtube-dl, ein Dienstprogramm, mit dem wir Videos von Youtube und von vielen anderen Plattformen herunterladen können:
doc@localhost (1)[f:5]$ ansible.builtin.pip name=youtube-dlWir können uns sofort die Ausgabe der Aufgabe vorstellen:
localhost | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"cmd": [
"/usr/bin/python3",
"-m",
"pip.__main__",
"install",
"youtube-dl"
],
"name": [
"youtube-dl"
],
"requirements": null,
"state": "present",
"stderr": "",
"stderr_lines": [],
"stdout": "Defaulting to user installation because normal site-packages is not writeable\nCollecting youtube-dl\n Downloading youtube_dl-2021.12.17-py2.py3-none-any.whl (1.9 MB)\n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 4.1 MB/s eta 0:00:00\nInstalling collected packages: youtube-dl\nSuccessfully installed youtube-dl-2021.12.17\n",
"stdout_lines": [
"Defaulting to user installation because normal site-packages is not writeable",
"Collecting youtube-dl",
" Downloading youtube_dl-2021.12.17-py2.py3-none-any.whl (1.9 MB)",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 4.1 MB/s eta 0:00:00",
"Installing collected packages: youtube-dl",
"Successfully installed youtube-dl-2021.12.17"
],
"version": null,
"virtualenv": null
}
Im obigen Beispiel haben wir ein einzelnes Paket installiert, daher haben wir einen String als Wert des Parameters "name" angegeben. Es ist auch möglich, mehrere Elemente zu übergeben, also mehrere Pakete zu installieren. In einem Playbook würden wir eine Liste verwenden, in der Ansible-Konsole trennen wir stattdessen Elemente durch ein Komma:
doc@localhost (1)[f:5]$ ansible.builtin.pip name=youtube-dl,bs4Weiterer Benutzer werden
Bestimmte Aufgaben ändern den globalen Zustand des Systems, daher müssen wir sie mit erhöhten Rechten aufrufen. Genau wie bei der Verwendung des Dienstprogramms ansible-playbook rufen wir die ansible-shell mit der Option -K (kurz für --ask-become-pass) auf. Wir werden aufgefordert, unser Passwort einzugeben, da die Standardmethode, um ein weiterer Benutzer zu werden, "sudo" ist:
ansible-console -i inventory.ini --ask-become-pass
BECOME password:
Sobald wir das Passwort angegeben haben, können wir root werden, indem wir das Flag "werden" umschalten:
doc@all (1)[f:5]$ become trueDie Eingabeaufforderung spiegelt die Änderung wider: Die Textfarbe wird rot und $ ändert sich in #:
doc@all (1)[f:5]#Jetzt können wir die Aufgabe aufrufen, die Administratorrechte erfordert. Wir können zum Beispiel das Modul ansible.builtin.package verwenden, um ein Paket systemweit zu installieren:
ansible.builtin.package name=gitUm wieder zu einem unprivilegierten Benutzer zu wechseln, können wir einfach Folgendes verwenden:
doc@all (1)[f:5]# become falseAusführen eines Shell-Befehls
Manchmal möchten wir möglicherweise einen Standard-Shell-Befehl ausführen, ohne die Ansible-Konsolenumgebung zu verlassen. Dies kann erreicht werden, indem Sie dem Befehl, den wir ausführen möchten, ein ! voranstellen (dies kann Sie an etwas erinnern, wenn Sie ein Vim-Benutzer sind). Nehmen wir als Beispiel an, wir möchten den Namen des aktuellen Arbeitsverzeichnisses mit pwd ausgeben. Wir würden laufen:
doc@all (1)[f:5]$ !pwdParametererweiterungen und Befehlsersetzungen funktionieren ebenfalls mit dieser Technik:
doc@all (1)[f:5]$ !echo ${HOSTNAME}
localhost | CHANGED | rc=0 >>
fingolfin
doc@all (1)[f:5]$ !echo "today is $(date)"
localhost | CHANGED | rc=0 >>
today is Thu Jul 20 04:16:03 PM CEST 2023
Beenden der Ansible-Konsole
Sobald wir mit der Arbeit in der Ansible-Konsole fertig sind, müssen wir nur noch den Befehl exit verwenden, um zur System-Shell zurückzukehren:
doc@all (1)[f:5]$ exit
Ansible-console was exited.
Schlüsse
Dieses Tutorial ist nur das letzte in unserer Serie über Ansible. Hier haben wir gesehen, wie man die Ansible-Konsole aufruft und wie man ihre Eingabeaufforderung liest, wie man Informationen über verfügbare Module erhält, wie man eine Aufgabe ausführt und wie man durch Hosts und Gruppen navigiert. Wir erfahren auch, wie Sie Aufgaben mit erhöhten Rechten ausführen und wie Sie schließlich die Konsole beenden.
