Saltstack自动化(三)Grains组件
GRAINS 组件是saltstack中非常重要的一个组件,其主要用于记录Minion的一些静态信息,如比:CPU、内存、磁盘、网络等。grains信息是每次客户端启动后自动上报给master的,一旦这些静态信息发生改变需要重启minion 或者 重新同步下 grains。除此之外我们还可以自定义Grains的一些信息。自定义的方法有三种:1、通过Minion配置文件定义;2、通过Grains相关模块定义;3、通过python脚本定义。
一、利用grains获取信息
1、查看Grains相关的命令及用法
1[root@saltmaster ~]# salt 'irora200' sys.list_functions grains
2www.361way.com:
3 - grains.append
4 - grains.delval
5 - grains.fetch
6 - grains.filter_by
7 - grains.get
8 - grains.get_or_set_hash
9 - grains.has_value
10 - grains.item
11 - grains.items
12 - grains.ls
13 - grains.remove
14 - grains.set
15 - grains.setval
16 - grains.setvals
每个命令的帮助信息又可以通过sys.doc查看,如下:
1[root@saltmaster ~]# salt 'irora200' sys.doc grains
输出比较多,这里就不再粘出。
2、获取主机item信息
2.1、查看可以获取的items项
1[root@saltmaster ~]# salt 'irora200' grains.ls
2www.361way.com:
3 - SSDs
4 - biosreleasedate
5 - biosversion
6 - cpu_flags
7 - cpu_model
8 - cpuarch
9 - disks
10 - dns
11 - domain
12 - fqdn
13 - fqdn_ip4
14 - fqdn_ip6
15 - gid
16 - gpus
17 - groupname
18 ………………省略
2.2、查看所有的itmes项
1[root@saltmaster ~]# salt 'irora200' grains.items
2www.361way.com:
3 ----------
4 SSDs:
5 biosreleasedate:
6 01/01/2011
7 biosversion:
8 0.5.1
9 cpu_flags:
10 - fpu
11 - de
12 - pse
13 ……… 省略
14 cpu_model:
15 Intel Xeon E312xx (Sandy Bridge)
16 cpuarch:
17 x86_64
18 ……… 省略
这里的输出是上面grains.ls 一一对应,输出结果较上面更详细。
2.3、查看某项或多项item值
1[root@saltmaster ~]# salt 'irora200' grains.item ipv4
2www.361way.com:
3 ----------
4 ipv4:
5 - 10.211.1.10
6 - 127.0.0.1
7 - 192.168.0.222
8# 一次查看多项
9[root@saltmaster ~]# salt 'irora200' grains.item os osrelease osfinger
10www.361way.com:
11 ----------
12 os:
13 RedHat
14 osfinger:
15 Red Hat Enterprise Linux Server-6
16 osrelease:
17 6.6
默认定义好的Granis 的取值可以参看salt grains core.py文件。
二、自定义Grains
在开头我们提到三种自定义Grains的方法,这里一一说明下。
1、通过Minion配置文件配置
在Minion端我们可以通过查看/etc/salt/minion配置文件中,查找grains可以查看到相关注释的示例。不过便于配置管理,我们不一般不会选择在该文件上进行修改,而在minion include的目录下/etc/salt/minion.d目录下单独创建grains.conf文件。就以官方给出的示例,将minion配置文件中配置示例复到/etc/salt/minion.d/grains.conf中,并将注释去掉,如下:
1[[email protected] ~]# cat /etc/salt/minion.d/grains.conf
2grains:
3 roles:
4 - webserver
5 - memcache
6 deployment: datacenter4
7 cabinet: 13
8 cab_u: 14-15
配置增加完成后重启salt-minion服务生效。通过saltmaster端查看结果如下:
1[root@saltmaster ~]# salt 'irora200' grains.item roles
2www.361way.com:
3 ----------
4 roles:
5 - webserver
6 - memcache
这里有两点一定需要注意:1、grains.conf 里的配置需要是YAML格式;2、配置修改后需要重启salt-minion服务才能生效。
2、通过Grains模块定义Grains
上面使用list_functions 列出所有的函数时,对应的是有grains.append、grains.setval等方法,这里就是利用该方法进行的操作。示例如下:
1[root@saltmaster ~]# salt 'irora200' grains.append hosttype 'online'
2irora200:
3 ----------
4 hosttype:
5 - online
6[root@saltmaster ~]# salt 'irora200' grains.item hosttype
7irora200:
8 ----------
9 hosttype:
10 - online
11[root@saltmaster ~]# salt 'irora200' grains.setvals "{'idc':'ZJ','city':'hangzhou'}"
12irora200:
13 ----------
14 city:
15 hangzhou
16 idc:
17 ZJ
18[root@saltmaster ~]# salt 'irora200' grains.item idc city
19irora200:
20 ----------
21 city:
22 hangzhou
23 idc:
24 ZJ
这样配置后,会在minion主机端生成配置文件grains ,如下:
1[root@irora200 salt]# cat /etc/salt/grains
2city: hangzhou
3hosttype:
4- online
5idc: ZJ
如下图所示,我们做了一个实验,如果/etc/salt/minion.d/grains.conf中已经存在的自定义items ,再通过执行grains.append 或 grains.setval 去执行时,发现会以grains.conf中的为准,虽然在/etc/salt/grains中也有内容生成。而且执行grains.append操作后,/etc/salt/minion.d/grains.conf中已存在的值会覆盖/etc/salt/grains中的重复值。即下例中deployment的值在/etc/salt/grains中的变化为datacenter1(setval操作后) --datacenter4(append操作后,并没有变成datacenter5)。
所以会上例中不难看出,/etc/salt/minion.d/grains.conf (或/etc/salt/minion) > /etc/salt/grains配置中的优先级。
注:该处也适用通过分发文件到minion的/etc/salt/grains ,不过分发文件和命令执行的区别是,分发文件必须要minion端重启salt-minion服务后才能生效。而通过grains 命令执行是立即生效的。
3、使用自定义python脚本获取grains信息
示例1:获取主机系统时间
默认自定义脚本需要存放在master的/srv/salt/_grains目录下,这里使用mkdir -p创建即可。这里一个获取系统时间的脚本内容如下:
1[root@saltmaster _grains]# cat get_time.py
2#!/usr/bin/env python
3# coding=utf-8
4from datetime import datetime
5def get_server_time():
6 grains = {}
7 grains['server_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
8 return grains
使用sync_grains命令同步脚本到minion主机上去,并通过grains.item命令获取相关信息即可,如下:
1[root@saltmaster _grains]# salt '*' saltutil.sync_grains
2serverb.pod0.example.com:
3 - grains.get_time
4irora200:
5 - grains.get_time
6[root@saltmaster _grains]# salt '*' grains.item server_time
7serverb.pod0.example.com:
8 ----------
9 server_time:
10 2014-04-02 23:53:23
11irora200:
12 ----------
13 server_time:
14 2014-04-02 15:53:23
执行同步命令后,自定义脚本会上传到minion的/var/cache/salt/minion/extmods/grains目录下。
1[root@irora200 grains]# ls
2get_time.py get_time.pyc
3[root@irora200 grains]# pwd
4/var/cache/salt/minion/extmods/grains
示例2:对比自定义python脚本与前两者的优先级
脚本内容:
1[root@saltmaster _grains]# more info.py
2#!/usr/bin/python2.6
3import os,commands,math
4def info():
5 fc = {}
6 #fc['disks'] = commands.getoutput('df -m| grep "/dev/sda1" | awk \' { print $NF } \' ')
7 #fc['disk_size'] = commands.getoutput('df -m| grep "/dev/sda1" | tail -n 1 | awk \' { print $2 } \' ')
8 #fc['disk_size_per'] = int(math.floor(float(fc['disk_size'])/100000))*1000
9 fc['node'] = commands.getoutput('hostname | cut -c1-8')
10 fc['deployment'] = 'datacenter1'
11 fc['nets'] = commands.getoutput('ifconfig | awk \' BEGIN { FS=":| +"; } /inet addr/ { print $4 } \' | awk \'BEGIN { FS=".";OFS="." } { print $1,$2,$3,"0/24" } \'
12')
13 return fc
同步后,执行的结果如下:
1[root@saltmaster _grains]# salt '*' saltutil.sync_grains
2serverb.pod0.example.com:
3 - grains.info
4irora200:
5 - grains.info
6[root@saltmaster _grains]# salt 'irora200' grains.item node
7irora200:
8 ----------
9 node:
10[root@saltmaster _grains]# salt 'irora200' grains.item node deployment
11irora200:
12 ----------
13 deployment:
14 datacenter4
15 node:
16 irora200
这里需要注意的是,脚本如果有问题,是无法正常获取结果的。由于被测试的主机irora200是台kvm虚拟机,使用的磁盘是vda,所以上面关于磁盘的部分有问题,这样执行会出错,可以看出第一次取node的结果是空,也就是失败的。将脚本关于磁盘的部分注释后,我再取结果,发现deployment的结果还是这之前datacenter4,可见是优先级是第于/etc/salt/minion.d/grains.conf中的配置的。
再对比下自定义脚本和/etc/salt/grains的优先级,将/etc/salt/minion.d/grains.conf中的配置取消,重启salt-minion服务。对比结果如下:
1[root@irora200 grains]# sed -i '/deployment/d' /etc/salt/minion.d/grains.conf
2[root@irora200 grains]# /etc/init.d/salt-minion restart
3Stopping salt-minion daemon: [ OK ]
4Starting salt-minion daemon: [ OK ]
5[root@irora200 grains]# cat /etc/salt/grains
6city: hangzhou
7deployment: datacenter4
8hosttype:
9- online
10idc: ZJ
11[root@saltmaster _grains]# salt 'irora200' grains.item node deployment nets
12irora200:
13 ----------
14 deployment:
15 datacenter1
16 nets:
17 192.168.0.0/24
18 10.211.1.0/24
19 127.0.0.0/24
20 node:
21 irora200
可以看出,grains配置优先级顺序为/etc/salt/minion.d/grains.conf (或/etc/salt/minion) > master端自定义grains脚本(minion端/var/cache/salt/minion/extmods/grains目录下) > Grains模块定义Grains (/etc/salt/grains) 。
三、总结
1、grains组件在saltstack中是一个非常重要的组件,我们执行的时候主机的正则匹配,主机端信息的获取等都会用到该组件 。不过grains也有自身的局限性,就是主要存储静态数据,后面还会提到另一个组件pillar ,两者可以做一个很好的互补;
2、能过了解grains三个自定义方式的优化级配置,我们可以根据需要定义在哪一个文件中指定什么信息;
3、在/srv/salt/_grains目录下的自定义脚本,在执行完成后,强烈建议移到一个bak目录下。使该目录下是没有文件,并且再执行一次salt ‘*’ saltutil.sync_grains操作。使minion主机上自定义模块目录是干净的,这样做的好处是可以避免和另外两个文件有配置冲突,也避免脚本之间有重复的名字定义,造成取回的结果不对。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/saltstack-grains/5104.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.