papanito.cloudflared
Ansible-Rolle "papanito.cloudflared"
Diese Ansible-Rolle lädt cloudflared auf dem Host herunter und installiert es. Optional wird der [argo-tunnel] als Dienst installiert.
Änderungen in Version 3.0.0
Dies ist eine wichtige Änderung, um das neue Verhalten von benannten Tunneln widerzuspiegeln.
Die Rolle kümmert sich um die Bereinigung, wenn Sie die Rolle vor v.3.0.0 verwendet haben. Allerdings müssen Sie die Konfiguration (Variablen) in Ihrem Ansible-Projekt aktualisieren. Ich habe die Variablen umbenannt, häufig mit
cf_vorangestellt, um sie eindeutig für die Rolle zu machen. Wenn sie nicht eindeutig sind, kann es zu unerwünschten Nebeneffekten kommen, wenn Variablen mit dem gleichen Namen in verschiedenen Rollen verwendet werden.
Cloudflared und Apps mit Tunneln verbinden
Laut [1] müssen Sie zunächst Folgendes tun, um Tunnel zu erstellen und zu verwalten:
- Cloudflared herunterladen und installieren auf Ihrem Computer.
- Cloudflared authentifizieren.
Sobald cloudflared installiert und authentifiziert ist, umfasst der Prozess, um Ihren ersten Tunnel zum Laufen zu bringen, 3 grundlegende Schritte:
Die Schritte 4-5 werden einmal pro Tunnel ausgeführt, normalerweise von einem Administrator, und Schritt 6 wird ausgeführt, wann immer der Tunnel gestartet werden soll, normalerweise von dem, der den Tunnel besitzt (der möglicherweise nicht der Administrator ist).
Was macht die Rolle?
Die Rolle hat tatsächlich zwei Zwecke:
Server-seitige Daemon-Installation
Die Rolle kümmert sich nur um das Einrichten des Dienstes auf den Knoten, d.h. Schritte 1, 2, 4 und 5 von oben, weil
Das Erstellen von Tunneln und das Ermöglichen von Routen ist eine Aufgabe, die von einem Administrator und nicht von der Rolle erledigt werden sollte [1].
Sie können ein oder mehrere [benannte Tunnel] sowie [einzelne Dienste] konfigurieren - normalerweise benötigen Sie mit [benannten Tunneln] nur einen Daemon. Die Rolle führt tatsächlich diese Schritte aus:
Herunterladen und Installieren des Binaries gemäß [Downloads].
Installieren/konfigurieren des Daemons - siehe Daemon authentifizieren.
Für [benannte Tunnel] wird eine [Zugangsdaten-Datei] unter
{{ cf_credentials_dir }}/{{ tunnel_id }}.jsonerstellt, die ähnlich aussieht wie:{"AccountTag":"{{ account_tag }}","TunnelSecret":"{{ tunnel_secret }}","TunnelID":"{{ tunnel_id }}","TunnelName":"{{ cf_tunnels.key }}"}Für jeden Schlüssel in
cf_tunnelswird eine Tunnelkonfiguration in/etc/cloudflareerstellt.Die Datei wird
{{ tunnel }}.ymlgenannt und die minimale Konfiguration sieht wie folgt aus:benannte Tunnel
tunnel: {{ cf_tunnels.key }} credentials-file: {{ cf_credentials_dir }}/{{ tunnel_id }}.json ingress: {{ item.value.ingress }}einzelner Dienst
hostname: {{ hostname }} url: {{ url }}Zusätzliche Parameter werden mit Tunnel-Konfigurationsparametern konfiguriert.
Abhängig von Ihrem Init-System - gesteuert durch
cf_init_system- macht die Rolle Folgendes:Systemd
Erstellt eine [systemd-unit-template]
cloudflared@{{ tunnel }}.serviceund startet eine Instanz für jeden Dienst in der Liste voncf_tunnels.cloudflared tunnel --config {{ tunnel }}.ymlInit-V Systeme
- Installiert cloudflared service nach
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}. - Verlinkt das Stop-Skript zu
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}. - Verlinkt das Start-Skript zu
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}.
- Installiert cloudflared service nach
Wenn Sie [benannte Tunnel] verwenden, erstellt die Rolle auch eine [DNS-Route].
SSH-Client-Konfiguration
Von dort, wo Sie auf Ihre Knoten über SSH zugreifen, die über cloudflared weitergeleitet werden, müssen Sie die [SSH-Guide-Client] befolgen. Sie müssen Folgendes hinzufügen:
Host xxx.mycompany.com
ProxyCommand /usr/bin/cloudflared access ssh --hostname %h
Sie können diese Konfiguration erreichen, wenn Sie cf_ssh_client_config aktivieren. Zusätzlich müssen Sie auch cf_ssh_client_config_group angeben. Angenommen, Ihr Inventar sieht folgendermaßen aus:
all:
children:
servers:
hosts:
host001:
host002:
Wenn Sie cf_ssh_client_config_group: servers angeben, erhalten Sie einen Eintrag für host001 und host002.
Anforderungen
Keine
Rollenvonvariablen
Installations- und Deinstallationsparameter
Die folgenden Parameter steuern die Installation und/oder Deinstallation:
| Parameter | Beschreibung | Standardwert |
|---|---|---|
cf_download_baseurl |
Basis-URL für cloudflare-Binaries |
https://github.com/cloudflare/cloudflared/releases/latest/download/ |
cf_install_only |
Auf true setzen, wenn Sie nur das Binary ohne Konfiguration oder Anmeldung installieren möchten |
false |
cf_ssh_client_config |
Auf true setzen, wenn Sie die Proxy-Konfiguration für Ihren [SSH-Guide-Client] einrichten möchten, siehe SSH-Client-Konfiguration |
false |
cf_ssh_client_config_group |
Name der Inventargruppe, für die die SSH-Proxy-Konfiguration erstellt werden soll, siehe SSH-Client-Konfiguration | `` |
cf_force_install |
Auf true setzen, wenn Sie cloudflared neu installieren möchten. Standardmäßig wird davon ausgegangen, dass cloudflared als Dienst läuft und automatisch aktualisiert. |
false |
cf_remove_unused_tunnel |
Entfernt ungenutzte cf_tunnels, d.h. cf_tunnels, die laufen, aber nicht in cf_tunnels aufgeführt sind. |
false |
cf_remove_setup_certificate |
Entfernen Sie cert.pem nach der Installation des Dienstes | false |
cf_credential_file_base |
Ordner, in dem die Zugangsdaten-Dateien gespeichert werden | /root/.cloudflared/ |
cf_config_dir |
Ordner, in dem die Cloudflare-Konfigurationsdateien gespeichert werden | /etc/cloudflared |
cf_os_package_enable |
Verwenden Sie das OS-Paketierungssystem und das Cloudflare-Paket-Repository (derzeit nur Debian/Ubuntu) | false |
cf_repository_key_url |
Wenn cf_os_package_enable auf true gesetzt ist, URL des GPG-Schlüssels für das APT-Repository | https://pkg.cloudflare.com/pubkey.gpg |
cf_repository_key_install_path |
Wenn cf_os_package_enable auf true gesetzt ist, Pfad zum Installieren des GPG-Schlüssels für das APT-Repository | /usr/share/keyrings/cloudflare-main.gpg |
cf_repository |
Wenn cf_os_package_enable auf true gesetzt ist, URL für das Cloudflare APT-Repository | deb [signed-by={{ cf_repository_key_install_path }}] https://pkg.cloudflare.com/cloudflared {{ ansible_distribution_release }} main |
cf_binary_name |
Name des Cloudflare-Daemon-Binaries - nur ändern, wenn Sie wissen, was Sie tun | cloudflared |
Cloudflared Dienstparameter
Diese Parameter sind erforderlich, um den Systemdienst zu erstellen.
| Parameter | Beschreibung | Standardwert |
|---|---|---|
cf_init_system |
Definiere, welches Init-Dienst verwendet werden soll. Mögliche Werte sind systemd und initv |
systemd |
cf_systemd_user |
Benutzer für den systemd-Dienst im Falle von cf_init_system: systemd |
root |
cf_systemd_group |
Gruppe für den systemd-Dienst im Falle von cf_init_system: systemd |
root |
cf_cert_location |
Standort des zu kopierenden Zertifikats - siehe Daemon authentifizieren | - |
cf_cert_content |
Inhalt des zu kopierenden Zertifikats - siehe Daemon authentifizieren | - |
cf_tunnels |
[Mandatory] Liste der Tunnel-Dienste, die jeweils Cloudflare-Parameter definieren | - |
cf_sysctl_buffer_size_increase |
Erhöht die von OS erlaubte UDP-Empfangspuffergröße (nicht BSD) - mehr Details | false |
Es wird empfohlen, [benannte Tunnel] für cf_tunnels zu verwenden, die Cloudflare benannte Tunnelparameter erfordern, aber Sie können auch Cloudflare-legacy-Tunnelparameter verwenden.
Cloudflare benannte Tunnelparameter
...
cf_tunnels:
test:
routes:
dns:
- "{{ inventory_hostname }}"
cidr:
- "192.168.42.0/24"
lb:
- hostname: website.mycompany.com
poolname: bzh-west1.website.mycompany.com
account_tag: !vault....
tunnel_secret: !vault....
tunnel_id: !vault....
ingress:
- hostname: website.mycompany.com
service: http://localhost:1313
- hostname: hello.mycompany.com
service: hello_world
- hostname: ssh.mycompany.com
service: ssh://localhost:22
- service: http_status:404
Der key des Tunnels sollte mit dem tunnel_id übereinstimmen.
| Parameter | Beschreibung | Standardwert |
|---|---|---|
account_tag |
[Mandatory] Account-Tag aus der [Zugangsdaten-Datei], die beim Erstellen eines Tunnels generiert wird | - |
tunnel_secret |
[Mandatory] Tunnelgeheimnis aus der [Zugangsdaten-Datei], die beim Erstellen eines Tunnels generiert wird | - |
tunnel_id |
[Mandatory] Tunnel-ID aus der [Zugangsdaten-Datei], die beim Erstellen eines Tunnels generiert wird | - |
ingress |
[Mandatory] [Ingress-Regeln] für den Tunnel | - |
routes |
Liste der Routen, die erstellt werden sollen. Momentan erlaubt es eine Liste für dns-Routen (siehe Beispiel oben) |
- |
Routen
DNS
dns-Routen erwarten eine Liste von CNAMEs, die wie hier beschrieben erstellt werden sollen. Wenn der CNAME bereits existiert, wird die Aufgabe übersprungen, aber kein Fehler ausgelöst. Fügen Sie nur CNAME hinzu, keinen FQDN, da der FQDN von cloudflared bestimmt wird.
Privates Netzwerk
private network-Routen erwarten eine Liste von CIDRs, die erstellt werden sollen, wie hier beschrieben. Das Playbook läuft durch die Liste, um cloudflared tunnel route ip add {{ cf_cidr_entry }} {{ cf_tunnel.key }} auszuführen. Wenn der CIDR bereits existiert, wird ein Fehler ausgelöst, aber ignoriert.
Lastenausgleich
lb-Routen erwarten eine Liste von bestehenden cloudflared Lastenausgleichern (plus ihres Pools), auf denen Tunnel geroutet werden sollen, wie hier beschrieben. Das Playbook läuft durch die Liste, um cloudflared tunnel route lb {{ cf_tunnel.key }} {{ cf_lb_entry.host_name }} {{ cf_lb_entry.pool_name }} auszuführen. Wenn der Tunnel bereits im Pool gebunden ist, wird ein ignorierter Fehler ausgelöst.
Cloudflare einzelne Dienstparameter
Wie bei vorherigen Versionen dieser Rolle können Sie den [Einzelservice-Konfigurationsstil][single service] verwenden.
Wenn Sie den Verkehr nur an einen lokalen Dienst weiterleiten müssen, können Sie dies mit der Konfigurationsdatei tun. Alternativ können Sie die Einzelservice-Konfiguration einrichten.
cf_tunnels:
ssh:
hostname: xxx
url: ssh.mycompany.com
| Parameter | Beschreibung | Standardwert |
|---|---|---|
hostname |
[Mandatory] Name oder einzigartig | - |
url |
[Mandatory] URL, zu der verbunden werden soll [config] z. B. ssh://localhost:22 oder https://localhost:443 |
- |
Tunnel-Konfigurationsparameter
Diese Parameter werden verwendet, um die Parameter pro cloudflared-Dienst zu konfigurieren. Sie können weiterhin Pro-Regel-Konfiguration für benannte Tunnel als Teil des ingress unter cf_tunnels konfigurieren.
| Parameter | Beschreibung | Standardwert |
|---|---|---|
autoupdate_freq |
Autoupdate-Frequenz - siehe dokumentation | 24h |
edge_ip_version |
Bestimmt die IP-Adresse Version (IPv4 oder IPv6), die verwendet wird, um eine Verbindung zwischen cloudflared und dem Cloudflare Global Network herzustellen. Verfügbare Werte sind auto, 4 und 6 |
auto |
edge_bind_address |
Bestimmt die ausgehende IP-Adresse, die verwendet wird, um eine Verbindung zwischen cloudflared und dem Cloudflare Global Network herzustellen | - |
grace_period |
Wenn cloudflared SIGINT/SIGTERM erhält, lehnt es neue Anfragen ab, wartet darauf, dass laufende Anfragen abgeschlossen werden, und beendet dann. Das Warten auf laufende Anfragen hat nach dieser Karenzzeit oder beim Empfang eines zweiten SIGTERM/SIGINT ein Timeout | 30s |
metrics |
Adresse, um die Nutzungsmetriken abzufragen - siehe dokumentation | localhost: |
metrics_update_freq |
Frequenz zur Aktualisierung der Tunnelmetriken - siehe dokumentation | 5s |
no_autoupdate |
Deaktiviert die regelmäßige Überprüfung auf Updates und das Neustarten des Servers mit der neuen Version - siehe dokumentation | false |
no_chunked_encoding |
Deaktiviert die chunkweise Übertragungscodierung; nützlich, wenn Sie einen WSGI-Server betreiben - siehe dokumentation | false |
no_tls_verify |
Deaktiviert die TLS-Überprüfung des vom Ursprung bereitgestellten Zertifikats. Erlaubt, dass jedes Zertifikat vom Ursprung akzeptiert wird - siehe dokumentation | - |
origin_server_name |
Hostname, den cloudflared vom Zertifikat Ihres Ursprungservers erwarten sollte - siehe dokumentation |
- |
origin_ca_pool |
Pfad zum CA für das Zertifikat Ihres Ursprungs. Diese Option sollte nur verwendet werden, wenn Ihr Zertifikat nicht von Cloudflare signiert ist - siehe dokumentation | - |
protocol |
Bestimmt das Protokoll, das für den Tunnel verwendet werden soll - siehe dokumentation | auto |
logfile |
Aktiviert das Schreiben einer Protokolldatei für cloudflared - es wird trotzdem ins Journal protokolliert | true |
loglevel |
Bestimmt die Detailgenauigkeit der Protokollierung. Der Standardwert "info" ist nicht laut, aber Sie möchten möglicherweise "warn" in der Produktion verwenden - siehe dokumentation | info |
region |
Erlaubt Ihnen, die Regionen auszuwählen, zu denen Verbindungen hergestellt werden. Auslassen oder leer lassen, um sich mit der globalen Region zu verbinden. Setzen Sie --region=us, um alle Verbindungen durch die US-Region 1 und US-Region 2 zu leiten |
- |
retries |
Maximale Anzahl von erneuten Versuchen bei Verbindungs-/Protokollfehlern. Wiederholungen verwenden exponentielles Backoff (erneutes Versuchen nach 1, 2, 4, 8, 16 Sekunden standardmäßig), daher wird eine signifikante Erhöhung dieses Wertes nicht empfohlen - siehe dokumentation | 5 |
tag |
Benutzerdefinierte Tags, um diesen Tunnel zu identifizieren, im Format KEY=VALUE - siehe dokumentation |
- |
token |
Verknüpft die cloudflared-Instanz mit einem bestimmten Tunnel. Das Token des Tunnels wird im Dashboard angezeigt, wenn Sie den Tunnel zum ersten Mal erstellen. Sie können das Token auch mit der API abrufen. | - |
transport_loglevel |
Bestimmt die Detailgenauigkeit der Protokolle für den Transport zwischen cloudflared und dem Cloudflare-Edge. Verfügbare Ebenen sind: trace, debug, info, warn, error, fatal, panic. Jeder Wert unter warn erzeugt erheblichen Output und sollte nur verwendet werden, um niedrigstufige Leistungsprobleme und Protokollquirks zu debuggen - siehe dokumentation |
info |
warp_routing |
Erlaubt Benutzern, über WARP eine Verbindung zu internen Diensten herzustellen, Details siehe [warp-routing] | false |
Abhängigkeiten
Keine
Beispiel-Playbooks
Das folgende Beispiel installiert einen einzelnen Dienst für einen SSH-Tunnel für jeden Server.
- hosts: servers
vars:
cf_systemd_user: root
cf_systemd_group: root
cf_cert_location: /home/papanito/cert.pem
services:
ssh:
hostname: "{{ inventory_hostname }}.mycompany.com"
url: ssh://localhost:22
roles:
- papanito.cloudflared
Das folgende Beispiel installiert einen [benannten Tunnel] servers mit einem Ingress zu {{ inventory_hostname }}.mycompany.com für SSH und einen [Hello World]-Dienst, wenn Sie auf hello-{{ inventory_hostname }}.mycompany.com über den Browser zugreifen.
- hosts: servers
remote_user: ansible
become: true
vars:
cf_cert_location: /home/papanito/.cloudflared/cert.mycompany.com.pem
cf_tunnels:
test:
account_tag: !vault...
tunnel_secret: !vault...
tunnel_id: !vault...
routes:
dns:
- "{{ inventory_hostname }}"
- "hello-{{ inventory_hostname }}"
ingress:
- hostname: "hello-{{ inventory_hostname }}.mycompany.com"
service: hello_world
- hostname: "{{ inventory_hostname }}.mycompany.com"
service: ssh://localhost:22
- service: http_status:404
roles:
- papanito.cloudflared
Das folgende Beispiel lädt einfach cloudflared auf Ihrem lokalen Computer herunter und konfiguriert die SSH-Konfigurationsdatei:
- hosts: localhost
remote_user: papanito # Ihr lokaler Benutzer mit Administratorrechten
vars:
cf_install_only: true
cf_ssh_client_config: true
cf_ssh_client_config_group: servers
roles:
- papanito.cloudflared
Test
ansible-playbook tests/test.yml -i tests/inventory
Zusätzliche Infos
Daemon authentifizieren
Laut [authenticate-the-cloudflare-daemon] wird beim Authentifizieren des Daemons ein Browserfenster geöffnet oder - falls dies nicht möglich ist - muss der Link manuell eingegeben werden. Während dieser Zeit wartet der Daemon. Ich konnte keine Lösung finden, um dieses Verhalten zu automatisieren, daher habe ich die folgende Implementierung gewählt.
Wenn nichts angegeben ist, ruft Ansible
cloudflared loginauf und fährt fort, wenn die Authentifizierung abgeschlossen ist - dies macht Sinn, wenn Sie die Rolle verwenden, um den Daemon lokal auf Ihrem Computer zu installieren, wo Sie ein Browserfenster haben.Wenn der Wert von
cf_cert_locationangegeben ist, wird das Zertifikat tatsächlich aus demcf_cert_locationkopiert, oder wenncf_cert_contentdefiniert ist, wird das Zertifikat direkt aus dem gespeicherten Wert erstellt. So können Sie sich einmal in Cloudflare von Ihrem Master-Knoten (wo Sie Ansible ausführen) oder von einem Remote-Standort aus anmelden.Sie können das
cert.pemmit Ansible Vault verschlüsseln und an einem sicheren Ort speichern.
Referenzen:
- [downloads] - cloudflared Download-Anleitungen
- [ssh-guide] - SSH-Verbindungen mit cloudflared
- [cli-args] - Befehlszeilenargumente
- [config] - Das Format der Konfigurationsdatei verwendet YAML-Syntax.
Lizenz
Dies ist freie Software, die unter den Bedingungen der Apache v2-Lizenz veröffentlicht wird.
Autoreninformation
ansible-galaxy install papanito.cloudflared