Vorbereiten der Verwendung von Ansible auf einem vorhandenen Linux-Server

Überblick

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!

Verfassung

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.

Installation und Konfiguration

Ansible Körper

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.

SSH-Zugang

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

Sudo-Einstellungen

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.

Erstkonstruktion von Ansible automatisiert

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.

Annahme

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

Inventar

inventory.ini


[nodes]
192.168.0.141
192.168.0.142

Spielbuch

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.pubDateiinhalt 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.)

Es ist einfach, oder?

(Ergänzung) Informationen zum Modul openssh_keypair

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? ??

Zusammenfassung

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

Vorbereiten der Verwendung von Ansible auf einem vorhandenen Linux-Server
Erstellen Sie einen NFS-Server unter Arch Linux
Ich möchte Linux auf dem Mac verwenden
Verwenden Sie Ansible unter Windows
Vorbereiten der Verwendung von aws cli unter Mac OS X.
Verwendung von C216 Audio Controller unter Arch Linux
Ich möchte OpenJDK 11 mit Ubuntu Linux 18.04 LTS / 18.10 verwenden
[Tipps] Verwendung des iPhone als Webkamera unter Linux
Verwenden Sie Github Desktop unter Linux
Verwenden Sie Linux unter Windows 10 (WSL2)
Verwendung von GitHub auf einem Server für mehrere Personen ohne Kennwort
[Für Anfänger] Verwendung der for-Anweisung unter Linux (Variablen usw.)
Wenn Sie python2.x unter modernem Gentoo Linux verwenden möchten
Was tun, wenn Sie unter Linux kein WLAN verwenden können?
So erstellen Sie eine ISO-Datei (CD-Image) unter Linux
Verwenden Sie Xming, um eine Ubuntu-GUI-Anwendung unter Windows zu starten.
Ich habe versucht, eine Umgebung von MkDocs unter Amazon Linux zu erstellen
Ich möchte Shortcut-Übersetzungen wie die DeepL-App auch unter Linux verwenden
Verwendung von Dataiku unter Windows
Vorbereiten des Betriebs von Flask auf EC2
Hinweise zur Verwendung von Pywinauto
Führen Sie einen Linux-Server mit GCP aus
So installieren Sie VMware-Tools unter Linux
Hinweise zur Verwendung von featuretools
Wie benutzt man Homebrew in Debian?
Verwenden Sie Linux-Befehle auf Android-Geräten
[C-Sprache] Verwendung der Krypta-Funktion unter Linux [Passwort-Hashing]
Wie baue ich meinen eigenen Linux-Server?
Ich habe einen Nur-SFTP-Benutzer unter Linux erstellt.
Verwenden Sie Numpy, Scipy, Scikit-Learn unter Amazon Linux
Erstellen Sie einen einfachen WebDAV-Server unter Linux
[Linux] Verwendung des Befehls echo
So aktualisieren Sie PHP unter Amazon Linux 2
So verwenden Sie Google Assistant unter Windows 10
Installieren und konfigurieren Sie den TigerVNC-Server unter Linux
So zeigen Sie Piktogramme unter Manjaro Linux an
Memorandum über die Verwendung von Gremlin Python
So installieren Sie Pakete unter Alpine Linux
5 Gründe, Linux auf Ihrem Laptop zu installieren.
Erstellen Sie einen Samba-Server unter Arch Linux
Docker-Datei: Installieren Sie Docker auf einem Linux-Server
Verwenden Sie Ghost.py als Alternative zu PhantomJS
So aktualisieren Sie die Sicherheit unter CentOS Linux 8
Installieren Sie Python auf xserver, um pip zu verwenden
Wie installiere ich php7.4 unter Linux (Ubuntu)
Setzen Sie unter Ubuntu Linux Tab auf q
So finden Sie große Dateien unter Linux
Gust kann unter Linux keine Verbindung zu Wifi herstellen
[Ich bin ein IT-Anfänger] Ich habe mein Bestes versucht, Linux unter Windows zu implementieren
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (11)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (8)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (1)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (4)