grains是个啥呢?

grains其实是一些静态data,对,是数据。这个数据是个啥结构呢?是key: value的结构

这些数据是属于谁的?属于minion的,也就是说grains是minion私有的数据,和别人不搭嘎的

当minion启动的时候,这些数据会被加载到内存里面,然后grains就保持不变了,即使你添加或者修改

grains,数据也不会改变,除非你重启minion。

当然万事总留一线,凡事总有个例外嘛,我们在master上面定义或者更新grains,执行同步后,可以修改grains,就可以不重启minion而达到改变grains的目的。

其实还有一种方法来更新grains的,在master上执行salt '*' state.highstate或者在minion上执行,

salt-call state.highstate也可以更新grains。

从这一点来说,grains其实也具有动态的特性,待会会举个例子。

好了,下面谈谈管理grains有哪几种方式呢?

一共有五种方式,官网上写的是四种,楼主自己瞎捣腾又捣腾出来一种,哈哈!

第一种方式,定义在这个里面的

root@salt-minion:~# ls /home/lixc/salt-2014.1.4/salt/grains/core.py 
/home/lixc/salt-2014.1.4/salt/grains/core.py

core.py这个模块,主要返回一些系统相关的信息,比如下面这俩东西

root@salt-master:/srv/salt/_grains#  salt '*' grains.item    kernel  lsb_distrib_id
salt-minion:
  kernel: Linux
  lsb_distrib_id: Debian
root@salt-master:/srv/salt/_grains#

当然大伙也可以用,salt '*' grains.items去查看所有的grains

注意:core.py里面定义的grains,只会在minion重启的或者在master上面执行同步的时候,才会重新加载,也就是说,你不重启minion或者在master不执行同步,你core.py里面的定义的grains就不会改变。下面看个例子。

我把minion上debian_version由7.5改为7.4

先查看下minion上debian_version
root@salt-master:~# salt 'salt-minion' cmd.run 'cat /etc/debian_version'       
salt-minion:
    7.5
看一下grains里面的debian_version
root@salt-master:~# salt 'salt-minion' grains.item osrelease            
salt-minion:
  osrelease: 7.5
把minion上的debian_version由7.5改为7.4
root@salt-master:~# salt 'salt-minion' cmd.run 'echo 7.4 >/etc/debian_version'  
salt-minion:
    
手动查看一下mininon上的debian_version修改成功了没    
root@salt-master:~# salt 'salt-minion' cmd.run 'cat /etc/debian_version'        
salt-minion:
    7.4
再查看一下grains里面的debian_version,看到没,没改变吧,说明grains加载后就一直在内存里,
没改变过
root@salt-master:~# salt 'salt-minion' grains.item osrelease                    
salt-minion:
  osrelease: 7.5
好,我们在master执行一下同步
root@salt-master:~# salt  '*'   saltutil.sync_all
salt-minion:
    ----------
    grains:
    modules:
    outputters:
    renderers:
    returners:
    states:
看到了吧,骚年们,grains里的debian_version改变了,说明同步操作,重启加载了grains
root@salt-master:~# salt 'salt-minion' grains.item osrelease
salt-minion:
  osrelease: 7.4
好了,实验成功,我们再把7.5改回来吧
root@salt-master:~# salt 'salt-minion' cmd.run 'echo 7.5 >/etc/debian_version'  
salt-minion:
    
手动查看一下mininon上的debian_version修改成功了没    
root@salt-master:~# salt 'salt-minion' cmd.run 'cat /etc/debian_version'        
salt-minion:
    7.5
好了,现在我们啥操作都没有,grains里的debian_version还保持在7.4呢,现在我们
重启下minion
root@salt-master:~# salt 'salt-minion' cmd.run '/etc/init.d/salt-minion restart'
salt-minion:
    Restarting salt minion control daemon: salt-minion.
看到没,重启minion后,又回到7.5了
root@salt-master:~# salt 'salt-minion' grains.item  osrelease
salt-minion:
  osrelease: 7.5
root@salt-master:~#

好了,第一种管理grains的方式算是讲完了,下面第二种。

第二种是啥呢,没错,直接把grains写在/etc/salt/minion里面就ok了

咱么首先把咱们要定义的grains定向到minion的/etc/salt/minion里面
root@salt-master:~# salt '*' cmd.run 'echo  "grains:\n  lixc:\n    - chengge\n    - \
jiabanne">>/etc/salt/minion'
salt-minion:
    
查看一下,成功了没,哈哈,成功了
root@salt-master:~# salt '*' cmd.run 'tail -n 4 /etc/salt/minion'                                               
salt-minion:
    grains:
      lixc:
        - chengge
        - jiabanne
