Was ist Ansible?

Was ist Ansible? Ansible ist ein Open Source DevOps Tool, das Unternehmen bei der Orchestrierung (Installation/Bereitstellung, der Konfiguration/Verwaltung, den Updates, usw.) von Software und ganzen Servern unterstützt. Die Bereitstellung ist unkompliziert. Es nutzt SSH für die Kommunikation zwischen Servern. Ansible verwendet das Playbook, um Automatisierungsjobs zu beschreiben. Playbook verwendet eine sehr einfache YAML Sprache.

Wie Ansible angefangen hat und gewachsen ist.

Ansible für Anfänger - Ansible-Grundlagen und wie es funktioniert
Einführung in Ansible | Informatik Aktuell
Ansible Einführung - Blog - mobilistics.de
Tutorial: Ansible Einführung
Installieren und Konfigurieren von Ansible unter Ubuntu 20.04 | DigitalOcean

Wie funktioniert Ansible?

Ansible ist eine radikal einfache IT-Automatisierungs-Engine, die Cloud-Bereitstellung, Konfigurationsmanagement, Anwendungsbereitstellung, interne Orchestrierung und viele andere IT-Anforderungen automatisiert.

Ansible modelliert deine IT-Infrastruktur, indem du in Ansible beschreibst, wie deine Systeme miteinander zusammenhängen, anstatt dass du jeweils nur ein System verwaltest.

Ansible ist einfach bereitzustellen, weil es keine Agenten und keine zusätzliche benutzerdefinierte Sicherheitsinfrastruktur braucht. Ansible verwendet eine sehr einfache Sprache (YAML in Form von Ansible Playbooks), mit der du deine Automatisierungsjobs auf eine Art und Weise beschreiben kannst, die einfachem Englisch ähnelt.

Hier bekommst du einen schnellen Überblick, damit du die Dinge im Kontext sehen kannst. Weitere Informationen findest du auch unter docs.ansible.com.

EFFIZIENTE ARCHITEKTUR

Ansible stellt eine Verbindung zu deinen Knoten (Servern, Nodes) her und sendet kleine Programme, sogenannte “Ansible-Module”, an diese. Diese Programme werden als Ressourcenmodelle des gewünschten Systemzustands geschrieben. Ansible führt diese Module dann aus (standardmäßig über SSH) und entfernt sie, wenn sie fertig sind.

Deine Modulbibliothek (Ansible-Client) kann sich auf jedem Computer befinden, es sind keine Server, Dämonen oder Datenbanken erforderlich. Du arbeitest in deinem Terminal auf der Command-Zeile, mit deinem Texteditor (nano, etc) und wahrscheinlich einem Versionskontrollsystem, um Änderungen an deinen Inhalten verfolgen zu können.

SSH-SCHLÜSSEL sind deine Freunde

Passwörter werden unterstützt, aber SSH-Schlüssel mit ssh-agent sind eine der besten Möglichkeiten, Ansible zu verwenden. Root-Anmeldungen sind nicht erforderlich. Du kannst dich als beliebiger Benutzer anmelden und dann als su oder sudo die Befehle ausführen lassen.

Das “autorisierte_ Schlüssel” -Modul von Ansible ist eine großartige Möglichkeit, mit Ansible zu steuern, welche Computer auf welche Hosts zugreifen können.

ssh-agent bash
ssh-add ~ / .ssh / id_rsa

Verwalte deinen Bestand in einfachen Textdateien

Standardmäßig stellt Ansible mithilfe einer sehr einfachen INI-Datei dar, welche Computer verwaltet werden, und ordnet alle verwalteten Computer in Gruppen deiner Wahl ein.

Um neue Computer hinzuzufügen, ist kein zusätzlicher SSL-Signaturserver erforderlich, sodass du problemlos entscheiden kannst, warum ein bestimmter Computer aufgrund unklarer NTP- oder DNS-Probleme nicht verbunden wurde.

So sieht eine einfach Text-Inventardatei aus:

[webservers]
www1.example.com
www2.example.com

[dbservers]
db0.example.com
db1.example.com

