Dieser Artikel ist der Artikel zum 16. Tag von Ansible Adventskalender 2019.
Erfahren Sie, wie Sie Ansible für die Einrichtung eines Linux-Computers vorbereiten können, ohne sich der Verwendung von Ansible bewusst zu sein.
Es gibt eine Fülle von Informationen zum Server- und Netzwerkaufbau mit Ansible, und ich denke, dass es eine relativ große Umgebung gibt, in der Sie Ansible sofort mit dieser Umgebung ausführen können, aber "in dieser aktuellen Umgebung (insbesondere vor Ort)". Ich hatte das Gefühl, (ich persönlich) wenig Informationen darüber zu haben, wie man mit Ansible anfängt, also habe ich es zusammengefasst.
Daher geht es in diesem Artikel nicht um "Wie fange ich an, Ansible zu studieren?", Sondern um "Was sollte ich vorbereiten, wenn ich mit dem Aufbau eines Servers mit Ansible beginne?".
――Für diejenigen, die Ansible studieren möchten, klicken Sie hier: [Anfänger willkommen] Wenn Sie mit Ansible beginnen möchten, treten Sie dem Ansible Mokumokukai bei!
Es basiert auf CentOS.
Hostname | IP Adresse | Rolle |
---|---|---|
control-node | 192.168.0.140 | Steuerknoten |
target-node01 | 192.168.0.141 | Zielknoten |
target-node02 | 192.168.0.142 | Zielknoten |
Der Host, der Ansible-Befehle ausführt (z. B. "ansible" und "ansible-playbook"), wird als Steuerknoten bezeichnet, und der vom Steuerknoten Ansible verarbeitete Zielhost wird als Zielknoten bezeichnet.
--Was Sie für den Steuerknoten benötigen
--Was Sie für den Zielknoten benötigen
In diesem Artikel wird außerdem davon ausgegangen, dass der Arbeitsbenutzername (nicht root) und das Authentifizierungskennwort für den Steuerknoten und den Zielknoten alle gleich sind.
Für CentOS7 wird Ansible 2.4 mit dem Standard-Yum-Repository installiert, ist jedoch etwas zu alt (Stand 2.9 ab Dezember 2019).
$ yum info ansible
:
:
Verfügbare Pakete
Name: ansible
die Architektur: noarch
Ausführung: 2.4.2.0
Veröffentlichung: 2.el7
Kapazität: 7.6 M
Repository: extras/7/x86_64
einpacken: SSH-based configuration management, deployment, and task
:
:
Daher ist es im Fall von CentOS7 einfach, das Paket im EPEL-Repository zu installieren.
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install ansible
Sie sollten jetzt in der Lage sein, den neuesten Stabilisator zu installieren.
Führen Sie ansible --version
aus, um die Version zu überprüfen.
[zaki@control-node ~]$ ansible --version
ansible 2.9.1
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/zaki/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
[zaki@control-node ~]$
Weitere Plattformen wie RHEL und Debian / Ubuntu finden Sie im Ansible-Installationshandbuch (https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html).
Sie können es auch mit pip
installieren.
Versuchen Sie zur einfachen Überprüfung des Betriebs nach der Installation, das Ping-Modul auf localhost auszuführen, um zu überprüfen, ob Ansible auf dem Ziel ausgeführt werden kann.
$ ansible localhost -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Es ist in Ordnung, wenn "ERFOLG" angezeigt wird.
Python
Sie können es mit einem Paketmanager wie yum
installieren ... aber wenn Sie heutzutage eine beliebte Distribution haben, sollte Python von Anfang an enthalten sein.
Außerdem ist Python für die Installationsanforderungen von Ansible erforderlich. Wenn Ansible bereits installiert ist, sollte Python bereits installiert sein.
$ python --version
Sie können die Python-Version mit überprüfen.
Wenn der SSH-Server auch eine Hauptdistribution ist, sollte er unmittelbar nach der Installation des Betriebssystems ausgeführt werden. Um Ansible verwenden zu können, benötigen Sie einen SSH-Zugriff vom Steuerknoten zum Zielknoten. (SSH-Server wird auf dem Zielknoten ausgeführt)
Für die Authentifizierung kann entweder die Kennwortauthentifizierung oder die Authentifizierung mit öffentlichem Schlüssel ausgeführt werden. Bei der Kennwortauthentifizierung oder der Authentifizierung mit öffentlichem Schlüssel mit einer Passphrase muss das Kennwort / die Passphrase jedoch bei jeder Ausführung eingegeben werden, sodass der private Schlüssel keine Passphrase enthält Die Einstellung ist praktisch, da beim Bauen keine Probleme auftreten.
$ ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -N ""
Dadurch wird ein öffentlicher Schlüssel ohne Passphrase in ~ / .ssh / id_rsa
erstellt.
Verteilen Sie nach dem Erstellen des Schlüsselpaars den öffentlichen Schlüssel an jeden Zielknoten.
$ ssh-copy-id [email protected] #Zielknoten 1
$ ssh-copy-id [email protected] #Zielknoten 2
Sie sollten jetzt in der Lage sein, ohne Authentifizierung SSH-Zugriff auf jeden Zielknoten zu erhalten.
[zaki@control-node ~]$ ssh 192.168.0.141
[zaki@target-node01 ~]$
[zaki@control-node ~]$ ssh 192.168.0.142
[zaki@target-node02 ~]$
Mit diesem Setup sollten Sie mit dem Ping-Modul auf die beiden Zielknoten zugreifen können.
Erstellen Sie eine Inventardatei mit den folgenden Inhalten, die den Zielknoten definieren.
inventory.ini
[nodes]
192.168.0.141
192.168.0.142
Geben Sie diese Inventardatei mit "-i" an und führen Sie "ansible" aus. Geben Sie zu diesem Zeitpunkt den Gruppennamen "[Knoten]" an, der in der ersten Zeile des Inventars angegeben ist, in der Sie bei lokaler Ausführung "localhost" angegeben haben.
$ ansible nodes -i inventory.ini -m ping
192.168.0.142 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.0.141 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Jetzt können Sie bestätigen, dass Ansible vom Steuerknoten zum Zielknoten ausgeführt werden kann.
Wenn Sie keinen öffentlichen Schlüssel ohne Passphrase festlegen möchten, können Sie Ansible wie folgt ausführen.
Authentifizierungsmethode | Ansible Betrieb |
---|---|
Passwortauthentifizierung | -k を付与することでPasswortauthentifizierungのプロンプトを表示する |
Authentifizierung mit öffentlichem Schlüssel mit Passphrase | Die Eingabeaufforderung für die Passphrase wird automatisch angezeigt |
Noch ein Punkt. Beim Erstellen eines Servers mit Ansible erfordern die meisten Aufgaben (z. B. das Installieren von Paketen mit "yum") Root-Berechtigungen. Wenn "sudo" überhaupt nicht auf dem Zielknoten verfügbar ist, konfigurieren Sie sudoers (z. B. Hinzufügen zur Gruppe "rad") für den Zielbenutzer.
Wenn Sie es so einstellen, dass bei der Ausführung von "sudo" kein Kennwort erforderlich ist, müssen Sie bei der Ausführung von "Ansible" kein Kennwort eingeben, was praktisch und problemlos ist.
/etc/sudoers
%wheel ALL=(ALL) NOPASSWD: ALL
Dies erfolgt auf allen Zielknoten. (Wenn die Verarbeitung auch auf dem Steuerknoten ausgeführt wird, legen Sie sie auch auf dem Steuerknoten fest.) Fügen Sie nach dem Festlegen die Option -b hinzu (die als Standardstamm fungiert) und führen Sie Ansible aus.
$ ansible nodes -i inventory.ini -b -m ping
192.168.0.142 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.0.141 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Wenn kein Fehler auftritt, wird der Prozess mit Root-Rechten auf dem Zielknoten ausgeführt. Es ist jedoch schwer zu verstehen, dass es sich um ein Ping-Modul handelt. Wenn Sie also auf allen Knoten ein Update durchführen können, führen Sie den folgenden Befehl aus. Alle Pakete werden aktualisiert.
$ ansible nodes -i inventory.ini -b -m yum -a "name=* state=latest"
Wenn Sie "sudo" nicht ohne Kennwort festlegen, können Sie Ansible mit Root-Rechten ausführen, indem Sie zur Laufzeit "-K" angeben.
Kann mit -k
zur Passwortauthentifizierung verwendet werden.
Bisher habe ich die Installation von Ansible und die Einstellung von SSH / sudo manuell erklärt, aber da ich Ansible installiere, kann ich es automatisieren, damit Jagaimo nicht wütend wird. Lassen Sie uns den Ort automatisieren. Insbesondere das Verteilen des öffentlichen SSH-Schlüssels an alle Zielknoten und das Festlegen des sudo erfolgt nicht manuell.
Die anderen Anforderungen, die Einstellung des öffentlichen SSH-Schlüssels ohne Passphrase und die Einstellung von sudo ohne Kennwort, werden mit Ansible erfüllt.
ansible.cfg
Ich habe es bisher noch nicht erklärt. Betrachten Sie es daher als Magie, um die Probleme bei der erstmaligen Ausführung von SSH zu verringern.
ansible.cfg
[defaults]
host_key_checking = False
[ssh_connection]
ssh_args -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
inventory.ini
[nodes]
192.168.0.141
192.168.0.142
playbook.yml
---
- hosts: localhost
tasks:
- name: create directory for ssh keypair
file:
path: "{{ lookup('env','HOME') }}/.ssh/"
state: directory
mode: 0700
- name: create ssh privatekey
openssh_keypair:
path: "{{ lookup('env','HOME') }}/.ssh/id_rsa"
- hosts: all
tasks:
- name: publickey copy to target-nodes
authorized_key:
user: "{{ ansible_env.USER }}"
key: "{{ lookup('file', lookup('env', 'HOME') + '/.ssh/id_rsa.pub' )}}"
- hosts: all
become: True
tasks:
- name: configure non-password sudo
copy:
dest: /etc/sudoers.d/nopass
mode: 0600
content: |
%wheel ALL=(ALL) NOPASSWD: ALL
Legen Sie diese drei Dateien in dasselbe Verzeichnis und führen Sie den folgenden Befehl aus.
$ ansible-playbook -i inventory.ini playbook.yml -kK
Vergessen Sie nicht, dass -k
für die Passwortauthentifizierung und -K
für die sudo-Promotion-Passwortauthentifizierung steht (mit diesem Ansible eingestellt).
Auf Folgendes wird extern mit dem [lookup
-Plug-in] verwiesen (https://docs.ansible.com/ansible/latest/plugins/lookup.html).
Variable | Inhalt |
---|---|
{{ lookup('env','HOME') }} | Ausgangsverzeichnispfad des Ausführungsbenutzers |
{{ ansible_env.USER }} | Nutzername |
{{ lookup('file', lookup('env', 'HOME') + '/.ssh/id_rsa.pub' )}} | ~/.ssh/id_rsa.pub Dateiinhalt von |
In diesem Sinne führt jede Aufgabe in diesem Spielbuch Folgendes aus: (Wenn Sie bereits eine Einstellung wie "sudo" ohne Passwort haben, löschen Sie diese bitte.)
~ / .ssh
Verzeichnis
--csh ssh privatekey (lokale Ausführung)
--Erstellen Sie das private SSH-Schlüsselschlüsselpaar in ~ / .ssh / id_rsa
--publickey Kopie auf Zielknoten (Fernzugriff)
--Kopieren Sie ~ / .ssh / id_rsa.pub
auf autorisierten_Schlüssel auf allen Zielknoten
--config Nicht-Passwort sudo (Root-Berechtigung erforderlich)NOPASSWD
Einstellung für alle ZielknotenEs ist einfach, oder?
Wie in der Dokumentation (https://docs.ansible.com/ansible/latest/modules/openssh_keypair_module.html) erwähnt, ist dieses Modul ein neues Modul, das ab Version 2.8 verfügbar ist. Es kann nicht mit früheren Ansible-Versionen verwendet werden.
Wenn Sie eine frühere Version verwenden, kann das Modul den Schlüssel nicht erstellen. Ersetzen Sie ihn daher durch die Aufgabe, die vom Modul "shell" erstellt wurde.
playbook.yml
- name: check exists ssh privatekey
shell: test -f $HOME/.ssh/id_rsa
register: exist_key
ignore_errors: True
check_mode: False
changed_when: False
- name: create ssh privatekey
shell: ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -N ""
when: exist_key.rc != 0
Es ist etwas lang, aber es gibt zwei Phasen: "Überprüfen Sie, ob es" ~ / .ssh / id_rsa "gibt" und "Wenn nicht," ssh-keygen ". Bei der ersten Ausführung wird eine Fehlermeldung ausgegeben, da "~ / .ssh / id_rsa" nicht vorhanden ist, "ignore_errors: True" diese jedoch ignoriert und die Verarbeitung fortsetzt.
… Gibt es nicht einen erzwungenen Überschreibmodus für ssh-keygen
? ??
Daher erklärte ich den spezifischen Arbeitsablauf (manuelle und automatische Erstellung durch Ansible) zur Vorbereitung des Aufbaus eines Servers mit Ansible.
Wenn die Anzahl der Einheiten einige ist, denke ich, dass ich mein Bestes auch ohne Fehler von Hand geben kann, aber wenn es um 10 Einheiten und 20 Einheiten geht, ist es definitiv besser, es zu automatisieren.
Ich denke, dass sich dies in Bezug auf Netzwerkautomatisierung und Cloud-Umgebung ein wenig ändern wird, aber ich denke, dass damit die Automatisierung der Serverkonstruktion mithilfe von Ansible On-Premise gestartet werden kann.
Kann die Ansible-Installation mit Ansible automatisiert werden? ..
Referenz
Recommended Posts