目录

一.  JinJia2简介

二.  JinJia2模板使用

2.1  在play中使用jinjia2

2.2  template模块使用

2.3   jinjia2条件语句

2.4  jinjia2循环语句

2.5   jinjia2过滤器

2.5.1   default过滤器

2.5.2  字符串操作相关过滤器

2.5.3  数字操作相关过滤器

2.5.4  列表操作相关过滤器

2.5.5   应用于文件的过滤器

2.5.6  应用于注册变量的过滤器


一.  JinJia2简介

Jinja2是基于python的模板引擎。那么什么是模板?

假设说现在我们需要一次性在10台主机上安装redis,这个通过playbook现在已经很容易实现。默认 情况下,所有的redis安装完成之后,我们可以统一为其分发配置文件。这个时候就面临一个问题,这 些redis需要监听的地址各不相同,我们也不可能为每一个redis单独写一个配置文件。因为这些配置 文件中,绝大部分的配置其实都是相同的。这个时候最好的方式其实就是用一个通用的配置文件来解 决所有的问题。将所有需要修改的地方使用变量替换。这个通用的配置文件就是模板。

二.  JinJia2模板使用

2.1  在play中使用jinjia2

以上面的redis为例,我们创建一个redis的模板,模板如下:

[root@clinet ~]# cat /etc/redis.conf |grep -v ^# |grep -v ^$
bind {{ ansible_eth0.ipv4.address }} 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

现在我们有了一个模板文件,那么在playbook中如何来使用呢? playbook使用template模块来实现模板文件的分发,其用法与copy模块基本相同,唯一的区别是, copy模块会将原文件原封不动的复制到被控端,而template会将原文件复制到被控端,并且使用变 量的值将文件中的变量替换以生成完整的配置文件。

playbook示例:

[root@clinet yum_file]# cat jinjia2/install_redis.yml
- hosts: testtasks:- name: configure redis max memoryset_fact:redis_mem: "{{ (ansible_memtotal_mb /2) | int }}M"- name: debug memeory debug:msg: - '{{ redis_mem }}'- name: install redis package:name: redisstate: present- name: configure redis.conftemplate:src: /root/ansible_test/ansible_2/template/redis.conf.j2dest: /etc/redis.confnotify:- restart redis- name: start redisservice:name: redisstate: startedenabled: yeshandlers:- name: restart redisservice:name: redisstate: restarted
[root@clinet yum_file]# 

2.2  template模块使用

template模块会将原文件复制到被控端,并且使用变 量的值将文件中的变量替换以生成完整的配置文件。

关于template模块的更多参数说明:

·  backup:如果原目标文件存在,则先备份目标文件

·  dest:目标文件路径

·  force:是否强制覆盖,默认为yes

·  group:目标文件属组

·  mode:目标文件的权限

·  owner:目标文件属主

·  src:源模板文件路径

·  validate:在复制之前通过命令验证目标文件,如果验证通过则复制

2.3   jinjia2条件语句

在上面的示例中,我们直接取了被控节点的ens33网卡的ip作为其监听地址。那么假如有些机器的网卡绑定的,那么网络连接时是bond0,这种做法就会报错。这个时候我们就需要在模板文件中定义条件语句如下:

{% if ansbile_bond is defined %}
bind {{ ansible_bond.ipv4.address }} 127.0.0.1
{% elif ansible_bond is defined % }
bind {{ ansible_ens33.ipv4.address }} 127.0.0.1
{% else %}
bind 0.0.0.0
{% endif %}maxmemory {{ redis_mem }}
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000

利用条件语句进一步配置redis主从模式:

{% if ansbile_bond is defined %}
bind {{ ansible_bond.ipv4.address }} 127.0.0.1
{% elif ansible_ens33 is defined %}
bind {{ ansible_ens33.ipv4.address }} 127.0.0.1
{% else %}
bind 0.0.0.0
{% endif %}{% if master_ip is defined %}
slaveof {{ master_ip }} {{ masterport | default(6379) }}
{% endif %}{% if masterpass is defined %}
masterauth {{ masterpass }}
{% endif %}{% if requirepass is defined %}
requirepass {{ requirepass }}
{% endif %}maxmemory {{ redis_mem }}
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

