Linux-saltstack-4 jinjia模板得基本使用

2024-01-13 09:32

本文主要是介绍Linux-saltstack-4 jinjia模板得基本使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、简介
  • 二、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模板得基本使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600990

相关文章

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

gorm乐观锁使用小结

《gorm乐观锁使用小结》本文主要介绍了gorm乐观锁使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言grom乐观锁机制gorm乐观锁依赖安装gorm乐观锁使用创建一个user表插入数据版本号更新总结前言乐观锁,顾名

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.