ansible剧本-jinja模板实操

Ansible之jinja2模板

什么是jinja模板#

Copy
# jinja模块介绍 jinja2是Python的全功能模板引擎,通常将管理端的文件cp到被管理端,而管理端中的文件存在ansible变量,则此文件被称为jinja模板,一般此模板以.j2结尾命名,如需要使模板中变量生效,及在推送至客户端时需要使用名为template模块。该模块和copy一样,区别就在于template可以获取到文件中的变量。 # 注意: ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用

jinja模板使用基本语法#

Copy
## 模板文件:也就是我们的配置文件(要推送的文件,并且文件中需要变量) ## 调用变量 {{ 变量名 }} ## jinja2会自动把带有{{ 变量名 }} 替换成变量值 ## 模板文件里的变量 1.可以调用自己设置的web_user_group: www {{ web_user_group }} 2.可以调用facts变量:ansible web01 -m setup {{ ansible_fqdn }} ## 获取主机名 {{ ansible_memtotal_mb }} ## 获取总内存大小 案例:MySQL根据物理主机的内存大小,来设置分配的内存空间 MySQL占物理内存的 75% ~ 80%

jinja模板之循环#

Copy
## 逻辑判断语法: 注释:{# 被注释的内容 #} 循环:{% for 变量名 in range(1,101) %} {{ 变量名 }} {% endfor %} # 案例演示: # 1.将配置文件中书写循环,加上变量,并为.j2结尾 (循环1到10,10不算,顾头不顾腚) [root@m01 ansible]# cat wp.lb.j2 upstream tcy_lb { {% for num in range(1,10) %} server 172.16.1.{{ num }}; {% endfor %} } server { listen 80; server_name www.wp.com; location / { proxy_pass http://tcy_lb; include proxy_params; proxy_next_upstream error timeout http_500 http_502 http_503 http_504; } } # 2. 使用template模块将模板文件拷贝到被管理端中 [root@m01 nginx]# ansible web_group -m template -a 'src=/ansible/wp.lb.j2 dest=/root/' # 3. 查看被管理端文件 [root@web01 ~]# cat wp.lb.j2 upstream tcy_lb { server 172.16.1.1; server 172.16.1.2; server 172.16.1.3; server 172.16.1.4; server 172.16.1.5; server 172.16.1.6; server 172.16.1.7; server 172.16.1.8; server 172.16.1.9; } server { listen 80; server_name www.wp.com; location / { proxy_pass http://tcy_lb; include proxy_params; proxy_next_upstream error timeout http_500 http_502 http_503 http_504; } }

jinja模板之判断#

Copy
# 判断: {% if ansible_fqdn == 'db01' %} mem=16G {% elif ansible_fqdn == 'db02' %} mem=8G {% else %} mem=4G {% endif %}

Jinja2的使用#

案例一:使用变量推送motd#

Copy
{# 直接调用变量的方式 #} [root@m01 ~]# cat motd.j2 欢迎来到红浪漫 总共技师个数: {{ ansible_memtotal_mb }} 剩余技师个数: {{ ansible_memfree_mb }} 红浪漫浦东新区地址: {{ ansible_eth0['ipv4']['address'] }} [root@m01 ~]# cat push_motd.yml - hosts: all tasks: - name: Push Motd File template: src: ./motd.j2 dest: /etc/motd

案例二:使用Jinja2管理nginx#

Copy
[root@m01 ~]# cat proxy.conf upstream web { {# 下面的循环是1-100的IP #} {% for num in range(1,101) %} server 10.0.0.{{ num }}:{{ backend_port }} {% endfor %} } server { listen {{ port }}; {% if ansible_hostname == 'web01' %} server_name {{ domain_name1 }}; {% elif ansible_hostname == 'web02' %} server_name {{ domain_name2 }}; {% else %} server_name {{ domain_name3 }}; {% endif %} location / { proxy_pass http://web; proxy_set_header Host $host; } } [root@m01 ~]# cat a.yml - hosts: web_group vars: - backend_port: 8080 - port: 80 tasks: - name: config nginx conf template: src: ./proxy.conf dest: /root

案例三:使用jinja2管理keepalived#

Copy
{# keepalived的配置文件 #} global_defs { router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 50 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } } global_defs { router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } } {# 把keepalived配置文件改成模板文件 #} global_defs { router_id {{ ansible_fqdn }} } vrrp_instance VI_1 { {% if ansible_fqdn == 'lb01' %} state MASTER priority 150 {% elif ansible_fqdn == '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 } } {# 推送的文件 #} [root@m01 ~]# vim a.yml - hosts: lb_group vars: tasks: - name: config keep conf template: src: ./keep.conf dest: /root - name: xxx shell copy: src: dest: when: ansible_fqdn == 'lb01'

案例四:Jinja2管理MySQL#

Copy
{# 安装配置MySQL #} - hosts: db_group tasks: - name: i m yum: name: - mariadb-server - MySQL-python state: present - name: t c template: src: ./my.j2 dest: /etc/my.cnf {# MySQL的模板文件 #} [root@m01 ~]# vim my.j2 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock innodb_buffer_pool_size = {{ (ansible_memtotal_mb * 80 / 100)|int }} symbolic-links=0 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid !includedir /etc/my.cnf.d
posted @   元气少女郭德纲!!  阅读(428)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
点击右上角即可分享
微信分享提示
CONTENTS