Linux-saltstack-4 jinjia模板得基本使用
@
一、简介
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/bash
echo "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/bash
echo "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:82c1
lo:
- 127.0.0.1
- ::1
virbr0:
- 192.168.122.1
virbr0-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模板得基本使用的更多相关文章
- SaltStack配置管理-jinja模板
上一篇:SaltStack配置管理-状态间关系 需求:需要apache配置文件里面监听的端口是每个minion本地的地址 saltstack默认的模板是jinjia模板 参考文档:http://doc ...
- linux下iptables配置模板
linux下iptables配置模板 # Flush all policy iptables -F iptables -X iptables -Z iptables -t nat -F iptable ...
- saltstack在jianja模板中,执行salt函数来获取某些变量的值,并且将配置写入到配置文件中?
问题描述: 通过saltstack的jinja模板方式,可以将变量的值写入到配置文件,即动态获取的方式.这里介绍,通过执行salt函数来获取值的方式. 演示: 1.通过在sls中,增加jinja的模板 ...
- saltstack通过jinja模板,grains方式将配置的变量值写入到配置文件中?
需求描述: 在通过saltstack进行jinja模板获取值的时候,可以通过grains的方式,获取一些操作系统相关的信息,比如,OS,ip地址等,在这里演示下,做个记录. 演示: 1.修改sls文件 ...
- Flask:Jinjia模板
Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能. 一.变量 1.1 手动传入的变量: 基本类型:{{ var }} 字 ...
- Flask入门之Jinjia模板的一些语法
1. 变量表示 {{ argv }} 2. 赋值操作 {% set links = [ ('home',url_for('.home')), ('service',url_for('.service' ...
- saltstack通过jinja模板,将变量值增加到配置文件中?通过引用变量值修改配置文件?
需求描述: 在使用saltstack的时候,有的时候,需要根据不同的变量来增加配置,比如,bind,监听端口,这些都可以通过变量写入,并且在配置的时候引用,下面是一个例子,用来演示,如何使用jinja ...
- hinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
检查了服务器上的文件,并没有缺少文件,再次上传文件到服务器,还是报错.莫名其妙,怀疑是代码问题. 仔细检查后,发现是模板的文件名问题: 用过TP的都知道:thinkphp会在$this->dis ...
- Linux虚拟机封装成模板
对安装在VMware上的CentOS7.X进行封装,是为了后续的实验环境需要,可以批量去生成Linux系统.通过虚拟机模版来创建一台CentOS系统,跟原来机器一样,去掉了唯一性,而通过克隆出来的虚拟 ...
随机推荐
- redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...
- 如何在linux 上配置NTP 时间同步?
故障现象: 有些应用场景,对时间同步的要求严格,需要用到NTP同步,如何在linux上配置NTP时间同步? 解决方案: 在linux 上配置NTP 时间同步,具休操作步骤,整理如下: 1.安装软件包( ...
- 【spring AOP】@Pointcut的12种用法
@Pointcut用来标注在方法上来定义切入点. 使用格式:@ 注解(value="表达标签 (表达式格式)").如:@Pointcut("execution(* com ...
- jquery:iframe里面的元素怎样触发父窗口元素的事件?
例如父窗口定义了一个事件. top: $(dom1).bind('topEvent', function(){}); 那么iframe里面的元素怎样触发父窗口dom1的事件呢?这样吗? $(dom1, ...
- java关键字volatile内存语义详细分析
volatile变量自身具有下列特性. 1.可见性.对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写 入. · 2.原子性:对任意单个volatile变量的读/ ...
- 使用buffered流结合byte数组,读入文件中的内容,包括中文字符
package com.itcast.demo05.Buffered;import java.io.BufferedInputStream;import java.io.FileInputStream ...
- SQL->Python->PySpark计算KS,AUC及PSI
KS,AUC 和 PSI 是风控算法中最常计算的几个指标,本文记录了多种工具计算这些指标的方法. 生成本文的测试数据: import pandas as pd import numpy as np i ...
- Kubernetes-存储(二)
前言 本篇是Kubernetes第十三篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kubern ...
- 批处理文件(.bat)并行Arcpy脚本提高效率的思路
Arcpy提供数据处理的方便接口,但一个Arcpy脚本通常只运行于一个核上.现在电脑通常是多核乃至多处理器,如果能将任务分解为可同时进行的若干任务,便可通过并行充分利用电脑性能. 折腾了python并 ...
- LuoguP7106 双生独白 题解
Content 给定一个 十六进制颜色码(一个长度为 \(7\) 的字符串,意义详见题面),请输出其反色的十六进制颜色码. 数据范围:颜色的 R,G,B 值保证在 \(255\) 以内. Soluti ...