Ansible практика – урок №13 Использование условия if в шаблонах.

Предыдущий урок: 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 для хранения констант.