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