papanito.cloudflared
Ansibleロール「papanito.cloudflared」
このAnsibleロールは、ホストにcloudflared
をダウンロードしてインストールし、オプションで[argo-tunnel]をサービスとしてインストールします。
3.0.0の重大な変更
これは、命名されたトンネルの新しい動作を反映するための重大な変更です。
このロールは、バージョン3.0.0以前にロールを使用した場合のクリーンアップを行います。ただし、あなたはAnsibleプロジェクト内の設定(変数)を更新する必要があります。 変数をユニークにするために、通常は
cf_
で始まる名前に変更しました。同じ名前の変数が異なるロールで使用されていると、予期しない副作用が発生することがあります。
Cloudflaredとトンネルへの接続アプリ
[1] によると、トンネルを作成して管理するには、まず次のことを行う必要があります。
cloudflaredがインストールされて認証されたら、最初のトンネルを立ち上げるためのプロセスは次の3つの高レベルの手順を含みます。
- トンネルを作成します
- トンネルへのトラフィックをルーティングします
- トンネルを実行します
手順4と5は、通常は管理者によって、トンネルごとに1回実行されます。手順6は、トンネルを開始する必要があるときに、通常はトンネルの所有者によって実行されます(管理者とは異なる場合があります)。
このロールは何をするのか?
このロールには実際に2つの目的があります。
サーバー側デーモンのインストール
このロールは、ノード上にサービスをセットアップすることだけを行います。つまり、上記の手順1、2、4、および5です。
トンネルを作成し、ルーティングを有効にするのは、ロールではなく管理者が行うべきタスクです [1]
1つまたは複数の[named tunnels]と[single service]を設定することができますが、通常、[named tunnels]の場合は1つのデーモンで済みます。実際、このロールは以下の手順を実行します:
[downloads]に従ってバイナリをダウンロードしてインストールします。
デーモンをインストール/構成します - Authenticate the daemonを参照。
[named tunnels]の場合、
{{ cf_credentials_dir }}/{{ tunnel_id }}.json
の下に[credentials file]が作成されます。内容は以下のようになります。{"AccountTag":"{{ account_tag }}","TunnelSecret":"{{ tunnel_secret }}","TunnelID":"{{ tunnel_id }}","TunnelName":"{{ cf_tunnels.key }}"}
cf_tunnels
内の各キーについて、/etc/cloudflare
にトンネル設定を作成します。ファイルは
{{ tunnel }}.yml
という名前で、最小限の設定は次のとおりです。named tunnels
tunnel: {{ cf_tunnels.key }} credentials-file: {{ cf_credentials_dir }}/{{ tunnel_id }}.json ingress: {{ item.value.ingress }}
single service
hostname: {{ hostname }} url: {{ url }}
追加のパラメータは、Tunnel configuration paramsを使用して設定します。
Initシステムに応じて -
cf_init_system
で制御されます - ロールは以下のことを行います。Systemd
[systemd-unit-template]
cloudflared@{{ tunnel }}.service
を作成し、cf_tunnels
のリスト内の各サービスのインスタンスを開始します。cloudflared tunnel --config {{ tunnel }}.yml
Init-Vシステム
- cloudflared serviceを
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
にインストールします。 - 停止スクリプトを
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
にリンクします。 - 開始スクリプトを
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
にリンクします。
- cloudflared serviceを
[named tunnels]を使用する場合、ロールは[dns route]も作成します。
SSHクライアント設定
cloudflaredによってプロキシされたノードにSSHでアクセスする場合、[ssh-guide-client]に従う必要があります。次のように追加する必要があります。
Host xxx.mycompany.com
ProxyCommand /usr/bin/cloudflared access ssh --hostname %h
この設定は、cf_ssh_client_config
を有効にすると実現できます。さらに、cf_ssh_client_config_group
も指定する必要があります。このため、あなたのインベントリが次のように見えると仮定します。
all:
children:
servers:
hosts:
host001:
host002:
cf_ssh_client_config_group: servers
を指定すると、host001
およびhost002
のエントリが作成されます。
必要条件
なし
ロール変数
インストールとアンインストールのパラメータ
以下のパラメータは、インストールおよび/またはアンインストールを制御します。
パラメータ | 説明 | デフォルト値 |
---|---|---|
cf_download_baseurl |
cloudflare バイナリのベースURL |
https://github.com/cloudflare/cloudflared/releases/latest/download/ |
cf_install_only |
設定やログインなしにバイナリをインストールしたい場合はtrue に設定 |
false |
cf_ssh_client_config |
[ssh-guide-client]のプロキシ設定を構成したい場合はtrue に設定 |
false |
cf_ssh_client_config_group |
SSHプロキシ設定を作成するインベントリグループの名前 | `` |
cf_force_install |
cloudflared を再インストールしたい場合はtrue に設定 |
false |
cf_remove_unused_tunnel |
使用されていないcf_tunnelsを削除します | false |
cf_remove_setup_certificate |
サービスをインストールした後にcert.pemを削除します | false |
cf_credential_file_base |
認証ファイルを配置するフォルダ | /root/.cloudflared/ |
cf_config_dir |
Cloudflare構成ファイルを配置するフォルダ | /etc/cloudflared |
cf_os_package_enable |
OSパッケージシステムとCloudflareパッケージリポジトリを使用する (現在はDebian/Ubuntuのみ) | false |
cf_repository_key_url |
cf_os_package_enableがtrueのとき、aptリポジトリ用のGPGキーのURL | https://pkg.cloudflare.com/pubkey.gpg |
cf_repository_key_install_path |
cf_os_package_enableがtrueのとき、aptリポジトリ用のGPGキーをインストールするパス | /usr/share/keyrings/cloudflare-main.gpg |
cf_repository |
cf_os_package_enableがtrueのとき、Cloudflare aptリポジトリのURL | deb [signed-by={{ cf_repository_key_install_path }}] https://pkg.cloudflare.com/cloudflared {{ ansible_distribution_release }} main |
cf_binary_name |
Cloudflareデーモンのバイナリ名 - 知っている場合のみ変更してください | cloudflared |
Cloudflaredサービスパラメータ
これらはシステムサービスを作成するために必要なパラメータです。
パラメータ | 説明 | デフォルト値 |
---|---|---|
cf_init_system |
使用するinitサービスを定義します。可能な値はsystemd とinitv です |
systemd |
cf_systemd_user |
cf_init_system: systemd のときのsystemdサービス用のユーザー |
root |
cf_systemd_group |
cf_init_system: systemd のときのsystemdサービス用のグループ |
root |
cf_cert_location |
コピーする証明書の場所 - Authenticate the daemonを参照 | - |
cf_cert_content |
コピーする証明書の内容 - Authenticate the daemonを参照 | - |
cf_tunnels |
[必須] トンネルサービスのリスト、各トンネルはCloudflareパラメータを定義します | - |
cf_sysctl_buffer_size_increase |
OS (BSD以外)によって許可されるUDP受信バッファサイズの増加 - 詳細 | false |
cf_tunnels
に対して[named tunnels]を使用することをお勧めしますが、Cloudflare legacy tunnel parametersも使用できます。
Cloudflare named tunnel parameters
...
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
トンネルのkey
はtunnel_id
と一致する必要があります。
パラメータ | 説明 | デフォルト値 |
---|---|---|
account_tag |
[必須] トンネルを作成する際に生成された[credentials file]からのアカウントタグ | - |
tunnel_secret |
[必須] トンネルを作成する際に生成された[credentials file]からのトンネルシークレット | - |
tunnel_id |
[必須] トンネルを作成する際に生成された[credentials file]からのトンネルID | - |
ingress |
[必須] トンネルの[ingress rules] | - |
routes |
作成されるルートのリスト。現時点ではdns ルートのリストを許可します (上記の例参照) |
- |
ルート
DNS
dns
ルートは、こちらに説明されていますが記載されているCNAMEのリストを期待します。CNAMEがすでに存在する場合、タスクはスキップされますが、エラーは表示されません。また、FQDNではなくCNAMEのみを追加してください。FQDNはcloudflaredによって決定されます。
プライベートネットワーク
private network
ルートは、こちらに説明されていますが記載されているCIDRのリストを期待します。プレイブックはリスト上の各CIDRに対してcloudflared tunnel route ip add {{ cf_cidr_entry }} {{ cf_tunnel.key }}
を実行します。CIDRがすでに存在する場合、エラーが表示されますが無視されます。
ロードバランサー
lb
ルートは、こちらに説明されていますが記載されている、トンネルをルーティングするための既存のcloudflaredロードバランサー(およびそのプール)のリストを期待します。プレイブックはリスト上の各要素に対してcloudflared tunnel route lb {{ cf_tunnel.key }} {{ cf_lb_entry.host_name }} {{ cf_lb_entry.pool_name }}
を実行します。トンネルがすでにプールにバインドされている場合、無視されるエラーが表示されます。
Cloudflare single service parameters
このロールの以前のバージョンと同様に、[単一サービス構成スタイル][single service]を使用できます。
ローカルサービスにトラフィックをプロキシする必要がある場合、構成ファイルを使用して行うことができます。別の方法として、単一サービスの構成を設定できます。
cf_tunnels:
ssh:
hostname: xxx
url: ssh.mycompany.com
パラメータ | 説明 | デフォルト値 |
---|---|---|
hostname |
[必須]名前またはユニーク | - |
url |
[必須]接続するURL [config]例えばssh://localhost:22 またはhttps://localhost:443 |
- |
トンネル構成パラメータ
これらは、cloudflaredサービスごとにパラメータを設定するために使用されます。cf_tunnels
のingress
の一部として、named tunnelsのルールごとの構成を設定することもできます。
パラメータ | 説明 | デフォルト値 |
---|---|---|
autoupdate_freq |
自動更新頻度 - docuを参照 | 24h |
edge_ip_version |
cloudflaredとCloudflareグローバルネットワークの間の接続に使用するIPアドレスバージョンを指定。利用可能な値はauto 、4 、6 |
auto |
edge_bind_address |
cloudflaredとCloudflareグローバルネットワーク間の接続に使用される送信IPアドレスを指定 | - |
grace_period |
cloudflaredがSIGINT/SIGTERMを受け取ると、新しいリクエストの受け付けを停止し、進行中のリクエストが終了するのを待ってからシャットダウンします | 30s |
metrics |
使用状況メトリックをクエリするアドレス - docuを参照 | localhost: |
metrics_update_freq |
トンネルメトリックを更新する頻度 - docuを参照 | 5s |
no_autoupdate |
更新の定期チェックを無効にし、新しいバージョンでサーバーを再起動します - docuを参照 | false |
no_chunked_encoding |
チャンク化トランスファーエンコーディングを無効にします; WSGIサーバーを実行している場合に便利 - docuを参照 | false |
no_tls_verify |
起源から提示された証明書のTLS確認を無効にします - docuを参照 | - |
origin_server_name |
cloudflaredが期待する起源サーバー証明書のホスト名 - docuを参照 | - |
origin_ca_pool |
起源証明書のCAへのパス。Cloudflareによって署名されていない証明書の場合のみ使用します - docuを参照 | - |
protocol |
トンネルに使用するプロトコルを指定 - docuを参照 | auto |
logfile |
cloudflaredのログファイルの書き込みを有効にします - ジャーナルにもログを記録し続けます | true |
loglevel |
ログの冗長性を指定します。デフォルトの「info」は騒がしくありませんが、プロダクションでは「warn」で実行することも検討できます - docuを参照 | info |
region |
接続される地域を選択できるようにします。グローバル地域に接続するには省略または空のままにします。すべての接続を米国地域1および2を経由させるには、--region=us を設定します |
- |
retries |
接続/プロトコルエラーの最大再試行回数。再試行は指数バックオフを使用します(デフォルトでは1, 2, 4, 8, 16秒ごとに再試行)ので、この値を大幅に増やすことは推奨されません - docuを参照 | 5 |
tag |
このトンネルを識別するのに役立つカスタムタグ、形式はKEY=VALUE - docuを参照 |
- |
token |
cloudflaredインスタンスを特定のトンネルに関連付けます。トンネルのトークンは、最初にトンネルを作成する際にダッシュボードに表示されます。APIを使用してトークンを取得することもできます - APIを参照 | - |
transport_loglevel |
cloudflaredとCloudflareエッジ間の輸送ログの冗長性を指定します。利用可能なレベルはtrace 、debug 、info 、warn 、error 、fatal 、panic です |
info |
warp_routing |
WARPを使用して内部サービスに接続できるようにします; 詳細は[warp-routing]を参照 | false |
依存関係
なし
例プレイブック
以下の例は、各サーバー
のためにSSHトンネルの単一サービスをインストールします。
- 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
以下の例は、SSHトンネルのために[named tunnel] servers
をインストールし、{{ inventory_hostname }}.mycompany.com
へのingressを設定します。ブラウザからhello-{{ inventory_hostname }}.mycompany.com
にアクセスする場合、[hello world]を表示します。
- 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
以下の例は、ローカルマシンに単にcloudflared
をダウンロードし、ssh-configファイルを設定します。
- hosts: localhost
remote_user: papanito #管理者権限のあるローカルユーザー
vars:
cf_install_only: true
cf_ssh_client_config: true
cf_ssh_client_config_group: servers
roles:
- papanito.cloudflared
テスト
ansible-playbook tests/test.yml -i tests/inventory
追加情報
デーモンの認証
[authenticate-the-cloudflare-daemon]によれば、デーモンを認証する際、ブラウザウィンドウが開きますが、それが不可能な場合は手動でリンクを入力する必要があります。この間、デーモンは待機します。この動作を自動化する解決策は思いつかなかったので、以下の実装を考えました。
- 何も指定されていない場合、ansibleは
cloudflared login
を呼び出し、認証が完了するまで続行しません。これは、ロールを使用してデーモンをローカルにインストールする場合に意味があります。 cf_cert_location
が指定されている場合、証明書はその場所から実際にコピーされます。または、cf_cert_content
が指定されている場合、その値から直接証明書が作成されます。このため、マスターノードから一度cloudflareにログインすることができます(ansibleを実行する場所)またはリモートからログインすることもできます。
あなたはcert.pem
をansibleボールトで暗号化し、安全な場所に保存できます。
参照:
- [downloads] - cloudflaredダウンロード手順
- [ssh-guide] - cloudflaredでのssh接続
- [cli-args] - コマンドライン引数
- [config] - 構成ファイルフォーマットはYAML構文を使用
ライセンス
これはフリーソフトウェアで、Apache v2ライセンスの条件のもとでリリースされています。
著者情報
ansible-galaxy install papanito.cloudflared