Sobald Inventar-Hosts aufgelistet sind, können ihnen Variablen in einfachen Textdateien (in einem Unterverzeichnis mit dem Namen ‘group_vars/’ oder ‘host_vars/’) oder direkt in der Inventar-Datei zugewiesen werden.

Verwendung von Ansible für die Ausführung paralleler AD-HOC Aufgaben

Sobald du eine Instanz zur Verfügung hast, kannst du ohne zusätzliche Einrichtung sofort mit ihr sprechen:

ansible all -m ping 
ansible foo.example.com -m yum -a "name=httpd state=installed"
ansible foo.example.com -a "/usr/sbin/reboot"

Beachte, dass WiR Zugriff auf zustandsbasierte Ressourcenmodule haben und Raw-Befehle ausführen können. Diese Module sind extrem einfach zu schreiben und Ansible wird mit einer Flotte von ihnen geliefert, sodass der Großteil deiner Arbeit bereits erledigt ist.

Ansible enthält eine riesige Toolbox mit integrierten Modulen.

PLAYBOOKS CODE: Einfach + kraftvoll automatisieren

Mit Playbooks Code kannst du mehrere Bereiche deiner Infrastruktur in deiner Topologie fein orchestrieren und dabei sehr detailliert steuern, wie viele Computer gleichzeitig bearbeitet werden sollen. Hier beginnt Ansible am interessantesten zu werden.

Der Ansible Ansatz für die Orchestrierung ist von fein abgestimmter Einfachheit geprägt, da WiR der Meinung sind, dass dein Automatisierungscode durchaus viele Jahren Sinn machen soll, ohne dass du dir spezielle Syntax Regeln oder Funktionen merken musst.

So sieht PLAYBOOK CODE aus. Beachte bitte, dies hier ist nur ein Muster - besuche docs.ansible.com für die vollständige Dokumentation und alles, was möglich ist.

- hosts: webservers
serial: 5 # Computer gleichzeitig aktualisieren
roles:
- common
- webapp


- hosts: content_servers
roles:
- common
- content

Eine Beispiel app_config.yml könnte so aussehen:

- yum: name={{contact.item}} state=installed
with_items:
- app_server
- acme_software

- service: name=app_server state=running enabled=yes

- template: src=/opt/code/templates/foo.j2 dest=/etc/foo.conf
notify: 
- restart app server

In der Ansible-Dokumentation wird dies viel ausführlicher gezeigt. Du kannst noch viel mehr tun, darunter:

  • Nimm Maschinen in und aus Load Balancern und Überwachungsfenstern.
  • Lasse einen Server die IP-Adresse aller anderen Server anhand der Fakten zu diesen bestimmten Servern kennen - und verwenden Sie diese, um Konfigurationsdateien dynamisch zu erstellen.
  • Lege einige Variablen und Eingabeaufforderungen für andere fest und lege die Standardeinstellungen fest, wenn sie variabel sind.
  • Verwende das Ergebnis eines Befehls, um zu entscheiden, ob ein anderer ausgeführt werden soll.

Es gibt viele erweiterte Möglichkeiten, aber es ist einfach, loszulegen.

Am wichtigsten ist, dass die Sprache lesbar und transparent bleibt und du niemals explizite Ordnungsbeziehungen deklarieren musst oder Code in einer Programmiersprache schreiben musst.

Wie installiere und konfiguriere ich Ansible

  • Auf dem zu pflegenden Server (ProxmoX, Debian, Ubuntu, Node-Server, VM, LXC-Container, Docker usw.) ist keine Ansible Installation notwendig.
  • Am Server brauchst du nur einen SSH Zugang. (zB. über: apt install openssh-server).

Installieren unter LinuX wie zB. Debian, PureOS, Ubuntu:

In 4 Schritten zum ersten Ansible Erfolgserlebnis:

  • Ansible Installation
  • SSH-Schlüsselaustausch
  • Ansible Client-Setup
  • Ansible Tests

Wenn du neu bei Ansible bist, informiere dich über die Punkte am Beginn dieser Seite.

