Предыдущий урок: Ansible практика – урок №12: Как использовать модуль shell.
Ранее мы научились пользоваться шаблонами, и поняли, что это очень удобно, но что если мы хотим менять не только отдельные переменные, а иметь возможность варьировать целые куски содержимого файлов? Тут нам на помощь приходит условие if.
Зачем в шаблонах if?
Переменные в шаблонах можно использовать не только ради конкретных значений, но и в логических выражения. Так если логическое условие if верно, можно включить часть содержимого в файл и наоборот.
Использование условия if
В уроке №10 мы задали переменную basic_auth, сегодня мы ее используем. С ее помощью мы будем включать и отключать Basic Auth авторизацию в NGINX.
Шаг 1: Добавляем if в шаблон
Представим, что в нашей инфраструктуре есть веб сервера с сайтами, которые уже работаю в продакшене, а есть те, которые еще в разработке. Вторые лучше держать закрытыми от посторонних глаз и поисковых ботов.
Добавим в шаблон NGINX кусок кода, который позволит закрыть сайт дополнительной аутентификацией.
После изменений файл roles/nginx/templates/nginx.conf.j2 будет иметь следующий вид:
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name {{ domain_name }};
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
{% if basic_auth is defined and basic_auth is true -%}
auth_basic "Restricted area";
auth_basic_user_file /usr/share/nginx/.htpasswd;
{% endif -%}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
Мы добавили в шаблон if условие, если переменная basic_auth определена и верна, то будет добавлен дополнительный код, включающий Basic Auth.
Напомню, что переменная basic_auth имеет следующие значения на управляемых нодах:
Managed-Node-1: true
Managed-Node-2: false
Managed-Node-3: не задано
Шаг 2: Проверяем плейбук
Запустим плейбук и посмотрим, как изменятся настройки NGINX на хостах:
[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags nginx --skip-tags installation,start
PLAY [all] ******************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [Managed-Node-2]
ok: [Managed-Node-1]
ok: [Managed-Node-3]
TASK [nginx : Deploy nginx.conf from template] ******************************************************************************************************************************************************
changed: [Managed-Node-2]
changed: [Managed-Node-1]
changed: [Managed-Node-3]
TASK [nginx : Set user/password for Basic Auth] *****************************************************************************************************************************************************
skipping: [Managed-Node-2]
skipping: [Managed-Node-3]
changed: [Managed-Node-1]
RUNNING HANDLER [nginx : restart_nginx] *************************************************************************************************************************************************************
changed: [Managed-Node-2]
changed: [Managed-Node-1]
changed: [Managed-Node-3]
PLAY RECAP ******************************************************************************************************************************************************************************************
Managed-Node-1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Managed-Node-2 : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Managed-Node-3 : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
[root@Control-Node ansible]#
Раскатка прошла успешно. Проверим, включена ли дополнительная аутентификация на сайте.
Откроем в браузере адрес Managed-Node-1.

Или можно проверить с помощью curl:
Managed-Node-1:
[root@Control-Node ansible]# curl -I 192.168.0.151
HTTP/1.1 401 Unauthorized
Server: nginx/1.20.1
Date: Mon, 15 Dec 2025 02:00:05 GMT
Content-Type: text/html
Content-Length: 179
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted area"
[root@Control-Node ansible]#
Ответ веб сервера 401означает что не пройдена аутентификация.
Две другие ноды будут доступны, так как для второй переменная basic_auth имеет значение false, а для третьей вовсе не задана.
Managed-Node-2:
[root@Control-Node ansible]# curl -I 192.168.0.152
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Mon, 15 Dec 2025 02:03:30 GMT
Content-Type: text/html
Content-Length: 2713881
Last-Modified: Tue, 04 Jun 2024 22:57:12 GMT
Connection: keep-alive
ETag: "665f9bc8-296919"
Accept-Ranges: bytes
[root@Control-Node ansible]#
Managed-Node-3:
[root@Control-Node ansible]# curl -I 192.168.0.153
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
Date: Mon, 15 Dec 2025 02:03:33 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 11 Apr 2023 01:45:34 GMT
Connection: keep-alive
ETag: "6434bbbe-267"
Accept-Ranges: bytes
[root@Control-Node ansible]#
Итоги:
Мы успешно модифицировали наш шаблон. Теперь, меняя значение переменной, мы можем включать и отключать дополнительную аутентификацию.
Следующий урок: Ansible практика – урок №14: defaults для хранения констант.