1. 概要
ansibleでnginxのconfファイルをサーバに配置する際、
ファイルの中身にバリデーションチェックをかけて、
引っかかった場合に処理を止める方法をお伝えします。
問題
nginxでIPアドレスによってアクセス制御をかけたいことがありましたが、
必ず許容しなければならないIPアドレスもあり、間違って設定してしまう恐れがありました。
解決方法
ファイル適用前に、文字列でバリデーションチェックをかけました。
成功した場合、confファイルを配置し、
失敗した場合、処理を止めるようymlファイルを修正しました。
2. 詳細
ソース
- hosts: server1,server2
become: yes
- name: Apply file
copy: src=file.conf dest=/etc/nginx/conf.d/ owner=nginx group=nginx
- systemd: name=nginx state=reloaded
このままだと、file.confに書いてある内容がそのまま反映され、リロードされてしまいます。
修正箇所
failed_whenを使用し、バリデーションタスクを追加しました。
- hosts: server1,server2
become: yes
vars:
contents: "{{ lookup('file', 'file.conf') }}"
tasks:
- name: Validate file.conf
debug: msg="value of {{ contents }}"
failed_when: ('123\\.456\\.789\\.000' in contents) or
('123\\.456\\.789\\.001' in contents) or
('123\\.456\\.789\\.002' in contents)
- name: Apply blacklist
copy: src=file.conf dest=/etc/nginx/conf.d/ owner=nginx group=nginx
- systemd: name=nginx state=reloaded
confファイルの中身がエスケープ文字なので、さらにエスケープを重ねなければなりません。
3. まとめ
ファイルの中身の文字列についてバリデーションをかけたいときは
ファイルを変数に格納し、in contents、failed_whenを使用すれば可能となります。