Grains:静态数据, 当minion启动的时候收集minion本地的相关信息

操作系统版本,内核版本,CPU,内存,硬盘,设备型号,序列号


应用场景:


  1)资产管理系统,信息查询

  2)用于目标选择(找到100台机器当中,内存是64G系统机器有哪些)

  3)配置管理中使用



salt的数据系统主要有两个方面,其中一个就是Grains,那么可能有人会说数据系统到底有什么用呢?我们设想这样一个例子?假如说领导让我们收集服务器的SN号,这时如果我们手动去收集可能。。。。。(后果太严重,不敢设想)。再比如假设我们的环境不统一,我们要在所有centos系统上执行操作,这时就需要我们的grains了。

    首先说Grains的数据是在minion端启动的时候进行加载的,所以如果自定义了Grains参数就必须要重启minion端才会进行获取。现在我们将正式开始Grains之旅。





总结:

简单的理解Grains的数据系统是通过key的名称和key的值去区分远程主机的。


列出Grains可用key


[root@master salt]# salt 'salt-client.com' grains.ls

salt-client.com:

    - SSDs

    - biosreleasedate

    - biosversion

    - cpu_flags

    - cpu_model

    - cpuarch

    - domain


列出key下面的指标值可以这样子理解

[root@master salt]# salt 'salt-client.com' grains.items

salt-client.com:

    ----------

    SSDs:

    biosreleasedate:

        07/31/2013

    biosversion:

        6.00



查看你想要的项

例如我要查询机器的快速服务代码


[root@master salt]# salt 'salt-client.com' grains.item server_id

salt-client.com:

    ----------

    server_id:

        1644829902

#请注意,本次的item后面没有s



[root@master salt]# salt 'salt-client.com' grains.get server_id

salt-client.com:

    1644829902

#也可以直接get,相比item的方式get返回显得更清爽些,直接返回所需的数值




要在所有centos上执行一个命令,可以通过grains的返回值进行匹配即可


[root@master salt]# salt 'salt-client.com' grains.get os #获取所有主机的os信息,os是grains的一个key的值

salt-client.com:

    CentOS

[root@master salt]# salt -G os:Centos cmd.run 'df -h'

salt-client.com:

    Filesystem      Size  Used Avail Use% Mounted on

    /dev/sda2       7.9G  1.7G  5.9G  22% /

    tmpfs           242M   12K  242M   1% /dev/shm

    /dev/sda1       194M   29M  155M  16% /boot


#其中-G代表的方式就是以grains方式进行匹配,只看centos机器的信息,不是centos系统的不看,远程主机的操作系统可能不一样





grains自定义key


假设有一天nginx发现了一个严重bug,需要对所有nginx服务器进行升级,这时如果我们在之前定义grains就可能通过匹配到所有nginx主机,进而漏洞的修复。




grains的定义其实很简单,只需要修改client端的配置文件即可,

vim /etc/salt/minion    #进入之后我们搜索grains之后取出相应的注释


#grains:

#  roles:

#    - webserver

#    - memcache

#  deployment: datacenter4

#  cabinet: 13

#  cab_u: 14-15


修改后

grains:

  roles:         #-->roles则代表角色 

    - webserver  #这台机器的角色是webserver 如果要定义多个角色请在下方通过- 角色名的方式添加(注意前面的四个空格)

#    - memcache

#  deployment: datacenter4

#  cabinet: 13

#  cab_u: 14-15



/etc/init.d/salt-minion restart    #由于grains是在重启时收集的所以我们新增加的信息必须重启才会生效



进行验证

salt -G roles:webserver cmd.run "date"    #由于我们只在minion1上进行了修改因此只有minion1的结果进行了返回


[root@master salt]# salt -G roles:webserver cmd.run "date"

salt-client.com:

    Thu Dec 15 07:16:04 CST 2016



把grains信息单独定义一个文件


vim /etc/salt/grains    #这个文件默认是没有的,用vim这种方式建立即可


[root@client ~]# cat /etc/salt/grains

web:  #-->key的名称

    - nginx     #key的值


值得注意的是,如果在配置文件里minion里配置了grains同时又在/etc/salt/grains里配置了grains应确保key的名称不重复。如果重复那么只有minion里的配置才会生效



/etc/init.d/salt-minion restart



salt -G web:nginx cmd.run 'date'    #其中web是我们定义的key的名称而nginx是key的值,这条命令是指在所有nginx主机上执行date命令


[root@master salt]# salt -G web:nginx cmd.run 'date'

salt-client.com:

    Thu Dec 15 07:24:39 CST 2016






开发python脚本来管理自定义grains,python脚本放置的路径一定是/srv/salt/_grains

例如:

[root@master ~]# mkdir /srv/salt/_grains

[root@master ~]# cd /srv/salt/_grains

vim my_grains.py

#!/usr/bin/env python

#-*- coding: utf-8 -*-

def my_grains():

  #初始化一个grains字典

  grains = {}

  #设置字典中的key-valaue

  grains['iaas'] = 'openstack'

  grains['www'] = 'bier'

  #返回这个字典

return grains

然后保存退出


然后把在master写的grains同步给给minion(同步master写的grains到minion端的/var/cache/salt)


#然后刷新配置文件具体命令:

[root@master _grains]# salt '*' saltutil.sync_grains

salt-client.com:

    - grains.my_grains



查看一下

[root@master _grains]# salt '*' grains.item iaas

salt-client.com:

    ----------

    iaas:


可以看看minion端的日志python脚本返回了什么



grains的优先级:

 1.系统自带

 2.grains文件写的

 3.minion配置文件写的

 4.自己写的