Ansibleで構成したUbuntu 18.04で、nginxをsystemdでenabledにしているにも関わらず、サーバーを再起動するとnginxが起動しないトラブルが起きました。
プロキシ設定がDNSを参照する場合は注意
結論から言うと、DNS参照を必要とするドメイン名によるプロキシ設定を行っていたことと、サービス定義の起動条件(systemdのAfter
)の問題でした。
Ansibleでは次のタスクでサービスの有効化をしていたのですが、
- name: enable nginx service
systemd: name=nginx.service enabled=yes
/etc/systemd/system/multi-user.target.wants/nginx.service
でAfter
の記述が次のように。
After=network.target
journalctl -u nginx
でログを見るとこんな感じのログがでてました。
nginx: [emerg] host not found in upstream "hogehoge.net" in /etc/nginx/sites-enabled/reverse-proxy:17
upstream
のドメインが見つからないと言われました。でもシェルからサービスを起動すると問題ないのです。
DNSが使えるまで待つにはnss-lookup.target
も必要
起動プロセスの中でDNSの参照もできるまで待つには、nss-lookup.target
も加える必要がありました。nginx自体のサンプルとしては次のように紹介されています。
After=syslog.target network.target remote-fs.target nss-lookup.target
ansibleのタスクを直す
Ansibleのsystemd
モジュールにAfter
を指定する属性があるかなーと思いましたが残念ながらありませんでした。
なので次のように強引に置換しました。もっとよい対処法があったら教えてください!
- name: enable nginx service
systemd: name=nginx.service enabled=yes
- name: fix nginx systemd definition
replace:
dest: /etc/systemd/system/multi-user.target.wants/nginx.service
regexp: "After=.+$"
replace: "After=syslog.target network.target remote-fs.target nss-lookup.target"