注意:

1.  redis主从配置只需要在slave上配置slaveof  ip  port(master节点不需要任何配置)

2.  注意防火墙

2.4  jinjia2循环语句

以nginx做负载均能,代理到后端httpd的基础实验为例,展示基础的for循环使用。

inventory配置如下:

[proxy]
192.168.194.132[webserver]
192.168.194.130
192.168.194.131
[root@clinet ansible_2]#

playbook如下:

- hosts: proxy:webservergather_facts: yespre_tasks:- name: fireword.serverservice:name: firewalldstate: stoppedenabled: nopost_tasks:- name: message infodebug:msg: 'this playbook finished'tasks:- name: install & configure ngxin blockblock:- name: install nginxpackage:name: nginxstate: present- name: configure nginx.conftemplate:src: /root/ansible_test/ansible_2/template/nginx.conf.j2dest: /etc/nginx/nginx.confbackup: yesnotify: restart nginx- name: start ngixnservice:name: nginxstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['proxy']- name: install & configure httpd blockblock:- name: install httpdpackage:name: httpdstate: present- name: confgure http.conftemplate:src: /root/ansible_test/ansible_2/template/index.html.j2dest: /var/www/html/index.htmlbackup: yesnotify: restart httpd- name: start httpdservice:name: httpdstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['webserver']handlers:- name: restart nginxservice:name: nginxstate: restarted- name: restart httpdservice:name: httpdstate: restarted

总结一:
上述示例中回顾了以下知识点:

1.  pre_tasks 是在tasks之前执行;而 post_tasks 则在tasks和handlers之后执行;

2.  when关键字,playbook中的条件语句

3.  hosts:  proxy:webserver,ansible的主机匹配规则

4.  block和when的配合使用,对整块block语句做判断。等等

总结二:

jinjia2模板中的语法总结:

1.  变量的使用: {{ 变量名 }}  (不需要用引号包裹,与playbook中的变量使用的主要区别)

2.  条件语句:
     {% if %}  ...  {% elif %} ... {% else %} ... {% endif %}

3.  循环语句:
     {% for %}  ... {% endfor %}
(注意:{%%} 是jinjia2模板的语法格式)

2.5   jinjia2过滤器

2.5.1   default过滤器

当指定的变量不存在时,用于设定默认值

示例:

‐ hosts: testgather_facts: falsevars:‐ path: /tmp/testmode: 0400‐ path: /tmp/foo‐ path: /tmp/bartasks:‐ file:path: {{ item.path }}state: touchmode: {{ item.mode|default(omit)}}with_items: "{{ paths }}"

omit表示系统默认的,也可以default(777),当变量不存在的时候,使用777为值。

2.5.2  字符串操作相关过滤器

·  upper:将所有字符串转换为大写

·  lower:将所有字符串转换为小写

·  capitalize:将字符串的首字母大写,其他字母小写

·  reverse:将字符串倒序排列

·  first:返回字符串的第一个字符

·  last:返回字符串的最后一个字符

·  trim:将字符串开头和结尾的空格去掉

·  center(30):将字符串放在中间,并且字符串两边用空格补齐30位

·  length:返回字符串的长度,与count等价

·  list:将字符串转换为列表

·  shuffle:list将字符串转换为列表,但是顺序排列,shuffle同样将字符串转换为列表,但是会随 机打乱字符串顺序

‐ hosts: testgather_facts: novars:teststr: "abc123ABC"teststr1: " abc "teststr2: "123456789"teststr3: "sfacb1335@#$%"tasks:‐ debug:msg: "{{ teststr | upper }}"‐ debug:msg: "{{ teststr | lower }}"‐ debug:msg: "{{ teststr | capitalize }}"‐ debug:msg: "{{ teststr | reverse }}"‐ debug:msg: "{{ teststr|first }}"‐ debug:msg: "{{ teststr|last }}"‐ debug:msg: "{{ teststr1 | trim }}"‐ debug:msg: "{{ teststr2 | center(30) }}"‐ debug:msg: "{{ teststr2 | length }}"‐ debug:msg: "{{ teststr3 | list }}"‐ debug:msg: "{{ teststr3 | shuffle }}"

