Keďže Arch, Nginx a Ansible sú už samy osebe dosť vyspelé nástroje, myslel som si, že inštalácia Nginx na Arch systéme pomocou Ansible playbooku bude otázka sekúnd. Ale podľa skutočnej skúsenosti je to trochu zložitejšie.
Oficiálna ansible nginx role Arch nepodporuje. Existuje tiež role od Jeffa Geerlinga, ktorá Arch podporuje, ale s jednou zvláštnosťou. Role síce niekedy funguje (nepodarilo sa mi to 100% izolovať, zvyčajne po úplnom odstránení balíka Nginx), ale potom už nefunguje znova.
TASK [geerlingguy.nginx : Ensure nginx service is running as configured.] ***************
fatal: [5.189.129.182]: FAILED! => {"changed": false, "msg": "Unable to start service nginx: Job for nginx.service failed because the control process exited with error code.\nSee \"systemctl status nginx.service\" and \"journalctl -xeu nginx.service\" for details.\n"}
Dôvodom je, že Nginx sa nereštartuje s poskytnutou šablónou nginx.conf.
sudo systemctl restart nginx # fail
sudo journalctl -xeu nginx
Journal obsahuje:
[emerg] 870#870: "pid" directive is duplicate in /etc/nginx/nginx.conf:4
Po zakomentovaní riadka 4 sa Nginx reštartuje bez problémov. https://github.com/geerlingguy/ansible-role-nginx/blob/1820e90b4cf7248f0914983beeb785bf15bb0571/templates/nginx.conf.j2#L4
Dôvodom je, že PID je tiež referencovaný v
/usr/lib/systemd/system/nginx.service ako riadok:
ExecStart=/usr/bin/nginx -g 'pid /run/nginx.pid; error_log stderr;'
Ak tomu správne rozumiem, pri správe Arch systému nie je potrebný L4 v
nginx.conf. Viac relevantných informácií na
https://bugs.archlinux.org/task/46500
setup-Archlinux.yml sa spustí pred skopírovaním šablóny nginx.conf.
Mali by existovať ďalšie úlohy špecifické pre Arch za „Copy”, ale pred
„Ensure running”, alebo by možno mala existovať šablóna nginx.conf
špecifická pre Arch?
https://github.com/geerlingguy/ansible-role-nginx/blob/1820e90b4cf7248f0914983beeb785bf15bb0571/templates/nginx.conf.j2#L1-L6 Šablónovanie tu nie je praktické, pretože riadky L3-L4 sú jedné riadky, ktoré nie sú vnútri bloku, takže navrhujem ich vložiť do jinja2 bloku ako cestu najmenšieho odporu. Nie som si istý ohľadom L1 (nie je v bloku, ale žiadny problém nebol hlásený).
Riešenie #
- Upravte
vars/Archlinux.ymla odstráňte L6 obsahujúcinginx_pidfile: /run/nginx.pid - Upravte
templates/nginx.conf.j2a vložte L5 do podmienečného bloku:
{% if nginx_pidfile is defined %}
pid {{ nginx_pidfile }};
{% endif %}
Nie som si istý, či je toto najlepšie riešenie, ale slúži ako proof of concept, kým upstream neposkytne riešenie.
Odkazy #
Toto je 39. príspevok série #100daystooffload.