Server Installation/Ansible: Unterschied zwischen den Versionen

Aus Opennet
Wechseln zu: Navigation, Suche
(Vorbereitung)
(Rollen "olsr-node", "python-module" und "dns-slave-server" beschrieben)
Zeile 76: Zeile 76:
 
# Änderungen via git committen
 
# Änderungen via git committen
  
 +
 +
= Vorbereitung eines neuen verwalteten Hosts =
 +
# den eigenen ssh-Schlüssel manuell importieren
 +
# den Hostnamen in die ''hosts''-Datei eintragen
 +
# eine Datei für den Host unter ''host_vars/'' erstellen (basierend auf der Kopie einer vorhandenen Host-Datei)
  
 
= Rollen-Details =
 
= Rollen-Details =
  
 
== basic-server ==
 
== basic-server ==
Diese Rolle ist für alle opennet-Server geeignet. Im Wesentlichen sorgt es für eine einfache Verteilung der ssh-Schlüssel von Administratoren und Maschinen-Accounts (z.B. Backup).
+
Diese Rolle ist für alle opennet-Server geeignet.
  
=== Vorbereitung eines neuen Hosts ===
+
{{hinweis|Nach der ersten Anwendung wird eventuell das olsr-Routing durch die firewall-Regeln blockiert. Stelle also sicher, dass der Host auch ohne OLSR erreichbar ist. Erst die darauffolgende Rolle ''olsr-node'' öffnet die olsr-Ports.}}
# eigenen ssh-Schlüssel manuell importieren
+
# Host in die ''hosts''-Datei eintragen
+
  
 
=== Ablauf ===
 
=== Ablauf ===
* Übertragung von ssh-Schlüsseln
+
# Verteilung der ssh-Schlüssel von Administratoren und Maschinen-Accounts (z.B. Backup)
* typische Server-Pakete installieren
+
# grundlegende Firewall-Konfiuguration mit ferm
* ''munin-node'' für Monitoring vorkonfigurieren
+
# munin-Node installieren
 +
# automatische Aktualisierung der Opennet-CA-Widerrufslisten
 +
 
 +
== olsr-node ==
 +
Konfiguration eines olsr-Knoten. Dazu gehört neben der olsr-Konfiguration auch Policy-Routing um sicherzustellen, dass Anfragen/Weiterleitungen aus nicht-olsr-Schnittstellen auf demselben Interface beantwortet werden.
 +
 
 +
=== Ablauf ===
 +
# olsr installieren und konfigurieren
 +
# Policy-Routing konfiugrieren (Routing-Tabelle anlegen, zusätzliche Routing-Regeln beim Booten erzeugen)
 +
# ferm/firewall-Regeln: Markierung von eingehenden Paketen aus nicht-olsr-Schnittstellen (für die obigen Regeln)
  
 
== ugw-server ==
 
== ugw-server ==
Diese Rolle ist für die neuen UGW-Server (ab 2015) geeignet (zur Zeit: [[Server/erina]] und [[Server/megumi]]).
+
Diese Rolle verwenden wir für die neuen UGW-Server seit 2015 ([[Server/erina]], [[Server/subaru]] und [[Server/megumi]]).
  
=== Vorbereitung eines neuen Hosts ===
+
TODO: Zertifikate erzeugen (Schlüssel und Zertifikat müssen aktuell per Hand erzeugt und auf den Server übertragen werden)
# siehe ''basic-server''-Rolle
+
# eine Datei für den Host unter ''host_vars/'' erstellen (basierend auf einer vorhandenen UGW-Datei in diesem Verzeichnis)
+
# TODO: Zertifikate erzeugen (Schlüssel und Zertifikat müssen aktuell per Hand erzeugt und auf den Server übertragen werden)
+
  
=== Hinweise ===
+
{{hinweis|Wähle einen geeigneten Zeitpunkt für die Anwendung dieser Konfiguration aus. Vor allem die Änderung der openvpn-Konfiguration führt zu einer kurzzeitigen Trennung aller Clients.}}
Wähle einen geeigneten Zeitpunkt für die Anwendung dieser Konfiguration aus. Vor allem die Änderung der openvpn-Konfiguration führt zu einer kurzzeitigen Trennung aller Clients.
+
  
 
=== Ablauf ===
 