Ansible ist eines der beliebtesten DevOps Tools und kann problemlos Tausende von Servern und deine gesamte IT-Infrastruktur verwalten.

1) Ansible Installation

WiR verwenden Ansible in unserem Beispiel auf zwei LinuX Computer. Einer ist der Ansible-Host, also unser zu pflegender Server im NOC mit öffentlicher TCP/IP Nr. und der anderer ist unser Laptop/Desktop Computer mit wechselnder DHCP TCP/IP Nr.:

Ansible-Server - 51.252.53.40
Ansible-Client - Über DHCP wechselnde TCP/IP Nr.

Auf unserem lokalen Laptop/Desktop unter PureOS/Debian Buster installieren wir jetzt mit folgendem Befehl Ansible:

apt update                 # Aktualisiere die apt Paketverwaltung
apt install ansible        # Ansible ist rasch installiert

Falls du ein älteres Linux einsetzt, kannst du die Paketquellen für Ansible nachinstallieren:

apt install software-properties-common
apt-add-repository --update ppa:ansible/ansible  # Installiere das ansible Repository

Alternativ - Öffne die Datei: nano /etc/apt/sources.list und trage ein:

deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main

Danach kannst du den apt-key für Ansible holen und Ansible wie oben gezeigt installieren:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367

Wie prüfst du, ob Ansible installiert ist und welche Version du hast?

Du kannst es einfach mit der –version Syntax herauszufinden:

ansible --version
    ansible 2.9.16
    config file = /etc/ansible/ansible.cfg
    configured module search path = ['/home/mayer/.ansible/plugins/modules', 
    '/usr/share/ansible/plugins/modules']
    ansible python module location = /usr/lib/python3/dist-packages/ansible
    executable location = /usr/bin/ansible
    python version = 3.9.1+ (default, Feb  5 2021, 13:46:56) [GCC 10.2.1 20210110]

Du kannst sehen, bei mir ist aktuell Ansible 2.9.16 installiert und enthält die erforderlichen Informationen wie den Speicherort der Konfigurationsdatei und das Python-Modul.

Als nächstes müssen wir den SSH-Schlüsselaustausch durchführen, damit der Dienst ausgeführt werden kann und unser Ansible-Client mit unserem Ansible-Server kommunizieren kann.

2) SSH-Schlüsselaustausch

Der Ansible-Client kommuniziert über SSH (Secure Shell) mit unserem zu pflegenden Server (Ansible-Host) im NOC.

Wir generieren jetzt einen öffentlichen Schlüssel auf unserem Ansible-Client, der danach auf den Ansible-Host kopiert wird.

Keygen Schlüssel erstellen und den öffentlichen Teil am Server ablegen

Generiere den Schlüssel mit ssh-keygen Befehl wie unten gezeigt:

ssh-keygen -t ed25519
    Generating public/private ed25519 key pair.
    Enter file in which to save the key (/home/mayer/.ssh/id_ed25519): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/mayer/.ssh/id_ed25519
    Your public key has been saved in /home/mayer/.ssh/id_ed25519.pub
    The key fingerprint is:

Wie du bemerkt hast, wurde ein öffentlicher Schlüssel im .ssh Ordner generiert. Hinweis: Stell sicher, dass die privaten und öffentlichen Schlüsseldateien nicht weltweit lesbar sind. Du kannst die Dateien auflisten, um sie zu überprüfen.

cd  /home/mayer/.ssh/  # Wechsle in den .ssh Ordner
ls -l            # Liste die Dateien auf
    -rw------- 1 mayer data  411 12. Mär 00:18 id_ed25519
    -rw------- 1 mayer data   98 12. Mär 00:18 id_ed25519.pub

Wenn die Berechtigungen falsch sind, ändere sie mit dem chmod Befehl:

chmod 600 id_ed25519
chmod 600 id_ed25519.pub

Kopiere den öffentlichen Schlüssel auf den Ansible-Host mit der öffentlichen IP-Adresse.

ssh-copy-id -p22 -i ~/.ssh/id_ed25519.pub [email protected]

    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    The authenticity of host '51.252.53.40 (51.252.53.40)' can't be established.
    ECDSA key fingerprint is SHA256:eXduPrfV0mhxUcpsZWg+0oXDim7bHb90caA/Rt79cIs.
    Are you sure you want Ansible Installation