好,master同步一下,或者重启一下minion,看到没我这次用的是saltutil.sync_grains,这个只同步
grains。咱们上面用的那个saltutil.sync_all,是把所有东西都同步过去了,包括module,state等等
一大串的东西。
root@salt-master:~# salt  '*'   saltutil.sync_grains
salt-minion:
好了,同步好了,咱们在master上面,查看一下grains里面的lixc
root@salt-master:~# salt '*' grains.item lixc
salt-minion:
  lixc:
      chengge
      jiabanne
root@salt-master:~# 
OK,成功了,然后咱们恢复原样吧,因为在/etc/salt/minion定义grains,实在不是一种好方法。
好,我们把刚才在/etc/salt/minion里面添加的grains,删掉吧
root@salt-master:~# salt '*' cmd.exec_code  bash  'for line in {1,2,3,4};do sed -i \
"$d" /etc/salt/minion;done'     
salt-minion:
    
root@salt-master:~#

OK,第三种方法也是在minion上面的,定义在/etc/salt/grains这个文件里面的,我们来看看

好,先添加一个grain到/etc/salt/grains
root@salt-master:~# salt '*' cmd.run 'echo "chengge: 1002">>/etc/salt/grains'
salt-minion:
查看一下
root@salt-master:~# salt '*' cmd.run 'tail -n 1 /etc/salt/grains'
salt-minion:
    chengge: 1002
这一次,我们用执行state.highstate来更新grains
root@salt-master:~# salt '*' state.highstate --out=quite
salt-minion:
OK,成功了,看到没这样也可以更新grains
root@salt-master:~# salt '*' grains.item chengge                             
salt-minion:
  chengge: 1002
root@salt-master:~#

OK,前三种方式讲完了,这三种方式都是在minion上面定义的。下面还有两种方式可以在master上面定义,然后推送到minion上面。

第四种方式:请看

这种方式使用grains自带的一个模块来工作的,模块后面参数,以key value的形式出现就ok了
root@salt-master:~# salt '*'  grains.setval liss 1003         
salt-minion:
  liss: 1003
执行上面的命令执行,grains会被同步到minion的/etc/salt/grains,请看下面
root@salt-master:~# salt '*'  cmd.run  'tail -n 1 /etc/salt/grains'
salt-minion:
    liss: 1003
master上面同步一下
root@salt-master:~# salt '*' saltutil.sync_grains                  
salt-minion:
好,查看一下grains里的liss
root@salt-master:~# salt '*'  grains.item liss
salt-minion:
  liss: 1003
root@salt-master:~#

还有最后一种自定义的方式,自己写模块。

参考/home/lixc/salt-2014.1.4/salt/grains/core.py这个模块写就OK了,其实也没啥特殊的。就咱们

平时写的python脚本拿过来就能用,唯一的区别是咱们的这个python脚本里面定义的是一个一个的函数,每个函数return一个字典回来,

字典嘛,grains的数据结构就key: value字典

下面咱看看

root@salt-master:/srv/salt/_grains# cat /srv/salt/_grains/chengge.py   
import time
def chengge():
  grains = {}
  grains['time'] = time.ctime()
  return grains
def sisi():
  grains = {}
  grains['liss'] = 'lisisi'
  return grains 
root@salt-master:/srv/salt/_grains#

楼主在chengge.py这个模块里面定义了俩函数,每个函数都有return一个字典。

注意:_grains这个目录,子定义的grains是放在这个里面的

好咱们同步一下

root@salt-master:~# salt '*'   saltutil.sync_grains  
salt-minion:
    - grains.chengge
咱们查看一下grains里面的time和lisisi,这俩东西就是我们子定义函数里面的
root@salt-master:~# salt '*' grains.item time liss
salt-minion:
  liss: lisisi
  time: Sat Jun 21 14:43:10 2014
再看一下,时间和上一次执行的一样
root@salt-master:~# salt '*' grains.item time liss
salt-minion:
  liss: lisisi
  time: Sat Jun 21 14:43:10 2014
再同步一下
root@salt-master:~# salt '*'   saltutil.sync_grains 
salt-minion:
看到了没,时间变了,再次说明同步或者重启minion,grains才会刷新
root@salt-master:~# salt '*' grains.item time liss 
salt-minion:
  liss: lisisi
  time: Sat Jun 21 14:44:07 2014
root@salt-master:~#

OK,不知到大伙发现了没有,第五种方式里面的liss: lisisi把第四种方式里面的liss: 1003(那个我一直没删的哦)给覆盖了。

这个说明,咱们这五种方式是有优先顺序的。也就是说grain的key同名的时候,优先级高的会覆盖掉优先级低的。

好,直接把优先级给列出来了。

第一种方式<第二种<第三<第四<第五。

先到这里吧,想必大伙对grain是个啥玩意,应该有所了解了。