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

Nginx 根据变量的值包括ansible模板的内容,nginx,ansible,ansible-template,Nginx,Ansible,Ansible Template,我想通过ansible生成和部署nginx反向代理配置。 在模板中,有一个用于拦截错误的部分(404、501等),它不应在所有部署中都处于活动状态。我希望能够在变量{{customError}的值的条件下切换在模板中包含这些行 这可能吗?我见过的大多数解决方案都使用不同的模板,并根据使用哪个模板的条件在任务中做出决定。我非常不喜欢多个模板的想法,因为这不会迫使我为所有可能的情况创建多个模板。当然,如果部署意味着不同的Ansible主机,那么您可以在主机级别的资源清册中分配变量customErro

我想通过ansible生成和部署nginx反向代理配置。
在模板中,有一个用于拦截错误的部分(404、501等),它不应在所有部署中都处于活动状态。我希望能够在变量
{{customError}
的值的条件下切换在模板中包含这些行


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

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

以下是一个示例:

显示变量定义的清单
customError

all:
  hosts:
    server1.nginx.tld:
      customError: true
    server2:.nginx.tld:
      customError: false
剧本,包括:

该模板采用Jinja格式,基于主机变量default.j2使用:

执行它:

$ 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;


}

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

以下是一个示例:

显示变量定义的清单
customError

all:
  hosts:
    server1.nginx.tld:
      customError: true
    server2:.nginx.tld:
      customError: false
剧本,包括:

该模板采用Jinja格式,基于主机变量default.j2使用:

执行它:

$ 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 %}


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

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


这可能吗?
=>当然可以!如果不是的话,我就看不到使用模板的意义了!。现在,你是如何做到这一点的?你面临的确切问题是什么?一个好的起点是,更具体地说,我到目前为止一直在用谷歌搜索,我确信这一定是可能的(参见答案,但不确定如何做到)
这可能吗?
=>当然!如果不是的话,我就看不到使用模板的意义了!。现在,你是如何做到这一点的?你面临的确切问题是什么?一个好的开始是,更具体地说,我到目前为止一直在尝试谷歌搜索,我确信这一定是可能的(见答案,但不确定如何)