Du kannst in der Ausgabe oben sehen, dass 1 Schlüssel erfolgreich hinzugefügt wurde. Dies zeigt an, dass der SSH-Schlüssel ausgetauscht wurde. Als nächstes richten WiR den Ansible-Client ein.

3) Ansible Client Setup

Nachdem du die Installation am Ansible-Server bereits erledigt hast, schauen wir uns das Ansible Client Setup an.

Das Client-Setup ist nichts anderes, als die Ansible-Server auf die Clients aufmerksam zu machen.

Melde dich dazu beim Ansible-Server an und gehe zu …

nano /etc/ansible

Füge folgendes ein:

[Client] 
node1 ansible_ssh_host=51.252.53.40

4) Ansible Test

Wenn du alle Schritte korrekt ausgeführt hast, bekommst du eine ERFOLG Meldung, wenn du den folgenden Befehl auf dem Ansible-Server ausführst:

ansible -m ping Client

    node1 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python3"
    }, 
    "changed": false, 
    "ping": "pong"

}

Sende den obigen ping an den Client. So kannst du die Konnektivität testen und bekommst die Antwort ob die Verbindung gut ist oder nicht.

Fazit

Ich hoffe, dies gibt dir eine Idee, wie einfach Ansible zu installieren ist. Automatisiere mit Ansible deinen Arbeitsalltag.

Baue dein Ansible Inventar auf

Ansible arbeitet mit mehreren verwalteten Knoten oder „Hosts“ in deiner Infrastruktur gleichzeitig und verwendet dabei eine Liste oder eine Gruppe von Listen, die als Inventar bezeichnet werden. Sobald dein Inventar definiert ist, wählst du mithilfe von Mustern die Hosts oder Gruppen aus, für die Ansible ausgeführt werden soll.

Der Standardspeicherort für das Inventar ist eine Datei mit dem Namen /etc/ansible/hosts.

Ansible apt .::. aktualisiere alle Pakete unter Ubuntu/Debian Linux

Lass uns folgende Fragen klären: Wie aktualisierst du Debian Boxen mit dem apt-Modul von Ansible? Wie kannst du Ansible für Systemupdates verwenden und die Box neu starten, wenn es notwendig wird?

Das System auf dem neuesten Stand zu halten und alle Sicherheitspatches anzuwenden, ist eine wichtige Aufgabe für Systemadministratoren und Entwickler. Mit dem apt-Modul von Ansible können apt-Pakete für Debian-basierte Linux-Distributionen verwaltet werden. Dieses Modul kann entweder aptitude oder apt-get auf dem Remote-Server für die Paketverwaltung verwenden. Ebenso ist es am besten, wenn du das Neustartmodul von Ansible verwendest, um einen Computer neu zu starten und nicht darauf wartest, dass er ausfällt, wieder hochgefahren wird und unvorhergesehen auf die Updates reagiert. Auf dieser Seite wird erläutert, wie du apt-get update ausführen und alle Pakete über Ansible aktualisieren und den Computer bei Bedarf neu starten kannst.

Ansible apt aktualisiert alle Pakete mit dem apt-Modul

Normalerweise führst du Folgendes aus, um den Paketcache mit dem Befehl sudo apt-get update zu aktualisieren. So aktualisierst du den Repository-Cache mit Ansible:

- name: Update apt-get repo and cache
   apt: update_cache=yes force_apt_get=yes cache_valid_time=79200

Im Detail:

  • update_cache=yes - Führe auf allen Servern den Befehl apt-get update aus.
  • force_apt_get=yes - Verwende nicht den Befehl aptitude, sondern den Befehl apt-get auf Debian/Ubuntu-Boxen.
    cache_valid_time=79200 - Aktualisiere den apt-Cache, wenn er älter als cache_valid_time ist. Diese Option wird in Sekunden eingestellt. In diesen Beispielen ist es auf 79200 Sekunden eingestellt, was 22 Stunden entspricht.

