根据变量的值包含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 %}
我想通过 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 %}