文章目录

  • 一、简介
  • 二、jinja2语法
    • 1.jinja2变量
      • 1.1 配置文件中使用jinja变量
      • 1.2在脚本中定义jinja变量
      • 1.3在脚本中设置grains变量
        • 例子1:单值
        • 例子2:多值
        • 例子3:多层取值
          • (1)在命令中多层取值
          • (2)在脚本中多层取值
    • 2.表达式
      • 1.1 if判断
      • 1.2for循环

一、简介

jinja2是一个强大的pyton模板引擎,可以使用代码动态生成内容 创建文件内容。
可以用jinja2 配置grain和pillar扩展sls配置文件
可以用jinja2 配置grain和pillar动态下发文件(服务配置文件、shell脚本等等)

在saltstack中 jinji模板其实就是一个带有salt变量的文件:
这个文件可以是服务的配置文件 也可以是脚本

二、jinja2语法

本文档中salt得版本

[root@salt-master shell_scripts]# salt --version
salt 3002.2
因为可能因为版本问题 在编写Jinja模板时 语法可能会有些许区别

1.jinja2变量

引用变量中的方法{{ 变量名 }},引用了jinja变量的文件后缀一定是j2

1.1 配置文件中使用jinja变量

[root@salt-master ~]# mkdir -p /srv/salt/httpd#这里准备一个配置文件和一个sls文件
[root@salt-master httpd]# ls
httpd.conf.j2  httpd.sls#在httpd.conf中引用变量
[root@salt-master httpd]# grep -i "^listen" httpd.conf
Listen {{ http_port }}

在sls文件中定义jinja变量

#定义jinja变量
[root@salt-master httpd]# vim httpd.sls
copy httpd config file:file.managed:- source: salt://httpd/httpd.conf.j2- name: /etc/httpd/conf/httpd.conf- template: jinja- defaults:http_port: 8081解释: - template:jinja 说明发送的文件是一个jinja模板- defaults: 定义了http_port变量

执行结果:

[root@salt-master httpd]# salt '*' state.sls httpd.httpd查看客户端内容是否发生变化:
[root@salt-client ~]# grep -i "^listen" /etc/httpd/conf/httpd.conf
Listen 8081

1.2在脚本中定义jinja变量

我们可以将jinja变量直接定义在脚本中,语法如下:

{% set 变量名 = 值 %} :在脚本中替换后会变成空行
或者
{% set 变量名 = 值 -%}:在脚本中替换后不会变成空行
[root@salt-master ~]# mkdir -p /srv/salt/shell_scripts
[root@salt-master ~]# cd /srv/salt/shell_scripts/
[root@salt-master shell_scripts]# ls
shell.sls  test.sh.j2[root@salt-master shell_scripts]# cat shell.sls
send_shell:file.managed:- source: salt://shell_scripts/test.sh.j2- name: /root/test.sh- user: root- group: root- mode: 644- template: jinja [root@salt-master shell_scripts]# cat test.sh.j2
#!/bin/bash{% set name = 'zhangsan' %}
echo "my name is {{name}}"

执行

[root@salt-master shell_scripts]# salt '*' state.sls shell_scripts.shell

在客户端查看test.sh

[root@salt-client ~]# cat test.sh
#!/bin/bashecho "my name is zhangsan"

1.3在脚本中设置grains变量

在前边文章中讲过grains的用法

[root@salt-master ~]# salt '*' grains.item os
salt-client:----------os:CentOS
或者
[root@salt-master ~]# salt '*' grains.get os
salt-client:CentOS
例子1:单值
[root@salt-master shell_scripts]# cat test.sh.j2
#!/bin/bash
{% set system_name = grains['os'] -%}
echo "system version = {{system_name}}"执行结果如下:
[root@salt-master shell_scripts]# salt '*' state.sls shell_scripts.shell在客户端查看
[root@salt-client ~]# cat test.sh
#!/bin/bash
echo "system version = CentOS"
例子2:多值

在例子1中 os项的值只有1个,如果有多个值得项应该如何取值,比如

[root@salt-master shell_scripts]# salt '*' grains.get ipv4
salt-client:- 127.0.0.1- 192.168.1.211- 192.168.122.1
[root@salt-master shell_scripts]# cat test.sh.j2
#!/bin/bash{% set ip = grains['ipv4'][0] -%}
echo "ip address = {{ ip }}"
[root@salt-client ~]# cat test.sh
#!/bin/bashecho "ip address = 127.0.0.1"

或者

[root@salt-master shell_scripts]# cat test.sh.j2
#!/bin/bash{% set ip = salt['grains.get']('ipv4')[0] -%}
echo "ip address = {{ ip }}"
例子3:多层取值
[root@salt-master shell_scripts]# salt '*' grains.item ip_interfaces
salt-client:----------ip_interfaces:----------ens32:- 192.168.1.211- fe80::2da7:41c7:9e01:82c1lo:- 127.0.0.1- ::1virbr0:- 192.168.122.1virbr0-nic:
(1)在命令中多层取值
[root@salt-master shell_scripts]# salt '*' grains.item ip_interfaces:ens32:0
salt-client:----------ip_interfaces:ens32:0:192.168.1.211
[root@salt-master shell_scripts]# salt '*' grains.item ip_interfaces:ens32:1
salt-client:----------ip_interfaces:ens32:1:fe80::2da7:41c7:9e01:82c1
(2)在脚本中多层取值
[root@salt-master shell_scripts]# cat test.sh.j2
#!/bin/bash{% set ip = grains['ip_interfaces']['ens32'][0] -%}
echo "ip address = {{ ip }}"或者
#!/bin/bash{% set ip = salt['grains.get']('ip_interfaces:ens32:0') -%}
echo "ip address = {{ ip }}"

