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是个啥玩意,应该有所了解了。