1、jinja2基础介绍
1.1、什么是jinja2
Jinja2 是 Python 的全功能模板引擎
Ansible 需要使用 Jinja2 模板来修改被管理主机的配置文件。
场景1:给10台主机装上Nginx服务,但是要求每台主机的端口都不一样,如何解决?
1.2、Ansible如何使用jinja2
ansible 使用 jinja2 模板需要借助 template 模块实现,那 template 模块是用来做什么的?
template 模块和 copy 模块完全一样,都是拷贝文件至远程主机,
区别在于template 模块会解析要拷贝的文件中变量的值,而 copy 则是原封不动的将文件拷贝至被控端。
1.3、jinja模板基本语法
1、要想在配置文件中使用 jinj2 , playbook 中的 tasks 必须使用 template 模块
2、配置文件里面使用变量,比如 {{ PORT }} 或使用 {{ facts 变量 }}
1.4、jinja模板逻辑关系
1.4.1、循环表达式
{% for i in EXPR %}...{% endfor %}
1.4.2、判断表达式
{% if EXPR %}...{% elif EXPR %}...{% endif %}
1.4.3、注释
2、示例1-jinja模板入门
2.1、使用 Playbook 推送文件
cat <<'CAT_END'>jinja_first.yaml
- hosts: httpd
tasks:
- name: copy template file /tmp/motd
template: src=./motd.j2 dest=/tmp/motd
CAT_END
2.2、准备 motd.j2 文件
cat <<'CAT_END'>motd.j2
主机名:{{ansible_hostname}} MB
总内存:{{ansible_memtotal_mb}} MB
空闲内存:{{ansible_memfree_mb}} MB
CAT_END
2.3、执行 playbook
ansible-playbook jinja_first.yaml
2.4、检查执行后的状态
http1 ~]# cat /tmp/motd
主机名:http1 MB
总内存:1795 MB
空闲内存:788 MB
2.5、总结
此例子展示了如何使用 facts 变量,当 playbook 被执行后,ansible_hostname 和 ansible_memtotal_mb 将会被替换成被管理主机上搜集的facts 变量的值
3、示例2-Jinja2管理Nginx
3.1、需求
ansible 使用 jinja2 的 for 循环表达式渲染出 nginx 负载均衡的配置文件
3.2、使用 Playbook 推送文件
cat <<'CAT_END'>proxy.yaml
- hosts: httpd
vars:
http_port: 80
proxy_port: 80
server_name: www.example.com
tasks:
- name: copy template nginx configure
template:
src: ./blog.conf.j2
dest: /etc/nginx/conf.d/blog.example.com.conf
notify: reload nginx server
handlers:
- name: reload nginx server
systemd: name=nginx state=reloaded
CAT_END
3.3、准备 blog.conf.j2 配置文件
cat << 'CAT_END' >blog.conf.j2
upstream ansible_php {
{% for i in groups['httpd'] %}
server {{i}}:{{proxy_port}};
{% endfor %}
}
server {
listen {{http_port}};
server_name: {{server_name}};
location / {
proxy_pass http://ansible_php;
proxy_set_header Host $http_hosts;
}
}
CAT_END
3.4、 执行 playbook
]# ansible-playbook proxy.yaml
PLAY [httpd] *************************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.10.18]
ok: [192.168.10.17]
TASK [copy template nginx configure] *************************************************************************************************************************
ok: [192.168.10.17]
ok: [192.168.10.18]
PLAY RECAP ***************************************************************************************************************************************************
192.168.10.17 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.18 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3.5、检查 jinja 模板渲染出来的配置文件
]# cat /etc/nginx/conf.d/blog.example.com.conf
upstream ansible_php {
server 192.168.10.17:80;
server 192.168.10.18:80;
}
server {
listen 80;
server_name: www.example.com;
location / {
proxy_pass http://ansible_php;
proxy_set_header Host $http_hosts;
}
}
4、示例2-Jinja2管理Keepalived
4.1、需求
ansible使用jinja2的if判断表达式渲染出keepalived的Master和Slave的配置文件。并推送至lb组,实现方案如下:
1、设定 Inventory 中 host_vars 然后根据不同主机设定不同的变量
2、在 Playbook 中使用 when 判断主机名称,然后分发不同的配置文件。
3、使用 jinja2 的方式渲染出不同的配置文件。
4.2、编写 playbook【推送 keeplaived 配置文件】
cat << 'CAT_END' >keepalived.yaml
- hosts: httpd
tasks:
- name: copy template keepalived configure
template:
src: ./keepalived.conf.j2
dest: /etc/keepalived/keepalived.conf
notify: restart keepalived server
handlers:
- name: restart keepalived server
systemd: name=keepalived state=restarted
CAT_END
4.3、准备 keepalived.conf.j2 配置文件
cat << 'CAT_END' > keepalived.conf.j2
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == 'http1' %}
state MASTER
priority 150
{% elif ansible_fqdn == 'http2' %}
state Backup
priority 100
{% endif %}
interface ens33
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
CAT_END
4.4、执行 playbook
]# ansible-playbook keepalived.yaml
PLAY [httpd] *************************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.10.18]
ok: [192.168.10.17]
TASK [copy template keepalived configure] ********************************************************************************************************************
changed: [192.168.10.18]
changed: [192.168.10.17]
RUNNING HANDLER [restart keepalived server] ******************************************************************************************************************
changed: [192.168.10.17]
changed: [192.168.10.18]
PLAY RECAP ***************************************************************************************************************************************************
192.168.10.17 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.18 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4.5、检查keepalived配置文件
4.5.1、http1
http1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id http1
}
vrrp_instance VI_1 {
state MASTER
priority 150
interface ens33
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
4.5.2、http2
http2 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id http2
}
vrrp_instance VI_1 {
state Backup
priority 100
interface ens33
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}