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
ディレクティブでラップする必要があるため機能しません。
これらのサイト固有のファイルの有効性を確認するにはどうすればよいですか?
(idea https://Gist.github.com/psd/5042334 から借りたアイデア)のようないくつかのトリックを実行して配置されたファイルを検証できます:validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'
特定の構成ファイル内のディレクティブの有効性が残りの構成ファイルに依存している可能性があるため(たとえば、2つの構成ファイルがある場合)、nginxメイン構成ファイルに含まれるファイルでvalidate
を直接呼び出すことは意味がありません同じサーバーブロックなどを宣言します)。
Nginxの設定変更を検証する場合は、メインの設定ファイルで常にnginx -t
を呼び出す必要があります。サブパートではありません。
以下は、少なくともAnsible 2.5で機能する、より簡単な方法です。
- name: Verify Nginx config
become: yes
command: nginx -t
changed_when: false
Sudo nginx -t
に相当するものを実行し、その出力をチェックします。 nginx設定にエラーがある場合、それはゼロ以外を返し、Ansibleタスクはエラーになります(changed_when
)。
Nginxをユーザーとしてインストールした場合は、become
を削除してください。