讲完了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,