讲完了grains,pillar是个啥呢?
pillar这东西,楼主刚看的时候,啥也没看懂,于是字典了一下。
靠,意思是柱子,楼主更加云里雾里了,老外这名字咋整成这样?
老外不靠谱,老祖宗有云:"书读百遍,其义自见"。于是楼主也就多看了那么几遍,差不多知道这货是
干什么的了?
pillar这东西其实也是data,对,数据。
pilar是存放在啥地方的呢?存放在master上面的,一个地方是在/etc/salt/master这个配置文件里面。
还有一个地方,默认在/etc/pillar这个文件夹里面。
pillar可以用在什么地方呢?可以用在模块里面,jinja模板里面,state的sls文件里面。一般来说用
yaml写的东西都可以用它
pillar说到底还是minion用的,官网上说pillar是用存敏感数据的,对没错。啥叫敏感数据呢,就是说
你这个minion要是满足我的要求,你才能用我相应的pillar数据,如果不满足我的要求,你就不能用了。
官网上有个简单的小例子,咱们来看看。
{% if grains['os'] == 'RedHat' %} apache: httpd git: git {% elif grains['os'] == 'Debian' %} apache: apache2 git: git-core {% endif %}
这个例子说明,你如果系统是RedHat,那么我的apache的名字就叫httpd。系统是Debian的时候,我的apache的名字就叫apache2。
下面我们仔细看看pillar这东西。
先看一下/etc/salt/master里面定义的pillar
root@salt-master:~# salt '*' pillar.get master:max_open_files
salt-minion:
100000
root@salt-master:~# salt '*' pillar.get master:publish_port
salt-minion:
4505
root@salt-master:~# for item in {'max_open_files','publish_port'};\
> do grep $item /etc/salt/master;done
#max_open_files: 100000
#publish_port: 4505
然后是自定义的pillar
自定义的pillar和state的结构差不多,区别是pillar里面存的都是数据,state里面存的都是干活的
东西
root@salt-master:~# tree /srv/pillar/
/srv/pillar/
├── args
│ └── init.sls
├── pkg
│ └── init.sls
├── test.sls
├── top.sls
└── users
└── init.sls
看一下,test.sls吧
root@salt-master:~# cat /srv/pillar/test.sls
apache: apache2
root@salt-master:~#
看一下top.sls,和state里面的规则全都一样
root@salt-master:~# cat /srv/pillar/top.sls
base:
'*':
- test
这里需要刷新一下pillar,不然看不到的
root@salt-master:~# salt '*' saltutil.refresh_pillar
salt-minion:
None
好,查看一下,pillar里面是否有apache
root@salt-master:~# salt '*' pillar.item apache
salt-minion:
----------
apache:
apache2
root@salt-master:~#
有了,OK
注意:当然salt '*' state.highstate也是可以刷新pillar的,这个东西啥都可以更新,grains也可以,前一篇咱们看到了。
楼主整个小例子吧
楼主的例子可能有点蛋疼,没办法啊,楼主在自己做测试,没啥实际的需求去做,楼主也头脑风暴不出来个牛逼的,不过基本功能能跑通就OK了!先来看看楼主的grains是怎么定义的
root@salt-master:~# cat /srv/salt/_grains/check_tmp.py
#!/usr/bin/env python
from subprocess import Popen,PIPE
import os
def check_tmp():
grains = {}
if os.path.exists('/tmp/lixc'):
result = Popen("du /tmp/lixc -sm",shell=True,stdout=PIPE)
result = result.stdout.readlines()
size = result[0].split('\t')[0]
if int(size) >= 100:
grains['tmp'] = { 'name':result[0].split('/')[2][0:-1], 'remove':True}
else:
grains['tmp'] = { 'name':result[0].split('/')[2][0:-1], 'remove':False}
else:
grains['tmp'] = {'name':'lixc','remove':False}
return grains
root@salt-master:~#
楼主这个grains是干啥用的呢?就是看一下/tmp/lixc这个文件夹的大小。咱们来看看结果
root@salt-master:/srv/salt# salt '*' saltutil.sync_grains
salt-minion:
- grains.check_tmp
root@salt-master:/srv/salt# salt '*' grains.item tmp
salt-minion:
tmp: {'name': 'lixc', 'remove': 'True'}
root@salt-master:/srv/salt#
再看看楼主的pillar是怎么定义的。这里在pillar用到了grains
root@salt-master:~# cat /srv/pillar/check_tmp/init.sls
filename:
- {{grains['tmp']['name']}}
group: lixc
groupmember:
user1: lixc
user2: liss
root@salt-master:~#
再看看楼主的state是咋弄的?楼主在state里面用到了grains和pillar
root@salt-master:~# cat /srv/salt/check_tmp/init.sls
{% set directory = '/tmp' %}
{% set size=salt['grains.get']('tmp:remove', '') %}
{% if size %}
/tmp/lixc:
file.absent:
- name: `directory`/{{pillar['filename'][0]}}
/home/lixc/test.log:
file.managed:
- source: salt://check_tmp/files/test.jinja
- template: jinja
- user: {{salt['pillar.get']('groupmember:user1','lixc')}}
- group: {{pillar['group']}}
{% else%}
/home/lixc/exec.log:
cmd.run:
- unless: echo 'lisisi' > /home/lixc/exec.log
{%endif%}
root@salt-master:~#
再看看楼主的state里面的test.jinja是咋弄的?楼主在jinja模板里面,用到了grains和pillar
root@salt-master:~# cat /srv/salt/check_tmp/files/test.jinja
hostname:{{grains['fqdn']}}
group:{{pillar['group']}}
groupmeber: {{pillar['groupmember']['user1']}},{{ salt['pillar.get']('groupmember:user2', '') }}
root@salt-master:~#
楼主弄了这一大串想实现啥功能的呢?如果/tmp/lixc这个文件夹的大小超过100M,就把这个文件夹干掉,然后把test.jinja模板文件,发送到/home/lixc/test.log,否则在/home/lixc/exec.log这个文件里面增加一行"lisis"。。。唉,楼主的这个例子是有点毫无逻辑可言,和实际运维也完全不搭嘎,但是想说明的东西,差不多都说了。
好,来看看执行结果吧!
第一,先看看minion上面的/tmp/lixc这个文件夹的大小,是304M
root@salt-master:~# salt '*' cmd.run 'du /tmp/lixc -sm'
salt-minion:
304 /tmp/lixc
第二,同步一些grains
root@salt-master:~# salt '*' saltutil.sync_grains
salt-minion:
- grains.check_tmp
第三,同步之后,看一下我们定义的grains返回来的值
root@salt-master:~# salt '*' grains.item tmp
salt-minion:
tmp: {'name': 'lixc', 'remove': True}
第四,刷新一下pillar
root@salt-master:~# salt '*' saltutil.refresh_pillar
salt-minion:
None
第五,看一下,刷新之后,有没有咱们定义的pillar
root@salt-master:~# salt '*' pillar.item filename group groupmember
salt-minion:
----------
filename:
- lixc
group:
lixc
groupmember:
----------
user1:
lixc
user2:
liss
第六,好,执行下咱们定义的check_tmp这个state
root@salt-master:~# salt '*' state.sls check_tmp
salt-minion:
----------
ID: /tmp/lixc
Function: file.absent
Result: True
Comment: Removed directory /tmp/lixc
Changes:
----------
removed:
/tmp/lixc
----------
ID: /home/lixc/test.log
Function: file.managed
Result: True
Comment: File /home/lixc/test.log updated
Changes:
----------
diff:
New file
group:
lixc
mode:
0644
user:
lixc
Summary
------------
Succeeded: 2
Failed: 0
------------
Total: 2
第七,看一下/tmp/lixc这个文件夹还在不在?不在了,看到没
root@salt-master:~# salt '*' cmd.exec_code bash 'if [ -f "/tmp/lixc" ];\
> then echo yes;else echo no;fi'
salt-minion:
no
第八,看看/home/lixc/test.log这个文件生成的内容
root@salt-master:~# salt '*' cmd.run 'cat /home/lixc/test.log'
salt-minion:
hostname:salt-minion
group:lixc
groupmeber: lixc,liss
第九,再同步一下grains
root@salt-master:~# salt '*' saltutil.sync_grains
salt-minion:
第十,再查看一下咱们自定义的grains返回的值,因为/tmp/lixc这个文件夹不存在了,所以是False了
root@salt-master:~# salt '*' grains.item tmp
salt-minion:
tmp: {'name': 'lixc', 'remove': False}
第十一,再执行一下我们定义的state,check_tmp
root@salt-master:~# salt '*' state.sls check_tmp
salt-minion:
----------
ID: /home/lixc/exec.log
Function: cmd.run
Result: True
Comment: unless execution succeeded
Changes:
Summary
------------
Succeeded: 1
Failed: 0
------------
Total: 1
第十二,查看一下/home/lixc/exec.log的内容
root@salt-master:~# salt '*' cmd.run 'tail -n 1 /home/lixc/exec.log'
salt-minion:
lisisi
以上是pillar的一些用法,当然pillar还可以用在module里面,这个下节写module的时候再写。
OK,
转载于:https://blog.51cto.com/lixcto/1429575