
みなさんこんにちは!
この記事では、Let's Encrypt証明書を一元的に更新し、ansibleを使用してインフラストラクチャを管理する問題をどのように解決したかについて説明します。
このソリューションでは次を使用します。
- アンシブル
- rsync、rsyncd
- inotify、incron
- certbot
- nginx
ソリューションが役立つ2つのアーキテクチャオプションを提供します。 次に、コメントでオプションを提案できます。
オプション1:複数のドメインにサービスを提供するパブリックIP(3など)を持つ複数のフロントエンドサーバーがあります。 これらのドメインは追加/削除できます。 各フロントエンドサーバーを監視しないようにするには、1つのletsencrypt serverこれを行う方が便利です。

オプション2:パブリックIPを持つサーバーは1つだけで、ネットワーク内のサーバーに証明書が必要です。

Ansibleロールの説明
役割のあるリポジトリはこちらから入手できます 。
リポジトリには4つのロールがあります。
- nginx-simple
すべてのホストにnginxをインストールし、基本設定をコピーします。 役割自体は、プレイブックからは始まりません。 他のロールからのメタ依存関係で実行されます。 - letsencrypt-server
letsencrypt serverホストでrsyncdを構成します。 メタ依存関係では、 nginx-simple役割を果たします。 したがって、 nginxが最初にインストールされ、その後、 letsencrypt serverの役割がletsencrypt serverます。 - インクロン
incron必要なパッケージをインストールし、基本incronをコピーします。 また、ロールはnginx-simpleとして直接開始されません。 - 正面
メタ依存関係では、 incronおよびnginx-simpleロールがあります。 その後、 frontロールはexample.comに必要なnginx構成をコピーし、 cronにタスクを追加して、 letsencrypt serverから新しい証明書を取得し、 letsencrypt serverにタスクをincronしてファイルの変更を確認し、 nginx -s reload hookを実行します
練習に移りましょう:
初期設定
最初は、次のものがあります。
- SSL証明書を集中的に発行するための1台のサーバー(
letsencrypt server ) - nginxを備えた1つ以上のパブリックにアクセス可能なサーバー(
front )
Ubuntu 16.04はすべてのサーバーにインストールされます。
nginxをインストールして構成する
まず、 nginx-simple共通の役割からすべてのホストにnginxをインストールし、すべてのホストに共通のnginx構成(nginx.conf、sslパラメーター、証明書パスなど)を展開します。
テンプレートでletsencrypt Server用の.../site-available/default.confフォルダ.well_knownに配置されます/var/www/ :
{% if letsencrypt_server %} location /.well-known { root /var/www/; }
frontグループのサーバーでは、 .well_knownフォルダー.well_known証明書の取得だけでなく他のソフトウェアにも使用されるため、 example.conf letsencrypt-proxy.confインポートし、nginxはtry_file try_fileを使用してフロントサーバー上のフォルダーをローカルに検索します:
{% if nginx_proxy_well_known %} try_files $uri $uri/ @letsencrypt; {% endif %}
インベントリの変数に応じて、ドメインの構成が書き込まれます。 リポジトリでは、これはexample.comドメインです
また、 letsencrypt_server変数に応じて、 nginx-simpleロールはletsbotcryptサーバーにcertbotをインストールし、cronタスクを追加して証明書を更新します。
証明書を取得する
我々はレッツ・暗号化からワイルドカード証明書の前にこの問題を解決しているので、我々は、証明書を取得するために両方のオプションを検討します。
letsencryptサーバーサーバーでは、次のことを行います。
certbot certonly --agree-tos -d example.ru --webroot -w /var/www/
複数のドメインがある場合は、 -dスイッチを使用して次のドメインを追加します。
ワイルドカード証明書を取得するには、DNS TXTにレコードを追加する必要があります。 現時点では、これがそのような証明書を取得する唯一の方法です。
certbot certonly --agree-tos -d example.ru -d *.example.ru --preferred-challenges dns --manual --server https:
Certbotは、追加する必要があるTXTレコードを書き込みます。
証明書の更新
証明書を取得しましたが、それらをフロントサーバー/サーバーにコピーするように構成します。 これを行うために、我々は設定しますrsyncd IPアドレスの制限されたリストへの読み取りアクセス権を持つサーバーletsencryptを:
hosts allow = {{ hosts_allow }} hosts deny = * list = true use chroot = no [cert] path = /etc/letsencrypt/live/ uid = root gid = root read only = true
5分ごとに、フロントサーバーからのcronタスクは、証明書が更新されたかどうかを確認し、それらを取得します。 なぜなら 証明書はローテーションされ、 /etc/letsencrypt/live/{{ domain }}は/etc/letsencrypt/live/{{ domain }}フォルダーにあります。 -Lスイッチを追加して、元のファイルを引き出します。
/usr/bin/rsync -zavL --chmod=D0750,F640 --delete rsync://{{ hostvars['letsencrypt-server'].ansible_eth0.ipv4.address }}/cert /etc/letsencrypt/live/
nginxのフック
nginxを構成し、証明書を受け取って、フロントサーバーに持っていきました。 これは、ファイルがフォルダ内にあるかを決定するために残っている/etc/letsencrypt/live/{{ domain }} {ドメイン}}変更やフックを実行nginx -s reload
Linuxのinotifyカーネルサブシステムとincronデーモンがこれに役立ちます。 それらについての詳細はこちらをご覧ください 。
役割はincronパッケージをインストールすると、テンプレートの役割front 、モニター、正しい証明書をフックにタスクを追加します。
/etc/letsencrypt/live/{{ domain }}/ IN_CREATE,IN_DELETE,IN_MODIFY,IN_MOVED_TO nginx -s reload
結論として
私たちは、インストールおよび構成プロセス全体を詳細に説明しようとしました。 すべてがansibleプレイブックに記述されています-記事は非常にコンパクトであることが判明しました。 彼らがよく言うのは、「100行強のコード」です。 私たちは、コメント、質問、批判、コメントに喜んでお答えします。