Ansible: проверить конфигурацию NGINX перед рестартом

Автор: | 07/13/2018
 

Имеется роль nginx, в которой выполняется его настройка и копирование файлов.

Последней задачей роли выполняется nginx restart.

Проблема заключается в том, что попытка перезапуска NGINX выполняется в любом случае, и если в файле шаблона виртуалхоста есть ошибка — то NGINX не запустится.

Что бы выполнить проверку — nginx -t — добавляем задачу с вызовом модуля shell:

...
- name: Check NGINX configs
  shell: "/usr/sbin/nginx -t"
  register: nginx_config_status
...

Далее добавляем вывод кода в аутпут Ansible — просто для себя:

...
- name: NGINX test status
  debug:
    msg: "{{ nginx_config_status.rc }}"
...

Или всё содержимое, а не только rc (return code):

...
- name: NGINX test status
  debug:
    msg: "{{ nginx_config_status }}"
...

И в последней задаче — добавляем условие when:

...
- name: Service NGINX restart and enable on boot
  systemd:
    name: nginx
    state: restarted
    enabled: yes
    daemon_reload: yes
  when: nginx_config_status.rc == 0
...

Хотя условие тут «условное», т.к. Ansible остановится в любом случае на выполеннии задачи «Check NGINX configs«, если она выполнится с ошибкой.

Теперь полностью всё выглядит так:

...
- name: Check NGINX configs
  shell: "/usr/sbin/nginx -t"
  register: nginx_config_status

- name: NGINX test status
  debug:
    msg: "{{ nginx_config_status }}"

- name: NGINX test status
  debug:
    msg: "{{ nginx_config_status.rc }}"

- name: Service NGINX restart and enable on boot
  systemd:
    name: nginx
    state: restarted
    enabled: yes
    daemon_reload: yes
  when: nginx_config_status.rc == 0

Проверяем.

Добавляем лишнюю фигурную скобку в один из конфигов, вызываем роль nginx:

...
TASK [nginx : Add NGINX RabbitMQ WebUI config] ****
changed: [production.mobilebackend.domain.world]
TASK [nginx : Check NGINX configs] ****
fatal: [production.mobilebackend.domain.world]: FAILED! => {"changed": true, "cmd": "/usr/sbin/nginx -t", "delta": "0:00:00.006300", "end": "2018-07-11 14:48:31.615100", "msg": "non-zero return code", "rc": 1, "start": "2018-07-11 14:48:31.608800", "stderr": "nginx: [emerg] unexpected \"}\" in /etc/nginx/conf.d/rabbitadmin-production.domain.world.conf:4\nnginx: configuration file /etc/nginx/nginx.conf test failed", "stderr_lines": ["nginx: [emerg] unexpected \"}\" in /etc/nginx/conf.d/rabbitadmin-production.domain.world.conf:4", "nginx: configuration file /etc/nginx/nginx.conf test failed"], "stdout": "", "stdout_lines": []}
PLAY RECAP ****
production.mobilebackend.domain.world : ok=4    changed=1    unreachable=0    failed=1
Something went wrong. Exit.

ОК, исправляем ошибку, вызываем Ansible ещё раз:

...
TASK [nginx : Add NGINX RabbitMQ WebUI config] ****
changed: [production.mobilebackend.domain.world]
TASK [nginx : Check NGINX configs] ****
changed: [production.mobilebackend.domain.world]
TASK [nginx : NGINX test status] ****
ok: [production.mobilebackend.domain.world] => {
"msg": {
"changed": true,
"cmd": "/usr/sbin/nginx -t",
"delta": "0:00:00.007164",
"end": "2018-07-11 14:53:04.623855",
"failed": false,
"rc": 0,
"start": "2018-07-11 14:53:04.616691",
"stderr": "nginx: the configuration file /etc/nginx/nginx.conf syntax is ok\nnginx: configuration file /etc/nginx/nginx.conf test is successful",
"stderr_lines": [
"nginx: the configuration file /etc/nginx/nginx.conf syntax is ok",
"nginx: configuration file /etc/nginx/nginx.conf test is successful"
],
"stdout": "",
"stdout_lines": []
}
}
TASK [nginx : NGINX test status] ****
ok: [production.mobilebackend.domain.world] => {
"msg": "0"
}
TASK [nginx : Service NGINX restart and enable on boot] ****
changed: [production.mobilebackend.domain.world]
PLAY RECAP ****
production.mobilebackend.domain.world : ok=8    changed=3    unreachable=0    failed=0
Provisioning done.

Готово.