如何在 Saltstack 组件下收集被控主机的信息?

什么是 grains
grains是Saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态类数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可以利用这些信息对于不同的业务进行个性化设置,官方提供:grains就是用来区分不同的minion进行不同的配置,salt '' ,主要就是在'' 里面进行匹配主机的作用。

应用场景
在state中使用 用于配置管理模块

在target中使用,用来匹配minion,例如匹配操作系统使用-G的选项

用于信息查询,grains保存收集到的客户端的详细信息

CentOS发行版主机将被“host: {{ grains['xxx'] }}”匹配,以主机saltstack_web1group_1(CentOS 6.5)为例,最终得到“host: saltstack_web1group_1”。同时命令行的匹配操作系统发行版为CentOS的被控端可以通过-G参数来过滤。


[root@saltstack-master ~]# salt -G 'os:CentOS' test.ping
saltstack_web1group_1:
True
saltstack_web1group_2:
True

grains常用操作命令

匹配内核版本为2.6.32-504.el6.x86_64的minion并执行命令'uname -a'


[root@saltstack-master ~]# salt -G 'kernelrelease:2.6.32-431.el6.x86_64' cmd.run 'uname -a'
saltstack_web1group_1:
Linux saltstack_web1group_1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
saltstack_web1group_2:
Linux saltstack_web1group_2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

获取所有minion的grains项信息


[root@saltstack-master ~]# salt '*' grains.ls
saltstack_web1group_1:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- gpus
- host
--------------忽略部分内容------------------

当然也可以获取主机单项grains数据,如获取操作发行版本。


[root@saltstack-master ~]# salt 'saltstack_web1group_1' grains.item os
saltstack_web1group_1:
----------
os:
CentOS

定义grains数据

定义grains数据的方法有两种,其中一种是在minion定制配置文件,另外一种是通过master扩展模块API实现,区别是模块更灵活,可用过Python编程动态定义,而配置文件只适合相对的固定的key与value。


[root@saltstack-master ~]# salt 'saltstack_web1group_1' grains.items
saltstack_web1group_1:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
--------------忽略部分内容------------------

被控端主机定制grains数据

SSH登录一台被控主机(minion),如SN2013-08-022,配置文件定制的路径为/etc/salt/minion,参数为default_include:minion.d/*conf

创建文件【/etc/salt/minion.d/hostinfo.conf】


[root@saltstack_web1group_1 ~]# cd /etc/salt/minion.d/
[root@saltstack_web1group_1 minion.d]# vim hostinfo.conf
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 14
[root@saltstack_web1group_1 minion.d]# service salt-minion restart
Stopping salt-minion daemon: [确定]
Starting salt-minion daemon: [确定]

重启minion服务,验证结果在master上运行:salt 'saltstack_web1group_1' grains.itemroles deployment cabinet,观察配置的key和value。


[root@saltstack-master ~]# salt 'saltstack_web1group_1' grains.item roles deployment cabinet
saltstack_web1group_1:
----------
cabinet:
14
deployment:
datacenter4
roles:
- webserver
- memcache

主控制端扩展模块定制grains数据

首先在主控制端编写Python代码,然后将该Python文件同步到被控制端上,最后刷新生效(即编译Python源代码文件成字节码pyc)。在主控端base目录(见/etc/salt/master配置文件的file_roots项,默认base配置在/srv/salt)下生成_grains目录,执行install -d /srv/salt/_grains开始编写代码,实时获取被控主机系统允许最大打开文件数(ulimit -n)的grains数据。


[root@saltstack-master ~]# install -d /srv/salt/_grains
[root@saltstack-master ~]# cd /srv/salt/_grains
[root@saltstack-master _grains]# vim grains_openfile.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os,sys,commands

#定义一个获取最大打开文件数的函数,函数名称没有要求,符合python函数命名规则即可
def Grains_openfile():
'''
return os max open file of grains value
'''
grains = {} #初始化一个字典,变量名一定要用grains,以便Saltstack识别

_open_file=65535 #初始化一个默认值

try:
getulimit = commands.getstatusoutput('source /etc/profile;ulimit -n')
except Exception,e:
pass

if getulimit[0]==0:
_open_file=int(getulimit[1])
grains['max_open_file'] = _open_file #将获取的ulimit -n的结果进行赋值,其中'max_open_file'就是grains项,——open_file就是grains的值
return grains

grains_openfile()定义一个获取最大打开文件数的函数,函数名称没有要求,符合Python函数命名规则即可。

grains={} 初始化一个grains字典,变量名一定要用grains,以便saltstack识别

grains['max_open_file']=_open_file 将获取的Linux ulimit -n的结果值赋予grains['max_open_file'],其中"max_open_file"就是grains的项,_open_file就是grains的值。

在主控端同步模块:salt 'saltstack_web1group_1' saltutil.sync_grains 或 salt 'saltstack_web1group_1' saltutil.sync_all,此时文件已经同步到被控端主机以下目录中。


[root@saltstack-master _grains]# salt 'saltstack_web1group_1' saltutil.sync_all
saltstack_web1group_1:
----------
beacons:
grains:
- grains.grains_openfile
modules:
output:
renderers:
returners:
sdb:
states:
utils:
[root@saltstack_web1group_1 minion.d]# ll /var/cache/salt/minion/extmods/grains/
总用量 4
-rw-------. 1 root root 774 3月 20 16:36 grains_openfile.py
[root@saltstack_web1group_1 minion.d]# ll /var/cache/salt/minion/files/base/_grains/
总用量 4
-rw-------. 1 root root 774 3月 20 16:36 grains_openfile.py

/var/cache/salt/minion/extmods/grains/

为扩展模块文件最终存放位置,刷新模块后将在同路径下生成字节码pyc;/var/cache/salt/minion/files/base/_grains/ 为临时存放位置

刷新模块salt 'saltstack_web1group_1' sys.reload_modules

在/var/cache/salt/minion/extmods/grains/位置的一个编译后的字节码文件grains_openfile.py文件,为python可执行的格式。


[root@saltstack-master _grains]# salt 'saltstack_web1group_1' sys.reload_modules
saltstack_web1group_1:
True
[root@saltstack_web1group_1 minion.d]# ll /var/cache/salt/minion/extmods/grains/
总用量 4
-rw-------. 1 root root 774 3月 20 16:36 grains_openfile.py

校验结果为可以在主控端查看grains信息。

执行salt 'saltstack_web1group_1' grains.item max_open_file
结果显示”max_open_file:65535”,这就是前面定制的主机grains信息。


[root@saltstack-master _grains]# salt 'saltstack_web1group_1' grains.item max_open_file
saltstack_web1group_1:
----------
max_open_file: 65535
上一篇:Saltstack 集中化管理平台安装


下一篇:LInux搭建Git私有服务器