Aktualisieren alle apt-Pakete mit Ansible mit der Syntax:

- name: Upgrade all apt packages
   apt: upgrade=dist force_apt_get=yes

Im Detail:

  • upgrade=dist - Führe auf allen Ubuntu oder Debian Linux-Servern den Befehl apt-get upgrade aus. Aktualisiere also alle Pakete auf die neueste Version.
  • force_apt_get=yes - Verwende apt-get anstelle von aptitude.

Finde heraus, ob wir den Server neu starten müssen

Wenn die Datei /var/run/reboot-required vorhanden ist, muss deine Debian oder Ubuntu Linux-Box neu gestartet werden. Wir müssen eine neue Variable wie folgt registrieren, wenn die Datei /var/run/reboot-required auf dem System vorhanden ist:

- name: Check if a reboot is needed for Debian and Ubuntu boxes
  register: reboot_required_file
  stat: path=/var/run/reboot-required get_md5=no

Im Detail:

  1. register: reboot_required_file - Das Schlüsselwort ‘register’ entscheidet, in welcher Variable ein Ergebnis gespeichert werden soll, und wir werden es wie folgt verwenden, um die Box neu zu starten.
  2. stat: path=/var/run/reboot-required - Stelle fest, ob ein Pfad (/var/run/reboot-required) vorhanden ist
  3. get_md5=no - Algorithmus zur Bestimmung der Prüfsumme der Datei. In diesem Beispiel verwende ich md5, aber du kannst auch sha1, sha224, sha256, sha384 oder sha512 verwenden.

Neustart des Servers bei Installation eines neuen Kernels

Du kannst entweder den Befehl oder das Shell-Modul verwenden, um den Linux-Server neu zu starten:

- name: Reboot the Debian or Ubuntu server
  reboot:
    msg: "Reboot initiated by Ansible due updates"
    connect_timeout: 5
    reboot_timeout: 300
    pre_reboot_delay: 0
    post_reboot_delay: 30
    test_command: uptime
  when: reboot_required_file.stat.exists

Im Detail:

  • test_command: uptime - Führe den Befehl uptime auf dem neu gestarteten Server aus und erwarten Sie Erfolg, um festzustellen, ob der Computer für weitere Aufgaben bereit ist.
  1. when: reboot_required_file.stat.exists - Überprüfe zunächst mit einer Variablen namens reboot_required_file, ob die Datei mit dem Namen /var/run/reboot-required vorhanden ist. Das Neustartmodul funktioniert nur, wenn diese Datei vorhanden ist und unter Verwendung der Ansible-Bedingung when: reboot_required_file.stat.exists erzwungen wird.

Verwende Ansible für Systemupdates und einem Neustart

Nachdem du jetzt die grundlegende Logik kennst, kannst du dein Inventar in der Hostdatei zusammenfassen. nano /etc/ansible/hosts

## set up ssh user name and path to python3 ##
[all:vars]
ansible_user='ubuntu'
ansible_become=yes
ansible_become_method=sudo
ansible_python_interpreter='/usr/bin/env python3'

##########################
## aws-ls-www-1 may be mapped using /etc/hosts or ~/.ssh/config or a ip address
[servers]
aws-ls-www-1
aws-ls-www-2

Beispiel playbook

Erstelle eine YAML Playbook Datei: nano /etc/ansible/update.yml wie folgt:

---
- hosts: servers
  become: true
  become_user: root
  tasks:
    - name: Update apt repo and cache on all Debian/Ubuntu boxes
      apt: update_cache=yes force_apt_get=yes cache_valid_time=3600

    - name: Upgrade all packages on servers
      apt: upgrade=dist force_apt_get=yes

    - name: Check if a reboot is needed on all servers
      register: reboot_required_file
      stat: path=/var/run/reboot-required get_md5=no

    - name: Reboot the box if kernel updated
      reboot:
        msg: "Reboot initiated by Ansible for kernel updates"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime
      when: reboot_required_file.stat.exists

Starte jetzt das Ansibe Playbook mit:
cd /etc/ansible
ansible-playbook -i hosts update.yml

Fazit

