例子一

循环语句

[root@m01 ~]# cat upstream.conf
upstream web {
{% for i in range(1,11) %}
server 172.16.1.{{ i }}
{% endfor %}
} server {
listen 80;
server_name wp.gong.com;
location / {
proxy_pass http://web;
include proxy_params;
}
} [root@m01 ~]# cat send_conf.yml
- hosts: web01
tasks:
- name: send jianja mode
template:
src: /root/upstream.conf
dest: /root/upstream.conf # 推送生成的效果
[root@web01 ~]# cat upstream.conf
upstream web {
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 172.16.1.10
}
server {
listen 80;
server_name wp.gong.com;
location / {
proxy_pass http://web;
include proxy_params;
}
}

jinjia2语法

变量

## 调用变量
{{ VAR }} # 会把里面的变量名转换为变量值 ## 模版文件
在一个文件中有{{ vars }}去调用变量的,使用template复制,会把变量转换为值。
模版文件中可以调用自己设置的变量。str_www: www
{{ str_www }} 调用facts变量
{{ ansible_fqdn }} # 获取主机名
{{ ansible_memtotal_mb }} # 获取主机物理内存大小 ## 逻辑判断语法
- 注释
{# 中间的是注释 #}
在推送的时候,注释不会推送到目标主机 - 循环
{% for var in data %}
{{ var }} # 表示调用变量名,data可以是一个可迭代对象
{% endfor %} - 判断的语法
{% if ansible_fqdn == "db01" %}
mem=16G
{% elif ansible_fqdn == "db02" %}
mem=8G
{% else %}
mem=4G
{% endif %}

案例一

推送motd

[root@m01 ~]# cat motd.j2
本机内存:{{ ansible_memtotal_mb }}
剩余内存:{{ ansible_memfree_mb }}
ip add : {{ ansible_eth0.ipv4.address }} [root@m01 ~]# cat send_motd.yml
- hosts: web01
tasks:
- name: send jianja mode
template:
src: /root/motd.j2
dest: /root/motd [root@web01 ~]# cat motd
本机内存:456
剩余内存:9
ip add : 10.0.0.7

fqdn和hostname的区别: 比如主机名是www.baidu.com;使用ansible_hostname得到的变量值是www;ansible_fqdn 取到的值是www.baidu.com

案例二

通过判断来配置不同的域名的nignx配置文件

[root@m01 ~]# cat upstream.j2
upstream web {
{% for i in range(1,10) %}
server 172.16.1.{{ i }}
{% endfor %}
} server {
listen 80;
{% if ansible_fqdn == "web01" %}
server_name {{ domain_1 }} {% elif ansible_fqdn == "web02" %}
server_name {{ domain_2 }} {% elif ansible_fqdn == "web03" %}
server_name {{ domain_3 }}
{% endif %}
location / {
proxy_pass http://web;
include proxy_params;
}
} [root@m01 ~]# cat send_up_j2.yml
- hosts: web_group
vars:
- domain_1: www.baidu.com
- domain_2: www.google.com
- domain_3: gong.cc.con
tasks:
- name: send up_j2 mode
template:
src: /root/upstream.j2
dest: /root/upstream_j2.conf [root@web01 ~]# cat upstream_j2.conf
upstream web {
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.baidu.com location / {
proxy_pass http://web;
include proxy_params;
}
} [root@web02 ~]# cat upstream_j2.conf
upstream web {
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.google.com location / {
proxy_pass http://web;
include proxy_params;
}
}

案例三

管理keepalived的配置文件

判断语法

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
} vrrp_script check_web {
script "/root/check_web.sh"
interval 5 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
}
track_script {
check_web
}
} [root@lb02 ~]# cat /etc/keepalived/keepalived.conf
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
}
} [root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
} vrrp_script check_web {
script "/root/check_web.sh"
interval 5 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
}
track_script {
check_web
}
} {# 把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
}
}

案例四

根据实际物理内存的大小来分配给mysql所占内存的百分比

[root@m01 ~]# vi mysql_mem.j2
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_buffer_pool_size = {{ (ansible_memtotal_mb * 0.8) | 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
FBI WARNING
QQ:1402122292 认准原创sheldon 别人叫我晓东

最新文章

  1. SQL Server 监控系列(文章索引)
  2. Events基本概念----Beginning Visual C#
  3. 编写高质量的Objective-C代码
  4. VTK初学一,a_Vertex图形点的绘制
  5. 开源多线程性能测试工具-sysbench
  6. Clustering with the ArcGIS API for Flex
  7. nodejs base64 编码解码
  8. window.onload与$.ready的差别
  9. hihocoder 1082 然而沼跃鱼早就看穿了一切(字符串替换)
  10. mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual t
  11. java--简单排序算法
  12. HDU 5648 DZY Loves Math 暴力打表
  13. testng,soket write error错误
  14. python学习随笔(三)
  15. 从Java熟练到Android入门
  16. [REST] 1.REST的起源
  17. Python列表的增删改查排嵌套特殊输出格式
  18. latex数学公式笔记
  19. js中常用的正则表达式总结
  20. LeetCode - 703. Kth Largest Element in a Stream

热门文章

  1. Julia语言程序基础
  2. 【CTF】WDCTF-2017 3-1 writeup
  3. 关于 下载 nfs-utils时的 gssproxy conflicts with selinux-policy-3.13.1-102.el7.noarch 错误
  4. .NET6 平台系列1 .NET发展史之.NET Framework简介
  5. TortoiseGit2.12.0-64下载和安装【Windows10】
  6. 【SpringBoot源码分析】-Bean的加载过程
  7. kubectl简介
  8. Weekly Contest 137
  9. 百度API定位根据经度、维度 返回当前详细地址
  10. ART模式下基于Xposed Hook开发脱壳工具