nginx
Ansible
ansible-playbook
BTC

ansibleで適用するファイルの文字列にバリデーションチェックをかける

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を使用すれば可能となります。