---
format: markdown
toc: yes
title: Tinc mit Ansible konfigurieren
categories: VPN
...

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](http://docs.ansible.com/ansible/index.html) 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
~~~
