Tinc mit Ansible konfigurieren

Notation: ffdorX = Name des Tinc hosts (X = 1,2,…); ffdotT = Tinc Instanz (T = a,b,…).

Konfiguration

Zunächst kopierst Du dieses Verzeichnis hier (also das, in dem dieses README liegt:) rekursiv auf Deinen Ansible controller (zB Laptop), etwa nach ~/ansible. Dort führst Du die folgenden Konfigurationen durch.

inventory

Ein Tinc host namens ffdorX …

  • … erhält ein file inventory/host_vars/ffdorX.yaml, in dem mindestens tinc_hostname: ffdorX enthalten ist.
    Wenn der tincd dieses hosts von außen erreichbar ist, dann sollte die lokale Adresse, mit denen er auf Verbindungen von außen lauschen soll, in tinc_bindtoaddresses: [ "A.B.C.D" ] gesetzt werden. Befindet sich der host hinter NAT mit port forwarding, so ist das seine lokale RFC1918-Adresse, an die der NAT router weiterleitet.
    Falls Ansible nur benutzt wird, um die Tinc Konfiguration für den Router ffdorX zu erzeugen, aber nicht um sie direkt per Ansible zu installieren, dann tinc_install: no setzen.
  • … wird in inventory/hosts in diejenigen Tinc groups eingetragen, an denen er teilnehmen soll. Also jeweils unter [ffdotT] sowie dem zutreffenden Betriebssystem [FreeBSD] bzw. [Linux].
  • … wird in die Variablendefinitionen der Tinc-Instanzen, an denen er teilnimmt, eingetragen. Diese befinden sich in inventory/role_vars/ffdotT.yaml und umfassen je beteiligtem host folgende Variablen:
  - tinc_hostname: ffdorX
    tinc_hostnumber: X
    tinc_addresses: [ "A.B.C.D", "A:B::C:D" ]
    tinc_fib: F

tinc_addresses (optional) sind die public IPs, unter denen dieser tincd Prozess erreichbar ist. tinc_fib (optional) ist die FIB (forwarding table des kernels), welche der tincd dieser Instanz benutzen soll. (tinc_fib funktioniert zZ nur mit FreeBSD; für Linux lässt sich das hoffentlich noch klären.)

secret

Das Unterverzeichnis secret für die Tinc keys befindet sich nicht hier im repository. Du legst es also manuell an:

  • In das Verzeichnis secret/tinc/ffdotT/hosts werden die public keys der an Instanz T beteiligten hosts gelegt. (Ohne “Address” Zeilen o.dgl.!)
  • Für den host ffdorX, dessen Konfiguration Du mit Ansible erzeugst, legst Du dessen private key für die Instanz ffdotT an die Stelle secret/tinc/ffdotT/ffdorX.priv. Existiert dieser noch nicht, erzeugt Ansible ein Schlüsselpaar. (Zur Erzeugung eines Schlüsselpaares wird ein installierter tincd auf dem Ansible controller benötigt.)

Benutzung

Der Aufruf von Ansible erfolgt im Ansible-Verzeichnis (also zB ~/ansible) mit

ansible-playbook Tinc.yaml

Wenn die Konfiguration stimmig ist, findest Du anschließend im Unterverzeichnis staging/ffdorX die für den host ffdorX erzeugten Tinc-Dateien.

Den Inhalt von staging/ffdorX kannst Du nun manuell auf den host ffdorX kopieren (zB als tarball).

Wenn Du den Router ffdorX mit Ansible direkt managen willst (und dort Python und sudo installiert hast), dann solltest Du in inventory/host_vars/ffdorX.yaml ein tinc_install: yes setzen. Der aktuelle default Wert für diese und einige andere Variablen befindet sich roles/tinc/defaults/main.yaml.

Nach getaner Arbeit kannst Du im Ansible-Verzeichnis mit rm -rf staging work aufräumen. Dort befinden sich nur Dateien, die von Ansible (bei jedem Durchlauf des playbooks) generiert werden.

Du kannst das Result eines Durchlaufs aber auch zur Seite legen, um es mit dem Ergebnis eines Folgedurchlaufs zu vergleichen. Etwa um zu sehen, ob Deine Veränderungen an der Ansible-Konfiguration die gewünschten Änderungen am Ergebnis (also der Tinc-Konfiguration) erbracht haben:

% ansible-playbook Tinc.yaml
% mv staging staging.bak
% # vi inventory/...
% # vi roles/tinc/templates/...
% ansible-playbook Tinc.yaml
% diff -r staging.bak staging