2.表达式

在模板中使用表达式的格式是:

{% 表达式 -%}
设置变量也是表达式得一种
1.1 if判断
[root@salt-master shell_scripts]# vim test.j2
#!/bin/bash
{% if grains['os'] == 'CentOS' -%}echo "hello world"
{% else -%}echo "HELLO WORLD"
{% endif -%}

执行结果

[root@salt-master shell_scripts]# salt 'salt-client' state.sls shell_scripts.shell
[root@salt-client ~]# cat test.sh
#!/bin/bash
echo "hello world"
1.2for循环
#!/bin/bash
{% for i in grains['ipv4'] -%}
iptables -A INPUT -s {{ i }} -j ACCEPT
{% endfor %}

执行结果

[root@salt-client ~]# cat test.sh
#!/bin/bash
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s 192.168.1.211 -j ACCEPT
iptables -A INPUT -s 192.168.122.1 -j ACCEPT

Linux-saltstack-4 jinjia模板得基本使用相关推荐

  1. 【ansible4】Ansible中的变量及加密(jinjia模板使用等,图文详解)

    Ansible中的变量及加密 一.变量的设定 一.变量命名规则 二.变量级别 三.变量设定和使用方式 二.JINJIA2模板 一.简介 二.使用方法 三.jinjia2模板的for循环,if用法 一. ...

  2. Flask入门之Jinjia模板的一些语法

    原文:https://www.cnblogs.com/wongbingming/p/6807771.html Flask入门之Jinjia模板的一些语法 1. 变量表示 {{ argv }} 2. 赋 ...

  3. python 根据jinjia模板写excle

    python 更具jinjia 模板写excel文件,需要安装python 的一个包. pip install xlsxtpl 写excle 模板,jinjia 语法. 代码如下: import os ...

  4. 【linux】kill命令模板

    前言 维护linux时,怎么kill命令怎么写使用才能方便? 找到pid ps -aux|grep "程序特征"|grep -v grep|cut -c 9-15 ps -ef|g ...

  5. hinkphp项目部署到Linux服务器上报错“模板不存在”如何解决

    检查了服务器上的文件,并没有缺少文件,再次上传文件到服务器,还是报错.莫名其妙,怀疑是代码问题. 仔细检查后,发现是模板的文件名问题: 用过TP的都知道:thinkphp会在$this->dis ...

  6. Linux运维简历模板技术储备(by ob)

    总结学过的知识点: Linux启动过程,NFS原理,RSYNC,LVS模式原理,MYSOL主从同步原理,及故障了如何解决.还有备份恢复的方案.监控报警等. Linux基础指令 整理后 =分割线= 简历 ...

  7. 基于Linux的socket编程模板

    在网络编程编程中,我们经常会遇到这样一种C/S架构,服务器端(Server)监听客户端(Client)发送过来的命令,然后解析该命令,并做对应的处理,最后返回处理结果(例如成功或者失败及原因)给客户端 ...

  8. SaltStack 使用 Jinja2 模板

    Jinja2 是基于 python 的一个模板引擎,如下,使用 Jinja2 实现根据不同的操作系统分发不同的文件: [root@localhost ~]$ cat /srv/salt/test.sl ...

  9. ansible jinjia模板、委派与角色

    文章目录 一.Ansible delegate 1.1 什么是Task委派 1.2 TASK委派实践 1.3 创建普通用户管理ansible 1.4 ansible + haproxy实现代码滚动发布 ...

最新文章

  1. opencv配置(转)
  2. 成功解决eric6-EditorConfig Properties The EditorConfig properties for file h5py\numpy.pxd could not be l
  3. SendMessage、PostMessage原理
  4. python print %s 号格式化输出
  5. 试编写小字典软件c程序,用tcc编译为trans.exe, 功能是读取文本文件in.txt,依据命令行参数输出对应查找结果
  6. IMX6怎么移植最新Android,[IMX6Q][Android5.1]移植筆記 --- 無法掛載system文件系統
  7. 95后CV工程师晒出工资单:狠补了这个,真香…
  8. android 评分条 RatingBar 使用及自定义
  9. 悲痛!南京大学又一女博士跳楼身亡!半年已4位…
  10. 跟小静读CLR via C#(10)-参数
  11. 疫期免费 “零接触”云迁移~工具替代人力! 人不聚,活儿继续!
  12. 7.spring之Bean的作用域
  13. 日本经验 | 距离最新潮的老年电竞,中国还有多远?
  14. 任正非亲自参与,2021数字化转型再造华为!
  15. 2018东北四省赛参赛总结
  16. 微信小程序一定要设置服务器域名,微信小程序 设置域名 必须是https么
  17. 电脑系统故障维修,系统C盘满了怎么办?教你c盘清理方法
  18. Unity UGUI实现图文混排
  19. “元宇宙”,究竟离我们有多远?(下)
  20. 金融 计算机 硕士排名2015,2015考研 金融专硕学校实力及就业排名_跨考网

热门文章

  1. 抖音字符画实现过程中的问题
  2. MySQL跑得慢的原因分析
  3. 前端经典面经--助你金九银十面试无忧
  4. Unity3D Value噪声算法代码实现
  5. 怎么使用Vegas制作霓虹灯效果?
  6. eclipse,包的分级显示
  7. 小学六年级 计算机演讲稿,小学六年级演讲稿大全【5篇】
  8. 米线店结账程序 装饰着模式_装饰者模式的运用
  9. 软考报名哪些材料需要提前准备?
  10. linux syslog 删除文件_Linux不小心删除日志文件syslog怎么办?