我想通过ansible生成和部署nginx反向代理配置。
在模板中,有一个用于拦截错误(404、501 等(的部分,这不应该对所有部署都处于活动状态。我希望能够在变量{{customError}}
值的条件下切换这些行在模板中的包含。
这可能吗?我见过的大多数解决方案都是使用不同的模板,并根据条件决定使用哪个模板。我非常不喜欢多个模板的想法,因为这不会强迫我为所有可能性创建许多模板的方式。
可以肯定的是,如果对您来说,部署意味着不同的 Ansible 主机,那么您可以在清单中的主机级别分配变量customError
。
下面是一个示例:
清单,显示变量customError
的定义:
all:
hosts:
server1.nginx.tld:
customError: true
server2:.nginx.tld:
customError: false
包含模板文件基本部署的剧本:
---
- hosts: all
tasks:
- name: Copy default Nginx config
template:
src: default.j2
dest: /etc/nginx/sites-enabled/default
该模板采用 Jinja 格式,使用基本条件,基于 host 变量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/