IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Ansible Jinjia2 模板 -> 正文阅读

[系统运维]Ansible Jinjia2 模板

Ansible Jinjia2 模板

Jinjia2模板介绍

什么是jinja2模板

jinja2是Python的全功能模板引擎

Jinja2与Ansible啥关系

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

Ansible如何使用Jinja2

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

注意事项

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

下面的写法是错误的:

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

Jinja2语法

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

#判断语法
{% if 条件 %}
      xxx
{% else %}
       aaa
{% endif %}


# for语法
{% for n in 变量 %}
      xxx
{% endfor %}


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

ansible中jinja2 规范

所欲的jinja2模板文件要以 j2 结尾

简单的jinja2使用

准备motd.j2文件

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

准备playbook文件

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

执行playbook

[root@m01 ~]# ansible-playbook a.yml 

PLAY [all] *******************************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [db01]
ok: [nfs]
ok: [backup]
ok: [web02]
ok: [web01]

TASK [motd] ******************************************************************************
changed: [nfs]
changed: [web02]
changed: [db01]
changed: [web01]
changed: [backup]

PLAY RECAP *******************************************************************************
backup                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
db01                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
nfs                        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
web01                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
web02                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

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 
	priority 150 
	advert_int 1 
	authentication { 
	auth_type PASS 
	auth_pass 1111 
	}
	virtual_ipaddress {
		10.0.0.3 
	}
}

[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

作业

主机名外网IP内网ip角色部署服务
m0110.0.0.61172.16.1.61ansible管理端ansible
backup10.0.0.41172.16.1.41ansible被管理端,rsync服务端,nfs备机rsync,nfs
nfs10.0.0.31172.16.1.31ansible被管理端,rsync客户端,nfs服务端rsync,nfs,sersync
web0110.0.0.7172.16.1.7ansible被管理端,nfs客户端,webnginx,nfs,wordpress
web0210.0.0.8172.16.1.8ansible被管理端,nfs客户端,webnginx,nfs,wordpress
db0110.0.0.51172.16.1.51ansible被管理端,数据库mariadb
lb0110.0.0.5172.16.1.5被管理端,负载均衡nginx,keepalived
lb0210.0.0.6172.16.1.6被管理端,负载均衡nginx,keepalived
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 13:05:48  更:2021-08-18 13:06:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 19:43:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计