jinja2模板语法

ads

Jinja2模板介绍

jinja2是什么?

jinja2是Python的全功能模板引擎

Ansible与Jinja2啥关系?

在Ansible中通常会用到jinja2模板来修改被管理机配置文件等。在Saltstack中同样也会用到jinja2。

Ansible如何使用Jinja2

使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。

Ansible使用Jinja2注意事项

Jinja2文件中可以使用判断和循环(见下),注意与playbook中的判断和循环不同。playbook中是when和with_item

Jinja2模板语法

基本语法

1)playbook文件使用template模块2)模板文件里面变量使用{{}},比如{{PORT}},或使用facts

怎么调用变量

{{ 变量名 }}   可以在配置文件中使用,也可以在playbook里用

注释

BASH、Python、YAML都是# 注释
<!--html注释  ->
{# jinja2注释 #} 仅可以在配置文件中使用

判断

仅可以在配置文件中使用{% if%}{% elif%}{% else%}{% endif%}
{% if $?== 0%}echo xxx{% else%}echo aaa{% endif%}

循环

{% for 条件%}{% end 条件%}

Jinja2模板实践

例一:在motd文件调用变量

例一:在motd文件调用变量/etc/motd:这个文件是在你登录之后显示的,不管你是 TTY 还是 PTS 登录,也不管是 Telnet 或 SSH 都会显示这个文件里面的信息。
# 准备playbook[root@m01 ~/ansible]# vim jinja2.yml- hosts: web_grouptasks: - name: 复制模板文件 template: #//使用template模块 src: /root/ansible/motd.j2 dest: /etc/motd
# 准备要复制的文件motd.j2vim /root/ansible/motd.j2=========================================欢迎使用:{{ ansible_fqdn }}本机总内存:{{ ansible_memtotal_mb }}本机可用内存:{{ ansible_memfree_mb }}本机内网IP: {{ ansible_eth0 ['ipv4']['address'] }}=========================================
# 准备完成,执行Playbook[root@m01 ~/ansible]# lltotal 8-rw-r--r-- 1 root root 126 Oct 7 05:52 jinja2.yml-rw-r--r-- 1 root root 264 Oct 7 05:53 motd.j2[root@m01 ~/ansible]# ansible-playbook jinja2.yml...

## 执行Playbook后效果:每台机器登录时变量都会自动识别[root@web01 ~]# cat /etc/motd=========================================欢迎使用:web01本机总内存:972本机可用内存:145本机内网IP: 10.0.0.7=========================================
Last login: Mon Aug 14 08:11:23 2023 from 172.16.1.61=========================================欢迎使用:web01本机总内存:972本机可用内存:145本机内网IP: 10.0.0.7=========================================
#该示例展示了如何利用jinja2模板使用facts变量,达到我们想要的目的,实现自动化的需求


例二:使用jinja2模
板的if判断渲染keepalived配置文件,并推送到不同lb主机上

例二:使用jinja2模板的if判断渲染keepalived配置文件,并推送到不同lb主机上
#playbook:cat config_keepalived.yml- hosts: all tasks: - name: 下发keeepalived配置文件 template: src: /root/ansible/keepalived/keepalived.j2 dest: /etc/keepalived/keepalived.conf when: ansible_fqdn is match 'lb*'
#配置文件cat /root/ansible/keepalived/keepalived.j2 #//不使用jinja2的话需要准备两份配置文件,MASTER的与BACKUPglobal_defs { router_id {{ ansible_fqdn }}}
{% if ansible_fqdn == 'lb01' %}vrrp_script check_ngx { script "/root/check_web.sh" interval 5}
vrrp_instance VI_1 { track_script { check_ngx } state MASTER priority 150{% else %}vrrp_instance VI_1 { 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 }}
例三:使用jinja2的for循环管理nginx负载均衡配置文件#playbook[root@m01 ~/ansible]# vim lb_blog.yml- hosts: lb_group  vars:    nginx_port: 80    domain_name: blog.andrew.com    pool_name: blog_pools
tasks: - name: 下发nginx配置文件 template: src: /root/ansible/blog_lb_conf.j2 dest: /opt/nginx.conf notify: 重载nginx handlers: - name: 重载nginx systemd: name: nginx state: reloaded
#配置文件[root@m01 ~/ansible]# vim blog_lb_conf.j2upstream {{ pool_name }} { {% for number in range(7,17) %} server 10.0.0.{{ number }}:{{ nginx_port }}; {% endfor %}}
server{ listen {{ nginx_port }}; server_name {{ domain_name }}; location / { proxy_pass http://{{ pool_name }}; include /etc/nginx/conf.d/proxy_params; }}
#执行playbook[root@m01 ~/ansible]# ansible-playbook lb_blog.yml
#查看结果[root@lb01 /opt]# cat nginx.conf [root@lb02 /opt]# cat nginx.conf upstream blog_pools { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; server 10.0.0.10:80; server 10.0.0.11:80; server 10.0.0.12:80; server 10.0.0.13:80; server 10.0.0.14:80; server 10.0.0.15:80; server 10.0.0.16:80; }
server{ listen 80; server_name blog.andrew.com; location / { proxy_pass http://blog_pools; include /etc/nginx/conf.d/proxy_params; }}
 例四:使用jinja2管理MySQL配置文件
[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0innodb_buffer_pool_size=800M
[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-file=/var/run/mariadb/mariadb.pid!includedir /etc/my.cnf.d

## 根据主机内存修改buffer pool[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0innodb_buffer_pool_size={{ (ansible_memtotal_mb * 0.8)|int }}M
[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-file=/var/run/mariadb/mariadb.pid!includedir /etc/my.cnf.d





扫描二维码

收获更多精彩

Andrew




最后编辑于:2024/1/9 拔丝英语网

admin-avatar

英语作文代写、国外视频下载

高质量学习资料分享

admin@buzzrecipe.com