根据变量的值包含ansible模板的内容

Include content of ansible template based on value of variable

我想通过 ansible 生成和部署 nginx 反向代理配置。
在模板中,有一个部分用于拦截错误(404、501 等),这不应该对所有部署都有效。我希望能够根据变量 {{customError}}.

的值在模板中切换这些行的包含

这可能吗?我见过的大多数解决方案都使用不同的模板,并根据使用哪个模板的条件来决定任务。我非常不喜欢多个模板的想法,因为这不会迫使我为所有可能性创建许多模板的方式。

当然可以,如果对您来说部署意味着不同的 Ansible 主机,那么您可以在清单中的主机级别分配您的变量 customError

这是一个开始的例子:

显示变量定义的清单customError:

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

剧本,包含a basic deploy of a template file

---
- hosts: all

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

Jinja 格式的模板,使用 a basic condition,基于主机变量,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  

并验证生成的内容,更特别的 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;


}

您可以使用生成动态内容的 Jinja 条件,例如:

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

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