papanito.cloudflared
Rola Ansible "papanito.cloudflared"
Ta rola Ansible pobiera i instaluje cloudflared
na hoście i opcjonalnie instaluje [argo-tunel] jako usługę.
Zmiany przełamujące z wersji 3.0.0
To jest zmiana przełamująca, aby odzwierciedlić nowe zachowanie nazwanych tuneli
Rola powinna zająć się czyszczeniem, jeśli korzystałeś z roli przed wersją 3.0.0. Jednak musisz zaktualizować konfigurację (zmienne) w swoim projekcie Ansible. Zmieniłem nazwy zmiennych - zazwyczaj z prefiksem
cf_
, aby były unikalne dla roli. Jeśli nie są unikalne, może zdarzyć się, że zmienne o tej samej nazwie w różnych rolach mogą prowadzić do niepożądanych skutków ubocznych.
Cloudflared i łączenie aplikacji z tunelami
Zgodnie z 1, aby utworzyć i zarządzać tunelami, musisz najpierw:
- Pobierz i zainstaluj cloudflared na swoim komputerze
- Uwierzodfnij cloudflared
Po zainstalowaniu i uwierzytelnieniu cloudflared, proces uruchomienia pierwszego tunelu obejmuje 3 główne kroki:
Kroki 4-5 są wykonywane raz na tunel, zazwyczaj przez administratora, a krok 6 jest wykonywany za każdym razem, gdy tunel ma być uruchomiony, zazwyczaj przez właściciela tunelu (który może być inny niż administrator).
Co robi ta rola?
Rola ma dwa cele:
Instalacja demona po stronie serwera
Rola zajmuje się jedynie konfiguracją usługi na węzłach, tzn. krokami 1, 2, 4 i 5 powyżej, ponieważ
Tworzenie tuneli i włączanie routingu to zadanie, które powinno być wykonywane przez administratora, a nie rolę 1
Można skonfigurować od jednego do wielu [nazwanych tuneli] oraz [jednostkowej usługi] - z tym, że przy [nazwanych tunelach] zwykle potrzebny jest tylko jeden demon. Rola wykonuje następujące kroki:
Pobiera i instaluje binarkę zgodnie z [pobieraniem]
Instaluje/konfiguruje demona - patrz Uwierzytelniaj demona
Dla [nazwanych tuneli] tworzony jest [plik uwierzytelniający] w
{{ cf_credentials_dir }}/{{ tunnel_id }}.json
, podobny do tego{"AccountTag":"{{ account_tag }}","TunnelSecret":"{{ tunnel_secret }}","TunnelID":"{{ tunnel_id }}","TunnelName":"{{ cf_tunnels.key }}"}
Dla każdego klucza w
cf_tunnels
tworzona jest konfiguracja tunelu w/etc/cloudflare
Plik nazywa się
{{ tunnel }}.yml
i zawiera minimalną konfigurację, która wygląda następująconazwane tunel
tunnel: {{ cf_tunnels.key }} credentials-file: {{ cf_credentials_dir }}/{{ tunnel_id }}.json ingress: {{ item.value.ingress }}
jednostkowa usługa
hostname: {{ hostname }} url: {{ url }}
Dodatkowe parametry są konfigurowane za pomocą parametrów konfiguracji tunelu
W zależności od Twojego systemu inicjacji - kontrolowanego przez
cf_init_system
- rola wykonuje następujące czynnościSystemd
Tworzy [szablon jednostki systemd]
cloudflared@{{ tunnel }}.service
i uruchamia instancję dla każdej usługi z listycf_tunnels
cloudflared tunnel --config {{ tunnel }}.yml
Systemy Init-V
- Instalacja usługi cloudflared w
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
- Link do skryptu zatrzymania w
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
- Link do skryptu uruchamiania w
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
- Instalacja usługi cloudflared w
Jeśli używasz [nazwanych tuneli], rola utworzy również [trasę DNS].
Konfiguracja klienta SSH
Skąd uzyskujesz dostęp do swoich węzłów przez ssh, który jest przesyłany przez cloudflared, musisz postępować zgodnie z [przewodnikiem ssh-klienta]. Musisz dodać następujące
Host xxx.mycompany.com
ProxyCommand /usr/bin/cloudflared access ssh --hostname %h
Możesz osiągnąć tę konfigurację, jeśli włączysz cf_ssh_client_config
. Dodatkowo musisz również określić cf_ssh_client_config_group
. Załóżmy, że twoja inwentarz wygląda następująco:
all:
children:
servers:
hosts:
host001:
host002:
Jeśli określisz cf_ssh_client_config_group: servers
, otrzymasz wpis dla host001
i host002
.
Wymagania
brak
Zmienne roli
Parametry instalacji i deinstalacji
Poniższe parametry kontrolują instalację i/lub deinstalację
Parametr | Opis | Domyślna wartość |
---|---|---|
cf_download_baseurl |
Podstawowy adres URL dla binarnych plików cloudflare |
https://github.com/cloudflare/cloudflared/releases/latest/download/ |
cf_install_only |
Ustaw na true , jeśli chcesz tylko zainstalować binarkę bez jakiejkolwiek konfiguracji lub logowania |
false |
cf_ssh_client_config |
Ustaw na true , jeśli chcesz skonfigurować ustawienia proxy dla swojego [przewodnika SSH-klienta], patrz Konfiguracja klienta SSH |
false |
cf_ssh_client_config_group |
Nazwa grupy inwentarza dla której ma być utworzone ustawienie proxy ssh, patrz Konfiguracja klienta SSH | `` |
cf_force_install |
Ustaw na true , jeśli chcesz ponownie zainstalować cloudflared . Domyślnie zakłada się, że cloudflared działa jako usługa i automatycznie aktualizuje. |
false |
cf_remove_unused_tunnel |
Usuwa nieużywane cf_tunnels, czyli cf_tunnels działające, ale nie wymienione w cf_tunnels . |
false |
cf_remove_setup_certificate |
Usuwa cert.pem po zainstalowaniu usługi | false |
cf_credential_file_base |
Folder, w którym umieszczane są pliki uwierzytelniające | /root/.cloudflared/ |
cf_config_dir |
Folder, w którym umieszczane są pliki konfiguracyjne cloudflare | /etc/cloudflared |
cf_os_package_enable |
Użyj systemu pakietów OS i repozytorium pakietów Cloudflare (aktualnie tylko Debian/Ubuntu) | false |
cf_repository_key_url |
Jeśli cf_os_package_enable jest prawdą, adres URL klucza GPG dla repozytorium apt | https://pkg.cloudflare.com/pubkey.gpg |
cf_repository_key_install_path |
Jeśli cf_os_package_enable jest prawdą, ścieżka, gdzie instalowany jest klucz GPG dla repozytorium apt | /usr/share/keyrings/cloudflare-main.gpg |
cf_repository |
Jeśli cf_os_package_enable jest prawdą, adres URL dla repozytorium apt Cloudflare | deb [signed-by={{ cf_repository_key_install_path }}] https://pkg.cloudflare.com/cloudflared {{ ansible_distribution_release }} main |
cf_binary_name |
Nazwa binarki demona cloudflare - zmieniaj tylko, jeśli wiesz, co robisz | cloudflared |
Parametry usługi Cloudflared
To są parametry wymagane do utworzenia usługi systemowej
Parametr | Opis | Domyślna wartość |
---|---|---|
cf_init_system |
Określa, który system inicjacji użyć. Możliwe wartości to systemd i initv |
systemd |
cf_systemd_user |
Użytkownik dla usługi systemd, w przypadku cf_init_system: systemd |
root |
cf_systemd_group |
Grupa dla usługi systemd, w przypadku cf_init_system: systemd |
root |
cf_cert_location |
Lokalizacja certyfikatu do skopiowania - patrz Uwierzytelniaj demona | - |
cf_cert_content |
Zawartość certyfikatu do skopiowania - patrz Uwierzytelniaj demona | - |
cf_tunnels |
[Obowiązkowe] Lista usług tunelowych, z każdą definiującą parametry Cloudflare | - |
cf_sysctl_buffer_size_increase |
Zwiększenie dozwolonego rozmiaru bufora UDP przyjmowanego przez system operacyjny (non BSD) - więcej szczegółów | false |
Zaleca się używanie [nazwanych tuneli] dla cf_tunnels
, które wymagają parametrów nazwanych tuneli Cloudflare, ale można również użyć parametrów historycznych tuneli Cloudflare
Parametry nazwanych tuneli Cloudflare
...
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
Klucz tunelu powinien odpowiadać tunnel_id
.
Parametr | Opis | Domyślna wartość |
---|---|---|
account_tag |
[Obowiązkowe] Tag konta z [pliku uwierzytelniającego] wygenerowanego podczas tworzenia tunelu | - |
tunnel_secret |
[Obowiązkowe] Sekret tunelu z [pliku uwierzytelniającego] wygenerowanego podczas tworzenia tunelu | - |
tunnel_id |
[Obowiązkowe] ID tunelu z [pliku uwierzytelniającego] wygenerowanego podczas tworzenia tunelu | - |
ingress |
[Obowiązkowe] [reguły ingress] dla tunelu | - |
routes |
Lista tras, które należy utworzyć. Obecnie pozwala na listę dla tras dns (patrz przykład powyżej) |
- |
Trasy
DNS
Trasy dns
oczekują listy CNAME
, które mają być utworzone, jak opisano tutaj. Jeśli CNAME
już istnieje, zadanie zostanie pominięte, ale żaden błąd nie zostanie zgłoszony. Dodawaj tylko CNAME
, a nie FQDN, ponieważ FQDN
ustala się przez cloudlfared
.
Sieć prywatna
Trasy private network
oczekują listy CIDR
, które mają być utworzone, jak opisano tutaj. Playbook wykonuje pętlę po liście, aby wykonać cloudflared tunnel route ip add {{ cf_cidr_entry }} {{ cf_tunnel.key }}
. Jeśli CIDR
już istnieje, zgłoszony zostanie błąd, który zostanie zignorowany.
Równoważnik obciążenia
Trasy lb
oczekują listy istniejących równoważników obciążenia cloudflared (plus jego pul) do routingu tunelowego, jak opisano tutaj. Playbook wykonuje pętlę po liście, aby wykonać cloudflared tunnel route lb {{ cf_tunnel.key }} {{ cf_lb_entry.host_name }} {{ cf_lb_entry.pool_name }}
. Jeśli tunel jest już powiązany z pulą, zgłoszony zostanie błąd, który zostanie zignorowany.
Parametry jednostkowej usługi Cloudflare
Jak w poprzednich wersjach tych ról, można używać konfiguracji jednostkowej usługi
Jeśli musisz przesyłać ruch tylko do jednej lokalnej usługi, możesz to zrobić za pomocą pliku konfiguracyjnego. Alternatywnie możesz skonfigurować konfigurację jednostkową
cf_tunnels:
ssh:
hostname: xxx
url: ssh.mycompany.com
Parametr | Opis | Domyślna wartość |
---|---|---|
hostname |
[Obowiązkowe] Nazwa lub unikalny identyfikator | - |
url |
[Obowiązkowe] adres URL, do którego należy się połączyć [konfiguracja], np. ssh://localhost:22 lub https://localhost:443 |
- |
Parametry konfiguracji tunelu
Te służą do konfigurowania parametrów dla każdego serwisu cloudflared. Możesz nadal konfigurować Konfigurację per-regułę dla nazwanych tuneli jako część ingress
pod cf_tunnels
.
Parametr | Opis | Domyślna wartość |
---|---|---|
autoupdate_freq |
Częstotliwość automatycznych aktualizacji - patrz dokumentację | 24h |
edge_ip_version |
Określa wersję adresu IP (IPv4 lub IPv6) używaną do nawiązywania połączenia między cloudflared a globalną siecią Cloudflare. Dostępne wartości to auto , 4 , i 6 |
auto |
edge_bind_address |
Określa wychodzący adres IP używany do nawiązywania połączenia między cloudflared a globalną siecią Cloudflare | - |
grace_period |
Gdy cloudflared otrzyma SIGINT/SIGTERM, przestanie akceptować nowe żądania, poczeka na zakończenie żądań w toku, a następnie się zamknie. Czekanie na żądania w toku zakończy się po tym okresie łaski lub po otrzymaniu drugiego SIGTERM/SIGINT | 30s |
metrics |
Adres do zapytania o metryki użytkowania - patrz dokumentacja | localhost: |
metrics_update_freq |
Częstotliwość aktualizacji metryk tunelu - patrz dokumentacja | 5s |
no_autoupdate |
Wyłącza okresowe sprawdzanie aktualizacji, ponownie uruchamiając serwer z nową wersją - patrz dokumentacja | false |
no_chunked_encoding |
Wyłącza kodowanie przesyłania po kawałkach; przydatne, jeśli uruchamiasz serwer WSGI - patrz dokumentacja | false |
no_tls_verify |
Wyłącza weryfikację TLS certyfikatu przedstawionego przez Twoje źródło. Pozwoli to zaakceptować każdy certyfikat pochodzący z źródła - patrz dokumentacja | - |
origin_server_name |
Nazwa hosta, której cloudflared powinien oczekiwać od certyfikatu Twojego serwera źródłowego - patrz dokumentacja |
- |
origin_ca_pool |
Ścieżka do CA dla certyfikatu Twojego źródła. Ta opcja powinna być używana tylko wtedy, gdy Twój certyfikat nie jest podpisany przez Cloudflare - patrz dokumentacja | - |
protocol |
Określa protokół do użycia dla tunelu - patrz dokumentacja | auto |
logfile |
Włącza zapis do pliku dziennika dla cloudflared - nadal będzie logować do dziennika | true |
loglevel |
Określa szczegółowość logowania. Domyślna wartość "info" nie jest głośna, ale możesz chcieć używać "warn" w produkcji - patrz dokumentacja | info |
region |
Pozwala na wybór regionów, do których nawiązywane są połączenia. Pomiń lub pozostaw puste, aby połączyć się z globalnym regionem. Ustaw --region=us , aby kierować wszystkie połączenia przez region us 1 i us 2 |
- |
retries |
Maksymalna liczba prób ponownych w przypadku błędów połączenia/protokolu. Ponowne próby używają wykładniczego opóźnienia (ponawiają co 1, 2, 4, 8, 16 sekund domyślnie), więc znaczne zwiększenie tej wartości nie jest zalecane - patrz dokumentacja | 5 |
tag |
Niestandardowe tagi używane do identyfikacji tego tunelu, w formacie KEY=VALUE - patrz dokumentacja |
- |
token |
Powiązuje instancję cloudflared z określonym tunelem. Token tunelu jest wyświetlany na pulpicie nawigacyjnym przy pierwszym tworzeniu tunelu. Możesz także odzyskać token za pomocą API | - |
transport_loglevel |
Określa szczegółowość logów dla transportu między cloudflared a krawędzią Cloudflare. Dostępne poziomy to: trace , debug , info , warn , error , fatal , panic . Każda wartość poniżej warn generuje znaczne wyjście i powinna być używana tylko do debugowania problemów z wydajnością o niskim poziomie i dziwności protokołów - patrz dokumentacja |
info |
warp_routing |
Pozwala użytkownikom łączyć się z usługami wewnętrznymi za pomocą WARP, szczegóły patrz warp-routing | false |
Zależności
brak
Przykładowe Playbooki
Poniższy przykład instaluje pojedynczą usługę dla tunelu ssh dla każdego serwera
- 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
Poniższy przykład instaluje [nazwa tunelu] servers
z połączeniem do {{ inventory_hostname }}.mycompany.com
dla ssh i hello world, jeśli uzyskasz dostęp do hello-{{ inventory_hostname }}.mycompany.com
przez przeglądarkę
- 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
Poniższy przykład po prostu pobiera cloudflared
na lokalny komputer i konfiguruje plik ssh-config:
- hosts: localhost
remote_user: papanito # twój lokalny użytkownik, który ma uprawnienia administratora
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
Dodatkowe informacje
Uwierzytelnianie demona
Zgodnie z authenticate-the-cloudflare-daemon podczas uwierzytelniania demona otwiera się okno przeglądarki lub - jeśli to nie jest możliwe - należy ręcznie umieścić link. W tym czasie demon czeka. Nie mogłem wymyślić rozwiązania, jak zautomatyzować to zachowanie, więc wpadłem na poniższą implementację.
jeśli nic nie jest określone, wtedy ansible wywołuje
cloudflared login
i będzie kontynuowane, gdy uwierzytelnienie zostanie zakończone - ma to sens, jeśli używasz roli do zainstalowania demona lokalnie na komputerze, gdzie masz okno przeglądarkijeśli
cf_cert_location
, certyfikat jest faktycznie kopiowany zcf_cert_location
, lub jeślicf_cert_content
jest określony, wtedy certyfikat zostaje utworzony bezpośrednio z wartości, którą tam przechowano. Więc mógłbyś zalogować się raz do cloudflare z węzła macierzystego (gdzie uruchamiasz ansible) lub z lokalizacji zdalnej.Można zaszyfrować
cert.pem
za pomocą ansible vault i przechować go gdzie indziej.
Odniesienia:
- [pobierania] - instrukcje dotyczące pobierania cloudflared
- [przewodnik SSH] - połączenia SSH z cloudflared
- [argumenty CLI] - argumenty wiersza poleceń
- [konfiguracja] - Format pliku konfiguracyjnego używa składni YAML
Licencja
To jest oprogramowanie wolne, wydane na podstawie warunków licencji Apache v2.
Informacje o autorze
ansible-galaxy install papanito.cloudflared