jinja做为一个模板语言,不仅使得saltstack中的sls文件能根据pillar和grains的值进行动态变化,同时因为引入了逻辑判断,使得原本十分呆板的普通配置文件也可以变得灵活起来。这一节我们通过实际操作来一起看看jinja如何玩耍。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
测试环境准备
这里还是坚持前几节一直用的官方vagrant演示环境,我们在这个基础上来搭建一个简单的jinja测试环境,用来实际感受下jinja的语法。
首先准备一个pillar文件用来存放jinja中会使用的变量,创建/srv/pillar/jinja_test.sls
内容如下
name: james
age: 28
然后创建一个空文件/srv/salt/files/jinja_test.txt
用来进行jinja模板的编辑
根据默认情况下的file_roots配置,/srv/salt/在file.managed中可以简单表示为salt://
最后创建一个state文件/srv/salt/jinja_test.sls
来将上面的jinja模板同步到minion
/home/vagrant/jinja_test.txt:
file.managed:
- source: salt://files/jinja_test.txt
- template: jinja
这样一个简单的测试环境就搭建好了,来将上面定义的pillar变量用jinja模板表示看看。新开一个文本文件jinja_test.txt
,编辑如下
name: {
{ pillar['name'] | capitalize() }}
age: {
{ pillar['age'] }}
简单测试,语法不懂也没关系
然后在salt master上把pillar下发下去
root@saltmaster:/home/vagrant# salt * saltutil.refresh_pillar
minion1:
True
minion2:
True
之后对minion2去套用刚才的state文件
root@saltmaster:/srv/salt/files# salt 'minion2' state.apply jinja_test
成功了的话就可以在minion2上看到新建的/home/vagrant/jinja_test.txt
文件,内容如下
vagrant@minion2:~$ cat jinja_test.txt
name: James
age: 28
如果成功显示了变量的内容。并且James
开头是大写的J
,那就表示测试环境配置成功了,可以开始进行下面具体的学习和实际操作了。后面我们用jinja语法去编辑jinja_test.txt
文件然后下发到minion就可以看到实际效果了。
jinja语法
{ { … }}
在jinja中,两个大括号中间用来放会被打印为具体结果的表达式(Expressions)。常规的表达式包含以下几个部分:
- python数据类型
例如整型数,浮点型数,字符串,列表,元组,字典等等
在测试环境的/srv/pillar/jinja_test.sls
中增加下面两个变量
lucky number: [2,7,16]
pets: {'cat':'chouchou','dog':'haha'}
同时修改jinja模板jinja_test.txt
添加下列内容
loved cat: {
{ pillar['pets']['cat'] }}
3rd lucky number: {
{ pillar['lucky number'][2] }}
然后对minion2更新文件
root@saltmaster:/home/vagrant# salt 'minion2' state.apply jinja_test
之后会发现目标文件多了两行
loved cat: chouchou
3rd lucky number: 16
- 运算符号
例如常规的加减乘除 + - * /,以及余数%和求幂**
在上述的模板文件中添加
{
{ 1+4 }}
{
{ 2**4 }}
{
{ 6%5 }}
目标文件会多出三行
5
16
1
python中可以用加号 + 去链接多个字符串,在jinja里面虽然也可以,但是推荐用专门的波浪线 ~ 去链接字符串
- 比较符号和逻辑符号
就和python中一样,==/!=/>/>=/</<=/and/or/not。这里就不举例子了。需要注意的是这里只是纯粹的比较符号和逻辑符号,如果是和if语句一起使用的话就不能用两个大括号了,而要用到后面提到的百分号。
- 一些特殊符号
in符号 - 和python中一样,判断元素是否在集合中。例如下面的表达式会返回True
{
{ 'apple' in ['apple','banana','cherry'] }}
~符号 - 连接多个字符串。例如
{
{ 'life'~' is '~'wonderful' }}
会返回life is wonderful
|符号 - 管道符号和shell里面一样,用来对前面的输出做进一步处理,在jinja中叫filter。可以查看官方的内建filter函数。举几个例子,例如
{
{ '