Ansible Jinja2 模板
1.jinja2渲染NginxProxy配置文件
- jinja2
- 房屋建筑设计固定的?
- jinja2模板与Ansible关系
- Ansible如何使用jinja2模板
- template模块 拷贝文件?
- template copy 区别?
- template会解析配置文件中的变量
- copy 不会解析任何的变量,只会拷贝文件
Ansible允许jinja2模板中使用判断 循环,但是jinja判断循环语法不允许在playbook中使用。
注意: 不是每个管理员都需要这个特性,但是有些时候jinja2模板能大大提高效率。
1.jinja模板基本语法
1)要想在配置文件中使用jinj2,playbook中的tasks 必须使用template模块
2)模板配置文件里面使用变量,比如 {{ PORT }} 或使用 {{ facts 变量 }}
2.jinja模板逻辑关系
{% for i in EXPR %}…{% endfor%} 作为循环表达式
{% if EXPR %}…{% elif EXPR %}…{% endif%} 作为条件判断
{# COMMENT #} 表示注释
{% for i in range(1,10)%}
server 172.16.1.{{i}};
{% endfor %}
#判断
{% if ansible_fqdn == "web01" %}
echo 123
{% elif ansible_fqdn == "web02" %}
echo 456
{% else %}
echo 789
{% endif %}
案例1 nginx proxy配置文件
[root@manage jinja2]# tree
.
├── file
│ └── proxy_kod.com.conf.j2
├── group_vars
│ └── all
└── proxy_nginx.yml
[root@manage jinja2]# cat proxy_nginx.yml
- hosts: lbservers
tasks:
- name: Installed Nginx Server#安装nginx(没有nginxyum源自己找一个)
yum:
name: nginx
state: present
- name: Configure Nginx Server#配置nginx
template:
src: ./file/proxy_kod.com.conf.j2
dest: /etc/nginx/conf.d/proxy_kod.cwq.com.conf
notify: Restart Nginx Server
- name: Systemd Nginx Server#启动nginx
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx Server#配置文件改变自动重启
systemd:
name: nginx
state: restarted
#nginx proxy配置文件渲染
[root@manage file]# cat proxy_kod.com.conf.j2
upstream {{kod_server_name}} {
#用循环去读取主机组里的主机
{% for host in groups['webservers'] %}
server {{host}}:{{ kod_http_port }};
{% endfor %}
}
server {
listen {{ kod_http_port }};
server_name {{ kod_server_name }};
location / {
proxy_pass http://{{ kod_server_name }};
proxy_set_header Host $http_hosts;
}
}
# nginx组变量
[root@manage jinja2]# cat group_vars/all
###kod
kod_http_port: 80
kod_server_name: kod.cwq.com
[root@manager jinja2]# cat ../hosts
[lbservers]
172.16.1.7
172.16.1.8
案例2 Keepalived配置文件 master slave
#准备多个配置文件 master backup
#1.准备一份keepalived配置文件
[root@manage jinja2]# tree
.
├── file
│ ├── keepalived-backup.conf.j2
│ ├── keepalived-master.conf.j2
├── j_keeplive.yml
#准备keepalived文件
[root@manage jinja2]# cat file/keepalived-master.conf.j2
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
priority 150
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
[root@manage jinja2]# cat file/keepalived-backup.conf.j2
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
priority 150
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
#准备keepalived的playbook文件
[root@manage jinja2]# cat j_keeplive.yml
- hosts: lbservers
tasks:
- name: Installed Keepalived Server
yum:
name: keepalived
state: present
- name: Configure Keepalived Master
copy:
src: ./file/keepalived-master.conf.j2
dest: /etc/keepalived/keepalived.conf
when: ( ansible_hostname == "lb01")
notify: Restarted Keepalived Server
- name: Configure Keepalived Master
copy:
src: ./file/keepalived-backup.conf.j2
dest: /etc/keepalived/keepalived.conf
when: ( ansible_hostname == "lb02")
notify: Restarted Keepalived Server
- name: Systemd Keepalived Server
systemd:
name: keepalived
state: started
enabled: yes
handlers:
- name: Restarted Keepalived Server
systemd:
name: keepalived
state: present
[root@manage jinja2]# ansible-playbook j_keeplive.yml -i ../hosts
2.设定host_vars变量 5和6设定相同的变量,不同的值(重要)
#1.准备一份keepalived配置文件
#2.需要在keepalived配置文件中使用变量方式 ---> jinja
[root@manager jinja2]# cat ./file/keepalived-vars.conf.j2
global_defs {
router_id {{ ansible_hostname }}
}
vrrp_instance VI_1 {
state {{ state }}
priority {{ priority }}
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
[root@manager jinja2]# cat host_vars/172.16.1.5
state: MASTER
priority: 200
[root@manager jinja2]# cat host_vars/172.16.1.6
state: BACKUP
priority: 99
[root@manager jinja2]# cat var_keepalived.yml
- hosts: lbservers
tasks:
- name: Installed Keepalived Server
yum:
name: keepalived
state: present
- name: Configure Keepalived Master
template:
src: ./file/keepalived-vars.conf.j2
dest: /etc/keepalived/keepalived.conf
notify: Restart Keepalived Server
- name: Systemd Keepalived Server
systemd:
name: keepalived
state: started
enabled: yes
handlers:
- name: Restart Keepalived Server
systemd:
name: keepalived
state: restarted
#为不同的主机设定相同的变量, 只不过值不一样.
[root@manage jinja2]# ansible-playbook -i ../hosts j_keeplive.yml
3.jinja2判断方式(重要)
[root@manager jinja2]# cat jinja_keepalived.yml
- hosts: lbservers
tasks:
- name: Installed Keepalived Server
yum:
name: keepalived
state: present
- name: Configure Keepalived Master
template:
src: ./file/keepalived.conf.j2
dest: /etc/keepalived/keepalived.conf
notify: Restart Keepalived Server
- name: Systemd Keepalived Server
systemd:
name: keepalived
state: started
enabled: yes
handlers:
- name: Restart Keepalived Server
systemd:
name: keepalived
state: restarted
[root@manager jinja2]# cat file/keepalived.conf.j2
global_defs {
router_id {{ ansible_hostname }}
}
#此处写了一个jinja的判断语句
vrrp_instance VI_1 {
{% if ansible_hostname == "lb01" %}
state MASTER
priority 150
{% elif ansible_hostname == "lb02" %}
state BACKUP
priority 100
{% endif %}
#########################相同的内容
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}