SaltStack

Modernes Infrastrukturmanagement

Eine Einführung von Valentin Hoebel / @xenuser (Twitter)

Wer zum Teufel..?

  • Valentin Höbel
  • Cloud Architect @ NFON
  • Arbeitet mit Linux und Open-Source-Software seit 2007
  • Über 40 Veröffentlichungen in Online- und Printmedien (Linux Magazin, golem.de...)

Worum geht's heute?

  • Grobe Einführung in SaltStack
  • Vorteile, Nachteile
  • Mögliche Einsatzszenarien

Ein paar Anmerkungen...

  • Zwischenfragen sind immer willkommen...
  • ... wenn möglich bitte vorm nächsten Folienwechsel
  • Heute aus Zeitgründen leider keine Live-Demo :(

Bereit?

Stellt euch vor...

ihr müsst eine Vielzahl an Systemen verwalten...

Vielleicht auch verschiedene Plattformen?

Oder auch verschiedene Standorte?








Mit super viel Personal?

Die Lösung?

Hintergründe

  • Erstmals aufgetaucht im März 2011
  • Autor: Thomas Hatch
  • Geschrieben für zentrale Infrastruktur-Verwaltung
  • Löste damals verschiedene Probleme
  • In Python geschrieben
  • Open-Source-Software!

Im Angebot:

  • Massive parallel sys administration
  • Configuration Management
  • Orchestration

Wie funktioniert's?

  • Auf einem System wird der Salt-Master installiert
  • Auf allen anderen der Salt-Minion
  • Der Master sendet abstrahiert direkt Befehle an die Minions
  • Die Minions setzen diese um und antworten mit dem Ergebnis

Warum abstrahiert?

Ein Beispiel:

  1. Master sendet "Meta-Befehl"
    salt webserver1 pkg.install nginx
  2. Minion empfängt Befehl..
    und weiß für jedes OS, wie er umzusetzen ist
  3. Meldung an den Master mit Ergebnis

Massive parallel sys administration

(oder auch: Remote Execution)

  • Gedacht für sofortige Ausführung von Aktionen
  • Wird parallel auf allen Zielsystemen ausgeführt

Das Vorgehen

Aufruf des Salt-Masters mit gewünschten Zielen und einem Modul inkl. Parameter

Beispiel:

salt "*" file.append "/etc/motd" "Welcome."

Aufschlüsselung


salt "*" file.append "/etc/motd" "Welcome."
Linux-Kommando Zielangabe modul.funktion Parameter

Vielfältige Zielauswahl


  • Alles ("*")
  • Namen inkl. Regex ("webserver01" oder "webserver*")
  • An Hand von Eigenschaften ("Grains") (-G "os:Debian")
  • Kombination (-C "G@os:Debian and webserver*")

Beispiele

salt "database0*" pkg.version mysql-server
salt -G "site:frankfurt" user.add "praktikant"
salt -C "G@os:Fedora and client*" cmd.run "lastlog"

Ausführliches Beispiel



salt "*" user.add praktikant shell=/bin/bash
database01:
	True
webserver01:
	True
client01:
	True

Salt Grains

  • Grains = Eigenschaften/Attribute
  • Werden vom Minion selbst generiert
  • Enthalten Informationen zu OS, Konfiguration und HW
  • Können überall einbezogen/abgefragt werden
  • Eigene Grains sind möglich (Rolle, Standort...)
  • Grains sind mit Facts von Puppet vergleichbar

Auflistung von Grains auf einem Minion:


root@ubuntu:~# salt "ubuntu" grains.items
ubuntu:
    ----------
    SSDs:
    biosreleasedate:
        07/02/2015
    biosversion:
        6.00
    cpu_flags:
        - fpu
        - vme
        - de
        - pse
        - tsc
        - msr
        - pae
        - mce
        - cx8
        - apic
        - sep
        - mtrr
        - pge
        - mca
        - cmov
        - pat
        - pse36
        - clflush
        - dts
        - mmx
        - fxsr
        - sse
        - sse2
        - ss
        - syscall
        - nx
        - pdpe1gb
        - rdtscp
        - lm
        - constant_tsc
        - arch_perfmon
        - pebs
        - bts
        - nopl
        - xtopology
        - tsc_reliable
        - nonstop_tsc
        - aperfmperf
        - eagerfpu
        - pni
        - pclmulqdq
        - ssse3
        - fma
        - cx16
        - pcid
        - sse4_1
        - sse4_2
        - x2apic
        - movbe
        - popcnt
        - tsc_deadline_timer
        - aes
        - xsave
        - avx
        - f16c
        - rdrand
        - hypervisor
        - lahf_lm
        - abm
        - 3dnowprefetch
        - ida
        - arat
        - pln
        - pts
        - dtherm
        - hwp
        - hwp_noitfy
        - hwp_act_window
        - hwp_epp
        - fsgsbase
        - tsc_adjust
        - bmi1
        - hle
        - avx2
        - smep
        - bmi2
        - invpcid
        - rtm
        - rdseed
        - adx
        - smap
        - xsaveopt
        - xsavec
        - xgetbv1
    cpu_model:
        Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
    cpuarch:
        x86_64
    domain:
    fqdn:
        ubuntu
    fqdn_ip4:
        - 127.0.1.1
    fqdn_ip6:
    gpus:
        |_
          ----------
          model:
              SVGA II Adapter
          vendor:
              unknown
    host:
        ubuntu
    hwaddr_interfaces:
        ----------
        eno16777736:
            00:0c:29:a7:cf:5a
        lo:
            00:00:00:00:00:00
    id:
        ubuntu
    init:
        systemd
    ip4_interfaces:
        ----------
        eno16777736:
            - 192.168.126.129
            - 192.168.126.132
        lo:
            - 127.0.0.1
    ip6_interfaces:
        ----------
        eno16777736:
            - fe80::20c:29ff:fea7:cf5a
            - 192.168.126.132
        lo:
            - ::1
    ip_interfaces:
        ----------
        eno16777736:
            - 192.168.126.129
            - fe80::20c:29ff:fea7:cf5a
            - 192.168.126.132
        lo:
            - 127.0.0.1
            - ::1
    ipv4:
        - 127.0.0.1
        - 192.168.126.129
        - 192.168.126.132
    ipv6:
        - ::1
        - fe80::20c:29ff:fea7:cf5a
    kernel:
        Linux
    kernelrelease:
        4.2.0-16-generic
    locale_info:
        ----------
        defaultencoding:
            UTF-8
        defaultlanguage:
            en_US
        detectedencoding:
            UTF-8
    localhost:
        ubuntu
    lsb_distrib_codename:
        wily
    lsb_distrib_description:
        Ubuntu 15.10
    lsb_distrib_id:
        Ubuntu
    lsb_distrib_release:
        15.10
    machine_id:
        2af64fc78adf4b8ba44c1b51f10371e2
    manufacturer:
        VMware, Inc.
    master:
        localhost
    mdadm:
    mem_total:
        2991
    nodename:
        ubuntu
    num_cpus:
        2
    num_gpus:
        1
    os:
        Ubuntu
    os_family:
        Debian
    osarch:
        amd64
    oscodename:
        wily
    osfinger:
        Ubuntu-15.10
    osfullname:
        Ubuntu
    osrelease:
        15.10
    osrelease_info:
        - 15
        - 10
    path:
        /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    productname:
        VMware Virtual Platform
    ps:
        ps -efHww
    pythonexecutable:
        /usr/bin/python
    pythonpath:
        - /usr/bin
        - /usr/lib/python2.7
        - /usr/lib/python2.7/plat-x86_64-linux-gnu
        - /usr/lib/python2.7/lib-tk
        - /usr/lib/python2.7/lib-old
        - /usr/lib/python2.7/lib-dynload
        - /usr/local/lib/python2.7/dist-packages
        - /usr/lib/python2.7/dist-packages
        - /usr/lib/python2.7/dist-packages/PILcompat
        - /usr/lib/python2.7/dist-packages/ubuntu-sso-client
    pythonversion:
        - 2
        - 7
        - 10
        - final
        - 0
    saltpath:
        /usr/lib/python2.7/dist-packages/salt
    saltversion:
        2015.5.3
    saltversioninfo:
        - 2015
        - 5
        - 3
        - 0
    serialnumber:
        VMware-56 4d f9 5c be f4 5a ff-4b 98 af c7 fc a7 cf 5a
    server_id:
        1819121879
    shell:
        /bin/sh
    systemd:
        ----------
        features:
            +PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD -IDN
        version:
            225
    virtual:
        VMware
    zmqversion:
        4.0.5

Eigene Grains können wie folgt definiert werden:

  • Hard-coded in Minion-Config-File (statisch)
  • Script-generated (dynamisch)

Module und Funktionen


Module bieten ein Bündel an Funktionen für Remote-Execution an

Module beziehen sich auf ein Thema (z. B. User, Gruppen, Paket-Handling, MySQL)

Module abstrahieren das Arbeiten - "Meta-Befehle" (wie pkg.install) werden plattformspezifisch umgesetzt

Zahlreiche Module verfügbar..

Pkg cron DRBD Apache file firewalld git
glusterfs group hadoop haproxy ilo DRAC ipmi
kerberos logrotate LVM LXC memcached munin mysql
nagios oracle postfix postgres rabbitmq s3 selinux
splunk sqlite systemd udev useradd win cmd

Module helfen auch beim Aufsetzen von Diensten

Module erlauben hohen Grad an Automatisierung

Module können in eigene Scripte eingebettet werden

Beispiele!


root@ubuntu:~# salt "ubuntu" pkg.install htop
ubuntu:
    ----------
    htop:
        ----------
        new:
            1.0.3-1
        old:


root@ubuntu:~# salt "ubuntu" service.restart apache2
ubuntu:
    True

root@ubuntu:~# salt "ubuntu" cron.set_job root "*" "*" "*" "*" "*" "mycommand"
ubuntu:
    new
root@ubuntu:~# salt "ubuntu" cron.ls root
ubuntu:
    ----------
    crons:
        |_
          ----------
          cmd:
              mycommand
          comment:
              None
          daymonth:
              *
          dayweek:
              *
          hour:
              *
          identifier:
              None
          minute:
              *
          month:
              *
    env:
    pre:
    special:

root@ubuntu:~# salt "ubuntu" mount.fstab
ubuntu:
    ----------
    /:
        ----------
        device:
            overlay
        dump:
            0
        fstype:
            overlay
        opts:
            - rw
        pass:
            0
    /tmp:
        ----------
        device:
            tmpfs
        dump:
            0
        fstype:
            tmpfs
        opts:
            - nosuid
            - nodev
        pass:
            0

Configuration Management


  • Installiert und konfiguriert Dienste/Umgebungen
  • Module verfügbar, heissen aber States
  • Bezieht sich i.d.R. auf ein Zielsystem oder eine Gruppe an Zielsystemen

Vorgehensweise:


  1. State-Files schreiben
  2. Im Filesystem auf Master-Server ablegen
  3. States auf Minion(s) applyen
  4. Minion synct sich die State-Files
  5. Minion führt State-Files aus
  6. Minion meldet sich mit Ergebnis beim Master

Ein paar Infos..


Inhalte fürs Config-Mgmt können direkt im Filesystem...

oder auch im Git liegen

States können manuell angewandt werden

oder automatisiert auf den Minions, z. B. via Cron

So gelingt der Einstieg

  1. Verzeichnisstruktur mit States und Pillars erstellen
  2. States den Zielsystemen in s.g. "top.sls"-Dateien zuordnen
  3. States anwenden

(Pillars sind selbstdefinierte Attribute, wie VHost- oder Benutzernamen)

(Im "Key:Value"-Format)

(Frei definierbar)

Verzeichnisstruktur unter /srv/salt auf dem Master-Server


root@ubuntu:~# tree /srv/salt/
/srv/salt/
├── pillars
│   ├── top.sls <-- Weist Attribute bestimmten Servern zu
│   └── webservers
│       ├── users.sls <-- Definiert Benutzer
│       └── vhosts.sls <-- Definiert VHosts
└── states
    ├── top.sls <--- Weist bestimmte States bestimmten Servern zu
    ├── users.sls <--- Legt Benutzer aus Pillars an
    └── webservers
        ├── apache.sls <-- Installiert Apache
        └── nginx.sls <-- Installiert Nginx

4 directories, 7 files

Anwendung:


salt "ubuntu" state.highstate

Im Detail..

pillars/top.sls:


base:
  "ubuntu":
    - webservers.users
    - webservers.vhosts

pillars/webservers/users.sls:


users:
  - valentin.hoebel
  - max.mustermann
  - hans.wurst
  - local.horst

pillars/webservers/vhosts.sls:


vhosts:
  - hoebel.net
  - xenuser.org
  - localhost

Kontrolle:


root@ubuntu:/srv/salt/pillars/webservers# salt "ubuntu" pillar.items
ubuntu:
    ----------
    users:
        - valentin.hoebel
        - max.mustermann
        - hans.wurst
        - local.horst
    vhosts:
        - hoebel.net
        - xenuser.org
        - localhost

states/top.sls:


base:
  "ubuntu":
    - users
    - webservers.apache

states/users.sls:


{% for user in pillar['users'] %}

{{ user  }}:
  user.present:
    - shell: /bin/bash
    - home: /home/{{ user }}

{% endfor %}

states/webserver/apache.sls:


apache2:
  pkg.installed

Ausführung:


root@ubuntu:/srv/salt/states# salt ubuntu state.highstate
ubuntu:
----------
          ID: valentin.hoebel
    Function: user.present
      Result: True
     Comment: New user valentin.hoebel created
     Started: 12:07:22.116277
    Duration: 17.248 ms
     Changes:
              ----------
              fullname:
              gid:
                  1000
              groups:
                  - valentin.hoebel
              home:
                  /home/valentin.hoebel
              homephone:
              name:
                  valentin.hoebel
              passwd:
                  x
              roomnumber:
              shell:
                  /bin/bash
              uid:
                  1000
              workphone:
----------
          ID: max.mustermann
    Function: user.present
      Result: True
     Comment: New user max.mustermann created
     Started: 12:07:22.133608
    Duration: 12.644 ms
     Changes:
              ----------
              fullname:
              gid:
                  1001
              groups:
                  - max.mustermann
              home:
                  /home/max.mustermann
              homephone:
              name:
                  max.mustermann
              passwd:
                  x
              roomnumber:
              shell:
                  /bin/bash
              uid:
                  1001
              workphone:
----------
          ID: hans.wurst
    Function: user.present
      Result: True
     Comment: New user hans.wurst created
     Started: 12:07:22.146331
    Duration: 8.521 ms
     Changes:
              ----------
              fullname:
              gid:
                  1002
              groups:
                  - hans.wurst
              home:
                  /home/hans.wurst
              homephone:
              name:
                  hans.wurst
              passwd:
                  x
              roomnumber:
              shell:
                  /bin/bash
              uid:
                  1002
              workphone:
----------
          ID: local.horst
    Function: user.present
      Result: True
     Comment: New user local.horst created
     Started: 12:07:22.154930
    Duration: 7.544 ms
     Changes:
              ----------
              fullname:
              gid:
                  1003
              groups:
                  - local.horst
              home:
                  /home/local.horst
              homephone:
              name:
                  local.horst
              passwd:
                  x
              roomnumber:
              shell:
                  /bin/bash
              uid:
                  1003
              workphone:
----------
          ID: apache2
    Function: pkg.installed
      Result: True
     Comment: The following packages were installed/updated: apache2
     Started: 12:07:22.304957
    Duration: 4925.393 ms
     Changes:
              ----------
              apache2:
                  ----------
                  new:
                      2.4.12-2ubuntu2.1
                  old:
              apache2-api-20120211:
                  ----------
                  new:
                      1
                  old:
              apache2-bin:
                  ----------
                  new:
                      2.4.12-2ubuntu2.1
                  old:
              apache2-data:
                  ----------
                  new:
                      2.4.12-2ubuntu2.1
                  old:
              apache2-utils:
                  ----------
                  new:
                      2.4.12-2ubuntu2.1
                  old:
              httpd:
                  ----------
                  new:
                      1
                  old:
              httpd-cgi:
                  ----------
                  new:
                      1
                  old:

Summary
------------
Succeeded: 5 (changed=5)
Failed:    0
------------
Total states run:     5

Ein paar Tipps:

  • Pillars verwenden, wann immer möglich
  • Modular schreiben für Wiederverwendbarkeit
  • Saubere Verzeichnisstruktur pflegen wgn. Übersicht
  • Besser viele kleine States als Monster-States

Orchestration


  • Kann Aktionen in gewünschter Reihenfolge abarbeiten
  • Abhängigkeiten definierbar
  • Führt Module und States (Mischung aus Remote-Execution und Config-Mgmt)..
  • ..systemübergreifend aus

Vorgehensweise:

  1. Plan erstellen
  2. State-Files schreiben
  3. Orchestration-State (Masterplan) schreiben
  4. Im Filesystem auf Master-Server ablegen
  5. Orchestrierung anwenden

Ein Beispiel

Load-Balancer-Umgebung

Die Herausforderung


  • Reihenfolge: Erst Backends, dann Load-Balancer
  • Abhängigkeit: Load-Balancer erst, wenn Backends funktional

Der Plan

  1. Setze backend01 auf
  2. Setze backend02 auf
  3. Prüfe beide Backends
  4. Setze Load-Balancer auf
  5. Prüfe Load-Balancer
  6. Einträge in Nagios erzeugen o.ä.

Leider kein veranschaulichendes Beispiel aus Zeit- und Platzgründen

Weitere Beispiele für Orchestrierung

Einrichtung MySQL-Replika

Einrichtung von Clustern

Technische Umsetzung von (komplexen) Workflows

Was kann Salt noch?

Salt Cloud


Salt Cloud provisioniert und verwaltet Systeme in Cloud- und Virtualisierungsumgebungen

Unterstützt zahlreiche Anbieter und Lösungen, wie Amazon EC2, Azure, Digital Ocean, Google Compute, Joyent, Rackspace, OpenStack, VMWare..

Damit wird Salt zum Management-Werkzeug für hybride Clouds!

Salt Mine


Daten von Minions werden auf Master gespeichert

Aktualisierung der Daten in kurzen Intervallen (anders als Grains)

Die Daten stehen überall in Salt zur Verfügung

Beispiel: Erfassung von Metriken

Erlaubt dynamisches Verhalten bei unterschiedlichen Werten

Salt Reactor


Salt Reactors lauschen auf spezifizierte Events...

.. und können dann Aktionen lostreten

Beispiele:

  • Neue Backends tragen sich automatisch im LB ein
  • Neue Hosts tragen sich automatisch im Nagios ein

Salt Syndic

"Zwischen-Master" bzw. "Pass-Through-Master"

Salt Proxy

Eine Art Light-Minion für Kommunikation mit Drittgeräten...

... auf denen kein Salt-Minion laufen kann

Kommunikations-Interface muss i.d.R. selbst geschrieben werden

Beispiele für Drittsysteme: Netzwerk-Geräte, Lampen, IoT-Geräte, Smartphones

Voraussetzung: Ziel ist "irgendwie" über eine IP erreichbar

Mehr Infos hier.

Weitere Features

  • Files auf Minion kopieren
  • Files von Minions einsammeln
  • Rückgabe von Minion in MySQL speichern ("Returner")

Fast geschafft ;)

Vorteile von SaltStack


  • "Viele Tools in einem"
  • Riesiger Funktionsumfang
  • Schnell, parallel, skalierbar (10.000e Server), flexibel
  • Benötigt *kein* SSH!
  • Fundament für Vollautomatisierung
  • Viel Dokumentation verfügbar
  • Große Community

Nachteile von SaltStack


  • Gewisse Einstiegshürden bei Config-Mgmt
  • Personal zu finden ist nicht ganz leicht
  • Anzahl an Büchern und deutschsprachigen Artikeln begrenzt
  • Hat Abhängigkeit von Python

Typische Einsatzszenarien

Infrastruktur-Mgmt. Config-Mgmt. Automatisierung
Standardisierung Umsetzung von Workflows Client-Verwaltung

Präsentationsende


Modernes Infrastrukturmanagement
mit SaltStack


Eine Einführung von Valentin Hoebel


Quellen: Bilder/Fotos / Diagramme / SaltStack-Dokumentation
Präsentation erstellt mit Reveal.JS.
Download hier (https://github.com/xenuser/saltstackpresentation).