先转载下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的几种方法的更多相关文章

  1. 在shell中变量的赋值有五种方法!

    转至:https://blog.csdn.net/weibo1230123/article/details/82085226 在shell中变量的赋值有五种 :使用 read 命令,直接赋值,使用命令 ...

  2. Flask08 包含(include)、继承(extends)、宏???、模板中变量的来源、利用bootstrap构建自己的网页结构

    1 包含 直接把另一个文件的内容,复制粘贴过来 {% include "模板路径" %} 注意:模板都是放在 templates 这个文件夹下面的,可以在里面新建文件夹来进行分离: ...

  3. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  4. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  5. Oracle中获取执行计划的几种方法分析

    以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下     1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...

  6. Python中执行系统命令常见的几种方法--转载

    Python中执行系统命令常见的几种方法 Python中执行系统命令常见的几种方法有: (1)os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 # 如果再命令行下执 ...

  7. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  8. 在 Ruby 中执行 Shell 命令的 6 种方法

    我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...

  9. 【转载】取得系统中网卡MAC地址的三种方法

    From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...

随机推荐

  1. Python之Pulsar框架使用

    本文内容主要包含Pulsar的介绍和安装.初步使用.应用.常见示例等. 一. 介绍和安装 Pulsar是Python事件驱动并发框架:Pulsar具有高扩展性.高可用性的框架,它能够基于事件驱动的开源 ...

  2. Jmeter之八大可执行元件及执行顺序

    初步接触Jmeter,对比LoadRunner进行熟悉,╮(╯▽╰)╭.毕竟我对LoadRunner还是比Jmeter熟悉. 1.配置元件 用来提供对静态数据配置的支持.例CSV Data Set c ...

  3. HDU 1698 Just a Hook(线段树模板之区间替换更新,区间求和查询)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. NYOJ17 最长单调递增子序列 线性dp

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 分析: i=1 dp[i]=1 i!=1 dp[i]=max(dp[j]+1) ...

  5. springboot mybatis 后台框架平台 shiro 权限 集成代码生成器

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.servic ...

  6. laravel5.5源码笔记(七、数据库初始化)

    laravel中的数据库也是以服务提供者进行初始化的名为DatabaseServiceProvider,在config文件的providers数组中有写.路径为vendor\laravel\frame ...

  7. STM32的AFIO时钟什么时候需要开启

    相比于普通单片机,STM32 拥有复杂的时钟系统,相应的控制器称为 RCC(Reset Clock Controller,复位与时钟控制器).每个外设都配备了外设时钟的开关,当我们不使用某个外设时,可 ...

  8. Scala的控制结构和函数

    控制结构和函数 先看以下简单的一个条件表达式的demo object TestConditional { def main(args: Array[String]): Unit = { // scal ...

  9. 时间序列深度学习:seq2seq 模型预测太阳黑子

    目录 时间序列深度学习:seq2seq 模型预测太阳黑子 学习路线 商业中的时间序列深度学习 商业中应用时间序列深度学习 深度学习时间序列预测:使用 keras 预测太阳黑子 递归神经网络 设置.预处 ...

  10. 基于Verilog的CRC-CCITT校验

    由于笔者在自己设计CRC模块时遇到很多问题,在网上并未找到一篇具有实际指导意义的文章,在经过多次仿真修改再仿真之后得到了正确的结果,故愿意在本文中为大家提供整个设计流程供大家快速完成设计.本文章主要针 ...