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.自己写的