2.5.3  数字操作相关过滤器

·  int: 将对应的值转换为整数

·  float:将对应的值转换为浮点数

·  abs:获取绝对值

·  round:小数点四舍五入

·  random:从一个给定的范围中获取随机值

‐ hosts: testgather_facts: novars:testnum: ‐1tasks:‐ debug:msg: "{{ 8+('8'|int) }}"‐ debug:# 默认情况下,如果无法完成数字转换则返回0# 这里指定如果无法完成数字转换则返回6msg: "{{ 'a'|int(default=6) }}"‐ debug:msg: "{{ '8'|float }}"‐ debug:msg: "{{ 'a'|float(8.88)' }}"‐ debug:msg: "{{ testnum|abs }}"‐ debug:msg: "{{ 12.5|round }}"‐ debug:msg: "{{ 3.1415926 | round(5) }}"‐ debug:# 从0到100中随机返回一个数字msg: "{{ 100|random }}"‐ debug:# 从5到10中随机返回一个数字msg: "{{ 10|random(start=5) }}"‐ debug:# 从4到15中随机返回一个数字,步长为3# 返回的随机数只可能是:4,7,10,13中的一个msg: "{{ 15|random(start=4,step=3) }}"‐ debug:# 从0到15随机返回一个数字,步长为4msg: "{{ 15|random(step=4) }}"

2.5.4  列表操作相关过滤器

·  length: 返回列表长度

·  first:返回列表的第一个值

·  last:返回列表的最后一个值

·  min:返回列表中最小的值

·  max:返回列表中最大的值

·  sort:重新排列列表,默认为升序排列,sort(reverse=true)为降序

·  sum:返回纯数字非嵌套列表中所有数字的和

·  flatten:如果列表中包含列表,则flatten可拉平嵌套的列表,levels参数可用于指定被拉平的层级

·  join:将列表中的元素合并为一个字符串

·  random:从列表中随机返回一个元素

·  shuffle

·  upper

·  lower

·  union:将两个列表合并,如果元素有重复,则只留下一个

·  intersect:获取两个列表的交集

·  difference:获取存在于第一个列表中,但不存在于第二个列表中的元素 ·  symmetric_difference:取出两个列表中各自独立的元素,如果重复则只留一个

2.5.5   应用于文件的过滤器

·  basename:返回文件路径中的文件名部分

·  dirname:返回文件路径中的目录部分

·  expanduser:将文件路径中的~替换为用户目录

·  realpath:处理符号链接后的文件实际路径

2.5.6  应用于注册变量的过滤器

正常情况下,当某个task执行失败的时候,ansible会中止运行。此时我们可以通过 ignore_errors 来 捕获异常以让task继续往下执行。然后调用debug模块打印出出错时的内容,拿来错误结果后,主动 失败。

‐ name: Run myprogcommand: /opt/myprogregister: resultignore_errors: True
‐ debug:var: result‐ debug:msg: "Stop running the playbook if myprog failed"failed_when: result|failed

任务返回值过滤器:

·  failed: 如果注册变量的值是任务failed则返回True

·  changed: 如果注册变量的值是任务changed则返回True

·  success:如果注册变量的值是任务succeeded则返回True

·  skipped:如果注册变量的值是任务skipped则返回True


