jinja2模版
Ansible通常会使用Jinja2模板来修改被管理主机的配置文件。例如给10台远程主机都装上httpd服务,但是要求每个服务器的端口不一样。使用ansible的jinja2模板,也就是template模块。该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于template模块可以获取要复制的文件中变量的值,而copy则是原封不动的把文件内容复制过去。比如: 针对不同的主机定义不同的变量,template会在将配置文件分发出去前读取变量到jinja2模板,然后分发到不同的被管理主机上。
Ansible允许jinja2模板中使用条件判断和循环,但是jinja判断循环语法不允许在playbook中使用。
语法
{% for i in EXPR %}...{% endfor%}: 作为循环表达式
{% if EXPR %}...{% elif EXPR %}...{% endif%}: 作为条件判断
{# COMMENT #}: 表示注释
使用fact变量的示例
cat 28.yml
- hosts: web
tasks:
- name: Copy Template File /etc/motd
template: src=./motd.j2 dest=/etc/motd
cat motd.j2
Welcome to {{ ansible_hostname }}
This system total Memory is: {{ ansible_memtotal_mb }} MB
This system free Memory is: {{ ansible_memfree_mb }} MB
ansible-playbook 28.yml
Jinja2管理Nginx
cat 29.yml
- hosts: web
vars:
http_port: 80
server_name: www.zqf.com
tasks:
- name: Copy Template Nginx Configure
template: src=blog.conf.j2 dest=/etc/nginx/conf.d/blog.zqf.com.conf
notify: Reload Nginx Server
handlers:
- name: Reload Nginx Server
service: name=nginx state=reloaded
cat blog.conf.j2
upstream {{ server_name }} {
# 设置变量,并进行循环赋值,渲染配置
{% for i in range(7,10) %}
server 172.16.1.{{i}}:{{ http_port }};
{% endfor %}
}
server {
listen {{ http_port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
proxy_set_header Host $http_host;
}
}
ansible-playbook 29.yml