Включить содержимое шаблона ansible на основе значения переменной - PullRequest
0 голосов
/ 10 января 2020

Я хотел бы создать и развернуть nginx конфигурации обратного прокси-сервера через ansible.
В шаблоне есть часть для перехвата ошибок (404, 501, et c), это не должно быть активным для ВСЕХ развертываний. Я хотел бы иметь возможность переключать включение этих строк в шаблон при условии значения переменной {{customError}}.

Возможно ли это? Большинство решений, которые я видел, работают с различными шаблонами и решают задачу, основываясь на условии, какой шаблон использовать. Мне очень не нравится идея использования нескольких шаблонов, так как это не вынуждает меня создавать множество шаблонов для всех возможностей.

Ответы [ 2 ]

1 голос
/ 11 января 2020

Вы можете использовать условия Jinja, которые генерируют динамическое содержимое c, например:

{% if group == 'dev' %}
404 = something
501 = something
{% else %}
404 = something different
501 = something different
{% endif %}

https://jinja.palletsprojects.com/en/2.10.x/

1 голос
/ 11 января 2020

Конечно, если для вас развертывание означает другой хост Ansible, вы можете назначить переменную customError на уровне хоста в инвентаре.

Вот пример, с которого нужно начать :

Инвентарь, в котором указано определение переменной customError:

all:
  hosts:
    server1.nginx.tld:
      customError: true
    server2:.nginx.tld:
      customError: false

Плейбук, содержащий основы c развертывание файла шаблона :

---
- hosts: all

  tasks: 
    - name: Copy default Nginx config
      template:
        src: default.j2
        dest: /etc/nginx/sites-enabled/default

Шаблон в формате Jinja, использующий базовое c условие на основе переменной хоста, default.j2 :

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;


{% if customError %}
        error_page 404 /custom_404.html;
        location = /custom_404.html {
                root /usr/share/nginx/html;
                internal;
        }
{% endif %}
}

Выполнение:

$ ansible-playbook playbook.yml --inventory=inventory.yaml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [server2.nginx.tld]
ok: [server1.nginx.tld]

TASK [Copy default Nginx config] ***********************************************
changed: [server1.nginx.tld]
changed: [server2.nginx.tld]

PLAY RECAP *********************************************************************
server1.nginx.tld          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
server2.nginx.tld          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

И чтобы проверить, что это сгенерировало, еще немного ad-ho c Ansible:

$ ansible -a 'cat /etc/nginx/sites-enabled/default' all --inventory=inventory.yaml

server1.nginx.tld | CHANGED | rc=0 >>
server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;


        error_page 404 /custom_404.html;
        location = /custom_404.html {
                root /usr/share/nginx/html;
                internal;
        }
}

server2.nginx.tld | CHANGED | rc=0 >>
server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;


}
...