ansibleデプロイ中にnginx.confを検証する


11

Ansibleでプロビジョニングされた単一のサーバーで複数のサイトを実行しています。

私のAnsibleタスクはおおよそ次のようになります。

- name: site nginx config
  template: src="nginx-site.conf.j2" dest=/etc/nginx/conf.d/{{item.name}}.conf
            owner=root group=root mode=0444
  with_items: sites
  notify: restart nginx

- name: nginx conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
  notify: restart nginx

validateAnsibleのテンプレートモジュールのパラメーターを使用して呼び出しnginx -t、新しい構成が構文的に有効であることを確認したいと思います。メインのnginx.confで機能します。

  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
            validate="/usr/sbin/nginx -c %s -t"

しかし、サイト固有の設定ファイルへの変更を反映していないようです。置くvalidate彼らはでラップされる必要があるとして、サイト固有のテンプレートには、ない仕事をしてhttp有効であると指示。

これらのサイト固有のファイルの有効性を確認するにはどうすればよいですか?

回答:


9

https://gist.github.com/psd/5042334から借用したアイデア)のようないくつかのトリックを実行して、配置されたファイルを検証できます。 validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'


これは実際に機能し、賛成票です!
dimitar 2017

4

validate特定の構成ファイル内のディレクティブの有効性は残りの構成ファイルに依存する可能性があるため(例えば、同じサーバーブロックを宣言する2つの構成ファイルがある場合)、nginxメイン構成ファイルに含まれるファイルを直接呼び出すことは意味がありません。等)。

nginx -tnginxの設定変更を検証したい場合は、常にメインの設定ファイルを呼び出す必要があり、サブパートの1つを呼び出す必要はありません。


1
OK。だから私は、検証のためにすべてを一度にまとめることをansibleに納得させる必要があると思いますか?
エリンコール

@ErinCall理想的には、プレイブックが途中で中断された場合でも、nginx構成は完全に有効なままである必要があります。
マイケルハンプトン

3

私は、他の回答の懸念を考慮して、受け入れられた回答と同様のアプローチを使用しました。

そのためにこの要旨を作りました。

アイデアは、/etc/nginxディレクトリ全体を一時ディレクトリにコピーし、%sパラメータからファイルを1つ変更し、メインのnginx構成に問題がないかテストすることです。最初にnginx構成が有効であり、nginx構成を変更するすべてのタスクがそれを使用して検証する場合、問題はないと思います。

ワンライナーとしては、次のようになります。

validate: bash -c 'NGINX_CONF_DIR=`mktemp -d`; cp -rTp /etc/nginx/ "$NGINX_CONF_DIR" && cp -Tp %s "$NGINX_CONF_DIR"/sites-enabled/new-site.conf && nginx -t -c "$NGINX_CONF_DIR"/nginx.conf'


1
私のnginx confにfastcgi_paramsが含まれていたため、受け入れられた回答の代わりにこのソリューションが必要でした。
Yep_It's_Me 2017年

3

以下は、少なくともAnsible 2.5で機能する、より簡単な方法です。

- name: Verify Nginx config
  become: yes
  command: nginx -t
  changed_when: false

同等の機能を実行し、sudo nginx -tその出力をチェックします。nginx設定にエラーがある場合、それはゼロ以外を返し、Ansibleタスクはエラーになります(changed_when)。

ユーザーとしてNginxをインストールした場合は、を削除してくださいbecome。ただし、Nginx でも機能すると思います。


1
これは悪い例templateです。Ansibleでモジュールと検証オプションを使用すると、構成の有効性が保証されますが、テンプレートをデプロイしてから手動でチェックして失敗した場合でも、無効であるという問題があります。テンプレートがデプロイされました。元に戻す必要はありません。
Rabin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.