[salt] jinja模板中变量使用pillar的几种方法
先转载下jinja模板中使用变量的方法,后文主要讲解pillar的变量使用方法
一、jinja模版的使用方法:
1、file状态使用template参数
- template:jinja
2、模版文件里面变量使用{{名称}},例如{{PORT}}
变量使用Grains:{{ grains['fqdn_ip4'] }}
变量使用执行模块:{{ salt['network.hw_addr']('eth0') }}
变量使用Pillar:{{ pillar['apache']['PORT'] }}
3、变量列表
- defaults:
PORT:8080
pillar的变量使用方法
二、master环境情况:
[root@master ~]# grep -Ev "#|^$" /etc/salt/master
interface: 0.0.0.0
file_roots:
base:
- /srv/salt/base
prod:
- /srv/salt/prod
pillar_roots:
base:
- /srv/pillar/base
prod:
- /srv/pillar/prod
自定义pillar数据
[root@master ~]# cat /srv/pillar/base/top.sls
base:
'*':
- t
[root@master ~]# cat /srv/pillar/base/t.sls
a1: a11
b1:
b2: b22
b3:
b33: b333
b333: b3333
c1:
- c11
- c111
检验pillar
[root@master ~]# salt host102 pillar.items
host102:
----------
a1:
a11
b1:
----------
b2:
b22
b3:
----------
b33:
b333
b333:
b3333
c1:
- c11
- c111
要同步的文件one
[root@master ~]# cat /srv/salt/base/init/one
a1:{{ a1 }}
b2:{{ b2 }}
b33:{{ b33 }}
b333:{{ b333 }}
c1: {{ c1 }}
c2: {{ c2 }}
获取方式:
1.{{ pillar['name'] }}
[root@master ~]# cat /srv/salt/base/init/one.sls
/tmp/one:
file.managed:
- source: salt://init/one
- template: jinja
- defaults:
a1: {{ pillar['a1'] }}
b2: {{ pillar['b1']['b2'] }}
b33: {{ pillar['b1']['b3']['b33'] }}
b333: {{ pillar['b1']['b3']['b333'] }}
c1: {{ pillar['c1'][0] }}
c2: {{ pillar['c1'][1] }}
2.{{ pillar.get() }} or {{ salt['pillar.get']() }}
官方说明
https://docs.saltstack.com/en/latest/topics/pillar/
个人实验及理解:{{ pillar.get() }}只适用于一级变量,{{ salt['pillar.get']() }}可以适用多级变量
It should be noted that within templating, the pillar variable is just a dictionary.
This means that calling pillar.get() inside of a template will just use the default dictionary .get() function
which does not include the extra : delimiter functionality. It must be called using the above syntax
(salt['pillar.get']('foo:bar:baz', 'qux')) to get the salt function, instead of the default dictionary behavior.
例1:说明{{ pillar.get() }}只适用于一级变量
[root@master ~]# cat /srv/salt/base/init/one.sls
/tmp/one:
file.managed:
- source: salt://init/one
- template: jinja
- defaults:
a1: {{ pillar.get('a1') }}
b2: {{pillar.get('b1:b2') }}
# 这种方式返回None,pillar.get()并不能使用多级变量
b33: {{ salt['pillar.get']('b1:b3:b33') }}
b333: {{ salt['pillar.get']('b1:b3:b333') }}
c1: {{ pillar.get('c1')[0] }}
c2: {{ salt['pillar.get']('c1')[1] }}
[root@master ~]# salt host102 state.sls init.one test=true
host102:
----------
ID: /tmp/one
Function: file.managed
Result: None
Comment: The file /tmp/one is set to be changed
Started: 10:31:00.913548
Duration: 8.761 ms
Changes:
----------
diff:
---
+++
@@ -1,5 +1,5 @@
a1:a11
-b2:b22
+b2:None
b33:b333
b333:b3333
c1: c11 Summary
------------
Succeeded: 1 (unchanged=1, changed=1)
Failed: 0
------------
Total states run: 1
例2:顺便看下默认值的问题
[root@master ~]# cat /srv/salt/base/init/one.sls
/tmp/one:
file.managed:
- source: salt://init/one
- template: jinja
- defaults:
a1: {{ pillar.get('a11',{}) }}
b2: {{ salt['pillar.get']('b1:b22','') }}
b33: {{ salt['pillar.get']('b1:b3:b33') }}
b333: {{ salt['pillar.get']('b1:b3:b333') }}
c1: {{ pillar.get('c1')[0] }}
c2: {{ salt['pillar.get']('c1')[1] }}
[root@master ~]# salt host102 state.sls init.one test=true
host102:
----------
ID: /tmp/one
Function: file.managed
Result: None
Comment: The file /tmp/one is set to be changed
Started: 10:34:22.505086
Duration: 9.101 ms
Changes:
----------
diff:
---
+++
@@ -1,5 +1,5 @@
-a1:a11
-b2:b22
+a1:{}
+b2:None
b33:b333
b333:b3333
c1: c11 Summary
------------
Succeeded: 1 (unchanged=1, changed=1)
Failed: 0
------------
Total states run: 1
{{ pillar.get('name','') }}不存在name键时,值为None
{{ pillar.get('name',{}) }}不存在name键时,值为{}
{{ salt['pillar.get']('name') }}同理,网上看到一篇博客说''与{}是一样的。
官方找到的例子
https://docs.saltstack.com/en/latest/topics/tutorials/pillar.html
{% for user, uid in pillar.get('users', {}).items() %}
可惜并没有''的例子,倒是有{{ salt['pillar.get']('pkgs:apache', 'httpd') }}
例3:多个变量for循环用法,关于iteritems与items的区别,那是python的问题,请自行搜索,现在还不熟悉python。
{% for user, args in pillar['users'].iteritems() %}
{% for user, args in pillar['users'].items() %}
[salt] jinja模板中变量使用pillar的几种方法的更多相关文章
- 在shell中变量的赋值有五种方法!
转至:https://blog.csdn.net/weibo1230123/article/details/82085226 在shell中变量的赋值有五种 :使用 read 命令,直接赋值,使用命令 ...
- Flask08 包含(include)、继承(extends)、宏???、模板中变量的来源、利用bootstrap构建自己的网页结构
1 包含 直接把另一个文件的内容,复制粘贴过来 {% include "模板路径" %} 注意:模板都是放在 templates 这个文件夹下面的,可以在里面新建文件夹来进行分离: ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...
- Oracle中获取执行计划的几种方法分析
以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下 1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...
- Python中执行系统命令常见的几种方法--转载
Python中执行系统命令常见的几种方法 Python中执行系统命令常见的几种方法有: (1)os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 # 如果再命令行下执 ...
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- 在 Ruby 中执行 Shell 命令的 6 种方法
我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...
- 【转载】取得系统中网卡MAC地址的三种方法
From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...
随机推荐
- 基于AppDomain的"插件式"开发
很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...
- [转]SVN服务器搭建和使用(二)
上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用. 首先打开Vi ...
- python redis 的基本操作指令
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' redis基本命令和基本用法详解 1.redis连接 2.redis连接池 3.redis基本命令 ...
- Linux服务-http
目录 1. httpd简介 2. httpd版本 2.1 httpd的特性 2.2 httpd-2.4新增的模块 3. httpd基础 3.1 httpd自带的工具程序 3.2 rpm包安装的http ...
- Fiddler设置代理后,iphone手机无法访问网络的全面解决办法
好久不抓手机包,都有些忘记了,电脑上软件都在,原本是Fiddler4,现在已自动升级到V5. 入主题吧,首先Fiddler设置好代理,然后手机安装证书好了,设置手机代理,结果iphone无法访问网络, ...
- 早上出现的zabbix启动错误
之前根据教程安装好zabbix,MySQL的版本是5.1. 昨天无聊想升级成5.6.不过升级比较麻烦.我就直接把5.1删了再装5.6. 安装中途zabbix挂了一次.把5.6装上启动后就好了. 早上z ...
- WPF 事件触发命令
方法一使用mvvmlight: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Int ...
- jquery ajax 上传文件和传递参数到一个接口的实现方法
参考:https://blog.csdn.net/qq_15674631/article/details/81095284 参考:https://www.jianshu.com/p/46e6e03a0 ...
- 亿级PV请求的三种负载均衡技术
在互联网+不断渗透到生活中的今天,各种各样的网络服务存在在我们身边,他们的访问流量也是大得惊人.一个大型网站(百万PV以上)想要正常访问,单单靠一台服务器是不可能提供稳定服务的.这时候就需要用负载均衡 ...
- python request 以json形式发送post请求的正确的姿势
一个http请求包括三个部分,为别为请求行,请求报头,消息主体,类似以下这样: 请求行,请求报头,消息主题. 以json串提交数据,编码格式: application/json, 必须加上 impor ...