[Ansible系列]ansible JinJia2过滤器相关推荐

  1. [Ansible系列]ansible tag介绍

    目录 简介 task      tag 1.  执行指定tag的task 2.  排除指定tag的task 3.   查看playbook中的所有tag 4.  打tag的方式 4.1   一个tas ...

  2. [ansible系列③]Ansible Inventory配置及详解

    简介 Inventory是ansible管理主机信息的配置文件,相当于我们系统的hosts文化的功能,默认存放在/etc/ansible/hosts.为了批量管理主机,便捷使用其中的主机分组,ansi ...

  3. [Ansible系列②]Ansible使用说明

    一.    简介 我们在安装主控端安装好ansible之后需要对被控端下发指令进行操作,前面说过现在的ansible的版本是通过ssh连接操作被控端的,在ssh的使用过程中我们是需要交互输入用户和密码 ...

  4. Ansible系列(六):循环和条件判断

    Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1. 循环 ansible中的循环都是借助迭代来实现的.基本都是以" ...

  5. ansible基础-Jinja2模版 | 过滤器

    Jinja2模版介绍 注:本文demo使用ansible2.7稳定版 在ansible基础-变量的「8.2 模版使用变量」章节中关于模版与变量也有所提及,有兴趣的同学可以去回顾一下. ansible通 ...

  6. Ansible系列-基础篇-Ansible Inventory的合理化配置

    欢迎关注个人公众号 DailyJobOps 原文地址:Ansible系列-基础篇-Ansible Inventory的合理化配置 这里写目录标题 Ansible Inventory内置参数 Inven ...

  7. 实例学习Ansible系列:颜色与设定

    知识点: Ansible执行的时候根据结果会显示为绿色(成功执行),黄色(成功伴随状态改变)和红色(执行失败)等颜色,颜色的显示与changed的状态相关联,并可以在ansible.cfg中进行定制颜 ...

  8. 实例学习Ansible系列:配置文件ansible.cfg的设定与使用

    知识点:Ansible中通过多层次的ansible.cfg的设定,利用不同目录结构下的配置文件的作用域,还可以结合ANSIBLE_CONFIG环境变量进行自行指定,较为方便和灵活. 环境准备 [roo ...

  9. 实例学习Ansible系列(21)从标准输出获取循环的列表

    在前面的文章中已经介绍过使用with_items进行循环控制,在静态的循环列表控制时非常方便,比如向某个特定目录下拷贝多个指定的文件.而如果对于动态的返回的列表则需要将参数传递给with_items, ...

最新文章

  1. Android实现顶层全局窗口,不依赖于Activity的Android全局悬浮窗的实现
  2. 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式
  3. 美国将尝试区块链领域和加密货币相结合
  4. matlab 中pid tuning,PID Tuning Algorithm
  5. egg风格 什么意思_egg框架学习笔记
  6. golang调用c++的dll库文件
  7. 以围棋来说,人工智能程序跟通常程序差异在哪里
  8. [论文总结] 深度学习在农业领域应用论文笔记10
  9. 【论文浅读】《Deep Pyramidal Residual Networks for Spectral–Spatial Hyperspectral Image Classification》
  10. python evn安装模块pip
  11. 端午小礼品:30 本技术书
  12. Airbnb放弃国内业务,转投外国怀抱?翅膀硬了吗?
  13. YOLOv5 anchor 编码(label assign)方式详解
  14. 【爬虫】王者荣耀爬取英雄高清4K图片
  15. 稳定性和高可用如何保障?一手测评华为云网站高可用解决方案
  16. 纯正国内的海盗王3.0修复端
  17. android peap,Android连接IEEE8021X PEAP  无感知WiFi
  18. 处理打拼音时触发input事件bug
  19. 15 个 Python 开源项目,使用 PyQt 做小型桌面应用!
  20. Istio,下一个Kubernetes?

热门文章

  1. 计算机毕业设计PHP+安卓运动健康app(源码+程序+lw+远程调试)
  2. Ubuntu基础-终端打开软件
  3. 内部温度传感器和光敏传感器实验
  4. 河南计算机教师资格证,2016河南教师资格证考试笔试备考:《信息技术学科知识与教学能力》(...
  5. 用JavaScript制作页面特效
  6. 为什么苹果6没有录屏_为什么苹果手机没有杀毒软件,难道不怕中毒?
  7. 良匠-手把手教你写NFT抢购软(一)
  8. 联想ideapad700-15isk(小新线下版)黑苹果完美驱动附详细安装过程
  9. threejs 特效 简单 火焰
  10. FinalShell 连接出现 chanel is not opened解决方案记录