=== Ablauf ===
* Netzwerk-Konfiguration
+
# Netzwerk-Konfiguration
* DNS-Server (bzw. Zonen-Slave)
+
# DNS-Server (bzw. Zonen-Slave)
* OLSRD
+
# ugw-spezifsiche Firewall-Details
* Firewall
+
# OpenVPN (Konfiguration, Skripte, Zertifikate)
* OpenVPN (Konfiguration, Skripte, Zertifikate)
+
# OpenVPN-Statusseite (z.B. http://erina.opennet-initiative.de/vpnstatus)
* OpenVPN-Statusseite (z.B. http://erina.opennet-initiative.de/vpnstatus)
+
# opennet-spezifische Munin-Plugins für UGW-Server
* opennet-spezifische Munin-Plugins für UGW-Server
+
# Dateien für Download-Tests erzeugen
* Dateien für Download-Tests erzeugen
+
  
== DNS-Server ==
+
== python-module ==
 +
Übertrage ein paar opennet-spezifische Python-Module auf die Hosts, die für die UGW-Rolle erforderlich sind.
 +
 
 +
=== Ablauf ===
 +
# Module kopieren
 +
# Abhängigkeiten installieren
 +
 
 +
== DNS-Slave-Server ==
 +
Diese Rolle konfiguriert auf einem Server alle relevanten Details für einen DNS-Slave, der dem Hidden-Primary-Server auf [[Server/heartofgold]] folgt.
 +
 
 +
=== Ablauf ===
 +
# Bind installieren
 +
# geheimen DNS-Key von [[Server/heartofgold]] abholen
 +
# Bind konfigurieren (inkl. DNS-Key)
 +
# Firewall-Regel für tcp-Zugriff auf bind hinzufügen (für Zonen-Transfer)

Version vom 10. Dezember 2015, 06:26 Uhr

Inhaltsverzeichnis

Überblick

ansible ist eine Konfigurationsmanagement-Software basierend auf Python. Es benötigt für die Client-Konfiguration lediglich eine ssh-Verbindung. Auf der Client-Seite ist keine spezifische Software erforderlich.

Innerhalb von Opennet setzen wir ansible für die Konfiguration der UGW-Server ein.

Die Konfigurationsverwaltung wird durch clonen unseres ansible-Repositories und lokale Ausführung auf dem eigenen Rechner angewandt.


Vorbereitung

Die folgenden Schritte sind auszuführen, um die Ansible Konfigurationsverwaltung auf einen oder mehrere Hosts anzuwenden.

  1. Paket auf einem persönlichen Linux/Unix Host installieren (Bsp. Debian, Installation erfordert root-Rechte): sudo apt-get install ansible
  2. git Repository auschecken: git clone https://dev.opennet-initiative.de/git/on_ansible (siehe Opennet DEV)
  3. den eigenen SSH Schlüssel auf den zu konfigurierenden Servern autorisieren (lassen)

Verzeichnisstruktur

Im ansible-Verzeichnis gibt es mehrere Dateien und Unterverzeichnisse.

Globale Struktur

hosts
Diese Datei enthält das sogenannte Inventory von ansible.
Hier werden alle Hosts aufgeführt, sowie Gruppen zugeordnet.
playbook-*.yml
Ein Playbook enthält Variablendefinitionen, sowie eine Liste von Aufgaben/Zuständen, die auf bestimmte Hosts angewandt werden sollen.
Der Dateiname einer playbook-Datei spielt keine Rolle - die Playbooks werden ausschließlich manuell ausgeführt.
host_vars/
Für jeden Host kann hier eine gleichnamige Datei (HOSTNAME.yml) abgelegt werden, die Host-spezifische Einstellungen (vor allem: IPs und Interface-Namen) enthält.
roles/
Eine Rolle ist in ansible eine Zusammenstellung von Konfigurationen, die auf gewisse Hosts angewandt werden sollen.
Beispielsweise können alle notwendigen Einstellungen für den Betrieb eines DNS-Servers in einer eigenen Rolle zusammengefasst werden.

Rollen-spezifische Struktur

Unterhalb jedes roles-Unterverzeichnis ist die folgende Struktur üblich:

defaults/main.yml
Variablen, die innerhalb dieser Rolle für alle Hosts gelten sollen. Sie können durch Host-spezifische Variablen überschrieben werden.
handlers/main.yml
Im Anschluss an die Änderungen von Dateien müssen unter Umständen Dienste neugestartet werden. Diese Handler werden nur bei tatsächlichen Änderungen ausgeführt.
files/
Per Konvention werden in diesem Verzeichnis zu kopierende Dateien abgelegt. Das copy-Modul verwendet diesen Pfad automatisch als Präfix für relative Pfadangaben.
templates/
Per Konvention werden in diesem Verzeichnis Dateien abgelegt, die Template-Platzhalter enthalten. Das template-Modul verwendet diesen Pfad automatisch als Präfix für relative Pfadangaben.
tasks/
Per Konvention beinhaltet die Datei main.yml in diesem Verzeichnis include-Direktiven zum Einbinden weiterer Dateien in diesem Unterverzeichnis.
Die task-Dateien enthalten die Beschreibungen von herzustellenden Konfigurationen (vorhandene Pakete, Dateien, usw.).

Variablen

Host-spezifische, Rollen-spezifische oder globale Variablen können an verschiedenen Stellen mit unterschiedlicher Priorität definiert werden (siehe ansible-Dokumentation).

Globale Variablen
hosts-Datei in der [all:vars]-Sektion
Rollen-spezifische Variablen für alle Hosts
roles/*/defaults/
Host-spezifische Variablen
host_vars/

Übliche Aufgaben

  • alle Konfigurationen anwenden: ansible-playbook ~/ansible/playbook-ugw-server.yml
  • einen einzigen Server konfigurieren: ansible-playbook ~/ansible/playbook-ugw-server.yml --limit=HOSTNAME.on-i.de
  • auf anwendbare Änderungen prüfen ohne sie auszuführen: ansible-playbook ~/ansible/playbook-ugw.yml --limit=HOSTNAME.on-i.de --check
  • Informationen (inkl. interner Variablen) eines Hosts anzeigen: ansible -m setup HOSTNAME.on-i.de
  • Dokumentation zu einem ansible-Modul anzeigen: ansible-doc synchronize


Anwendungspolicy

Folgende Abfolge von Schritten ist für eine sichere Verwendung des Werkzeugs Konfigurationverwaltung zu empfehlen:

  1. kleinschrittige Änderungen vornehmen
  2. Änderungen im ersten Versuch nur auf einen einzigen Host anwenden (z.B. ansible-playbook .... --limit HOSTNAME)
    1. idealerweise beim ersten Versuch mit den zusätzlichen Optionen --checkk --diff (keine Änderungen; Unterschiede anzeigen)
  3. die Ausgabe des ansible-Playbook-Laufs sorgfältig auf erwartete und unerwartete Änderungen prüfen
  4. die Wirksamkeit der Änderungen auf dem Host prüfen (funktionieren die Dienste noch?)
  5. Änderungen auf alle Hosts anwenden
  6. Wirksamkeit und Funktionsfähigkeit der Dienste prüfen
  7. Änderungen via git committen


Vorbereitung eines neuen verwalteten Hosts

  1. den eigenen ssh-Schlüssel manuell importieren
  2. den Hostnamen in die hosts-Datei eintragen
  3. eine Datei für den Host unter host_vars/ erstellen (basierend auf der Kopie einer vorhandenen Host-Datei)

Rollen-Details

basic-server

Diese Rolle ist für alle opennet-Server geeignet.


Ablauf

  1. Verteilung der ssh-Schlüssel von Administratoren und Maschinen-Accounts (z.B. Backup)
  2. grundlegende Firewall-Konfiuguration mit ferm
  3. munin-Node installieren
  4. automatische Aktualisierung der Opennet-CA-Widerrufslisten

olsr-node

Konfiguration eines olsr-Knoten. Dazu gehört neben der olsr-Konfiguration auch Policy-Routing um sicherzustellen, dass Anfragen/Weiterleitungen aus nicht-olsr-Schnittstellen auf demselben Interface beantwortet werden.

Ablauf

  1. olsr installieren und konfigurieren
  2. Policy-Routing konfiugrieren (Routing-Tabelle anlegen, zusätzliche Routing-Regeln beim Booten erzeugen)
  3. ferm/firewall-Regeln: Markierung von eingehenden Paketen aus nicht-olsr-Schnittstellen (für die obigen Regeln)

ugw-server

Diese Rolle verwenden wir für die neuen UGW-Server seit 2015 (Server/erina, Server/subaru und Server/megumi).

TODO: Zertifikate erzeugen (Schlüssel und Zertifikat müssen aktuell per Hand erzeugt und auf den Server übertragen werden)


Ablauf

  1. Netzwerk-Konfiguration
  2. DNS-Server (bzw. Zonen-Slave)
  3. ugw-spezifsiche Firewall-Details
  4. OpenVPN (Konfiguration, Skripte, Zertifikate)
  5. OpenVPN-Statusseite (z.B. http://erina.opennet-initiative.de/vpnstatus)
  6. opennet-spezifische Munin-Plugins für UGW-Server
  7. Dateien für Download-Tests erzeugen

python-module

Übertrage ein paar opennet-spezifische Python-Module auf die Hosts, die für die UGW-Rolle erforderlich sind.

Ablauf

  1. Module kopieren
  2. Abhängigkeiten installieren

DNS-Slave-Server

Diese Rolle konfiguriert auf einem Server alle relevanten Details für einen DNS-Slave, der dem Hidden-Primary-Server auf Server/heartofgold folgt.

Ablauf

  1. Bind installieren
  2. geheimen DNS-Key von Server/heartofgold abholen
  3. Bind konfigurieren (inkl. DNS-Key)
  4. Firewall-Regel für tcp-Zugriff auf bind hinzufügen (für Zonen-Transfer)
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Start
Opennet
Kommunikation
Karten
Werkzeuge