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_tunnelstworzona jest konfiguracja tunelu w- /etc/cloudflare- Plik nazywa się - {{ tunnel }}.ymli zawiera minimalną konfigurację, która wygląda następująco- nazwane 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ści- Systemd - Tworzy [szablon jednostki systemd] - cloudflared@{{ tunnel }}.servicei uruchamia instancję dla każdej usługi z listy- cf_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ę, żecloudflareddział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 systemdiinitv | 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:22lubhttps://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, i6 | 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 cloudflaredpowinien 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 logini 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ądarki
- jeśli - cf_cert_location, certyfikat jest faktycznie kopiowany z- cf_cert_location, lub jeśli- cf_cert_contentjest 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.pemza 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