TL;DR
PHP7 からは、/etc/php.ini 等の設定ファイルで '#' から始まるコメントを受け付けなくなりました。blockinfile で設定を変える場合は、マーカーを明示しましょう。
Ansible Playbook で blockinfile を使う
CentOS 6/7 上で php71 を使う環境を作るにあたり、ansible で remi / webtatic を切り替えてプロビジョニングできるような playbook を作ろうとしています。
php-fpm から読み込まれる www.conf に日本語設定を追加しようと、以下のように設定しました。ansible-2.3 から使えるようになった、blockinfile ディレクティブを使っています。
---
- name: roles/php-fpm/tasks/main.yml
command: echo
(略)
- name: php-fpm.d/www.conf - add settings for use in Japan
blockinfile:
dest: "{{ PHP_INI_DIR }}/php-fpm.d/www.conf"
insertafter: '^;php_value[opcache.file_cache]'
block: |
; Default values for use in Japan.
php_value[date.timezone] = {{ TIME_ZONE }}
php_value[mbstring.language] = Japanese
become: yes
notify: restart {{ PHP_FPM_SERVICE }}
これにより、/etc/php-fpm.d/www.conf の末尾に以下のブロックが追加されます。
$ tail -5 /etc/php-fpm.d/www.conf
# BEGIN ANSIBLE MANAGED BLOCK
; Default values for use in Japan.
php_value[date.timezone] = Asia/Tokyo
php_value[mbstring.language] = Japanese
# END ANSIBLE MANAGED BLOCK
エラー発生
ところが、この後 restart php71-php-fpm でエラーでコケます。
RUNNING HANDLER [php-fpm : restart php71-php-fpm] ******************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Unable to restart service php71-php-fpm: Job for php71-php-fpm.service failed because the control process exited with error code. See \"systemctl status php71-php-fpm.service\" and \"journalctl -xe\" for details.\n"}
原因は、どうも php-fpm(というか php)が、 '#' から始まるコメントを許していないらしいこと。'#' で始まる2行を取るとうまくいきます。
PHP マニュアルの設定ファイルに書いてありました。
7.0.0 ハッシュ記号 (#) をコメントとみなさないようになりました。
解決策
playbook で開始/終了マーカーを明示するようにしたらうまくいきました。
marker: "; {mark} ANSIBLE MANAGED BLOCK"
これで流したファイルは、以下のようになり、ます。
$ sudo tail -5 /etc/php-fpm.d/www.conf
; BEGIN ANSIBLE MANAGED BLOCK
; Default values for use in Japan.
php_value[date.timezone] = Asia/Tokyo
php_value[mbstring.language] = Japanese
; END ANSIBLE MANAGED BLOCK