25.Ansible Jinja2 模板

Ansible Jinja2 模板

Jinja2介绍

什么是Jinja2

jinja2是Python的全功能模板引擎

Jinja2跟ansible的关系

Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用到jinja2 如果在100台主机 上安装nginx,每台nginx的端口都不一样,如何解决?

使用Jinja2

使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是讲文件复制到远端主机上去,但 是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推 送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。

注意事项

  • Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用
  • 只能在template模块要推送的文件中使用Jinja2语法
  • 使用Jinja2要注意,配置文件中是否有特殊符号

错误的写法:

[root@m01 ~]# vim a.yml
{% if ansible_hostname == 'db01' %}
    yum:
      name: mariadb-serveer
      state: present
{% else %}
    aaaa
{% endif %}

Jinja2语法

## 变量调用语法
{{ 变量名 }}:调用变量,输出变量的值
playbook使用template模块

## 判断语法:
{% if 条件 %}
    动作1
{% else %}
    动作2
{% endif %}

## for循环语法
{% for n in 变量 %}
    动作
{% endfor %}

## 注释
{# 这里是注释内容 #}

Ansible中的Jinja2规范

所有的Jinja2模板文件要以j2结尾

简单的Jinja2使用

[root@m01 ~]# cat motd.j2
本机内存: {{ ansible_memtotal_mb }}
剩余内存: {{ ansible_memfree_mb }}
本机外网: {{ ansible_default_ipv4.address }}
本机内网: {{ ansible_eth1.ipv4.address }}
本机名字: {{ ansible_hostname }}


[root@m01 ~]# vim a.yml
- hosts: all
  tasks:
    - name: motd
      template:
        src: ./motd.j2
        dest: /etc/motd

Jinja2管理nginx配置文件

upstream {{ server_name }} {
{% for num in range(1,11) %}
		server 172.16.1.{{ num }};
{% endfor %}
}


server {
	listen 80;
 	server_name {{ server_name }};

	location / {
 		proxy_pass http://{{ server_name }};
	}
}

[root@m01 ~]# vim a.yml
- hosts: all
  vars:
    server_name: blog.drz.com
  tasks:
    - name: nginx
      template:
        src: ./nginx_upstream.j2
        dest: /root/nginx_upstream.conf

Jinja2管理keepalived配置文件

global_defs {				 	#全局配置
	router_id lb01 				 #标识身份->名称
}

vrrp_instance VI_1 {
	state MASTER				 #标识角色状态
	interface eth0				 #网卡绑定接口
	virtual_router_id 50	 	 #虚拟路由id
	priority 150				 #优先级
	advert_int 1 			 	 #监测间隔时间
	authentication { 			 #认证
		auth_type PASS 			 #认证方式
		auth_pass 1111 		 	 #认证密码
	}
	virtual_ipaddress {
		10.0.0.3 				 #虚拟的VIP地址
	}
}

[root@m01 ~]# cat keep.j2
global_defs {
	router_id {{ ansible_hostname }}
}

vrrp_instance VI_1 {
{% if ansible_hostname == 'lb01' %}
	state MASTER
	priority 150
{% else %}
	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模板计算

mysql配置文件
内存大小要根据物理内存的 80%

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

!includedir /etc/my.cnf.d

[root@m01 ~]# cat a.yml
- hosts: all
  tasks:
    - name: db
      template:
        src: ./my.j2
        dest: /root/my.cnf
posted @ 2021-08-17 16:04  陈金峰  阅读(131)  评论(0)    收藏  举报