先转载下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. iteritems()与items()

    iteritems:以迭代器对象返回字典键值对 item:以列表形式返回字典键值对 >>> dic = {'a':3,'c':1,'b':2} >>> print ...

  2. 集合之hascode方法

    在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分, ...

  3. cloudstack agent host Alert 告警处理

    今天nagios告警: 172.17.9.76有Alert,看agent的日志有如下: (Agent-Handler-3:null) Connected to the server Lost conn ...

  4. MVC下载文档

    public FileStreamResult DownFile(string content,string name) { ProInterface.ISubject ems = new ProSe ...

  5. SharePoint中跨列表查询

    1,最近的项目中遇到一个需求,站点中有几十个列表,其中每5,6个列表属于一个模块下的.客户的需求是,首页上显示一个模块下所有列表数据的前5条,并按创建时间排序. 2,刚刚考虑到这块的实现方法时,用的是 ...

  6. block本质探寻三之block类型

    一.oc代码 提示:看本文章之前,最好按顺序来看: //代码 void test1() { ; void(^block1)(void) = ^{ NSLog(@"block1----&quo ...

  7. CentOS 7 配置阿里云本地yum源

    删除原有的yum源: rm -f /etc/yum.repos.d/* 重新下载阿里云的yum源: wget -O /etc/yum.repos.d/CentOS-Base.repo http://m ...

  8. 旧贴-在 win7 / win8 下安装苹果系统 (懒人版)

    前言 该文转载自远景论坛,发布时间2012年,仅供学习参考 这篇安装教程的素材在国庆就准备好了,但那时学习任务比较重,没有时间发帖,一直拖到现在.趁这个周末有空,赶紧写完它,希望能帮助一些景友. 论坛 ...

  9. 7款易上手C语言编程软件推荐

    C语言是一门历史很长的编程语言,其编译器和开发工具也多种多样,其开发工具包括编译器,现举几个开发工具供大家选择,当然也要根据自己的操作系统来选择适合自己的开发工具. 好多刚开始接触c语言的朋友都想知道 ...

  10. Egret 菜鸟级使用手册

    首先,先安装好,然后,创建项目,弄好之后,在终端输入 egret run -a 开启服务 /*********************************华丽丽的分割线************** ...