Du hast gelernt, wie du alle Pakete auf deinen Debian- und Ubuntu Linux-Boxen aktualisieren und den Server bei Bedarf mithilfe von Ansible-Playbooks neu starten lassen kannst. Weitere Informationen finden Sie in den Dokumenten hier.

Für Schnell-Leser ein Beispiel in ProxmoX

Ansible auf dem ProxmoX Debian/GNU LinuX Server installieren

apt update                 # Aktualisiere die apt Paketverwaltung
apt install ansible        # Ansible ist rasch installiert

nano /etc/hosts

172.22.11.48     5132-fireWALL 5132-commBOX 5132-osNGINX
172.22.11.49     5133-fireWALL 5133-commBOX

nano /etc/ansible/hosts

[all:vars]
ansible_user=ansible-user
ansible_become=yes

[buster-customer]
5132-fireWALL   ansible_port=22
5133-fireWALL   ansible_port=22

ansible --version
ansible-inventory --list | more

Erstelle im PromoX Webtool neue Debian Buster LXC Container

Nachdem du zwei neue Debian Buster LXC Container erstellt hast, geh in diesen Container und lege mit adduser einen Ansible User an. Trage danach diesen User mit nano /etc/group in die Gruppe sudo ein und installiere noch die sudo APP: apt install sudo.

pct enter 5132
pct enter 5133

adduser ansible-user
nano /etc/group
     sudo:x:27:ansible-user
apt update && apt install sudo

exit

Zurück im ProxmoX Terminal als root User

Du solltest dich jetzt bereits mit ssh einloggen können und mit sudo Rechten ein Update im neuen LXC Debian Buster Container ausführen können. Wir brechen aber mit Strg-C ab und verlassen den Container mit exit wieder, weil Ansible dieses Update bereits für uns erledigen soll.

ssh ansible-user@5132-fireWALL

sudo apt update
    32 packages can be upgraded. Run 'apt list --upgradable' to see them.

Strg-C exit

Schlüssel (einmal) erstellen und jeweils im LXC Container ablegen

ssh-keygen -t ed25519
3x Return
vdir -a ~/.ssh/

Kopiere den öffentlichen Keygen Schlüssel jeweils auf einen neuen Ansible-Host:
ssh-copy-id -p22 -i ~/.ssh/id_ed25519.pub ansible-user@5132-fireWALL
ssh-copy-id -p22 -i ~/.ssh/id_ed25519.pub ansible-user@5133-fireWALL

Orchestriere alle LinuX Boxen mit Ansible

Ab diesem Moment kann der neue Debian Buster LXC Container von Ansible aus administriert werden. Wie du siehst ist im zu pflegenden LinuX Container nur ein SSH Zugang notwendig. Ansible selbst braucht im zu pflegenden Server NICHT installiert zu werden!

ansible 5132-fireWALL -m ping
ansible -a uptime all

Ansible Add-HOC Befehle …

Wir könnten unter Angabe des sudo Passwortes mit zwei unterschiedlichen Add-HOC Befehlen von Ansible die Updates bereits erstellen lassen. Wir werden es aber an dieser Stelle nicht tun, weil wir das automatisiert anschließend mit unserem erstes Playbook ausführen lassen.

ansible 5132-fireWALL -m apt -a "update_cache=yes upgrade=yes" -b --ask-become-pass
ansible 5132-fireWALL -m package -a "name=* state=latest" -b --ask-become-pass

… vs Playbook Scripts

Erstelle eine YAML Playbook Datei: nano /etc/ansible/buster-update.yml:

nano /etc/ansible/buster-update.yml

ansible-playbook -i hosts /etc/ansible/buster-update.yml -K

  • name: Playbook Buster Update
    hosts: buster-customer

    tasks:

    • name: Update apt repo and cache on all Debian/Ubuntu boxes
      apt: update_cache=yes force_apt_get=yes cache_valid_time=3

    • name: Upgrade all packages on servers
      apt: upgrade=dist force_apt_get=yes

Starte jetzt das Ansibe Playbook mit:
ansible-playbook /etc/ansible/buster-update.yml -K