web-dev-qa-db-ja.com

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

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

Ansibleのテンプレートモジュールにvalidateパラメータを使用して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ディレクティブでラップする必要があるため機能しません。

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

11
Erin Call

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

9
Hubbitus

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

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

4
Xavier Lucas

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

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

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

Nginxをユーザーとしてインストールした場合は、becomeを削除してください。

3
Juha Untinen