返回介绍

10.4 grains 组件

发布于 2024-01-29 22:54:23 字数 3851 浏览 0 评论 0 收藏 0

grains是Saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态类的数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可以利用这些信息对不同业务进行个性化配置。官网提供的用来区分不同操作系统的示例如下(采用jinja模板):

{% if grains['os'] == 'Ubuntu' %}
host: {{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
host: {{ grains['fqdn'] }}
{% endif %}

示例中CentOS发行版主机将被“host:{{grains['fqdn']}}”匹配,以主机SN2013-08-022(centOS 6.4)为例,最终得到“host:SN2013-08-022”。同时,命令行的匹配操作系统发行版本为CentOS的被控端可以通过-G参数来过滤,如salt-G'os:CentOS'test.ping。

10.4.1 grains常用操作命令

匹配内核版本为2.6.32-358.14.1.el6.x86_64的主机:

salt -G 'kernelrelease:2.6.32-358.14.1.el6.x86_64' cmd.run 'uname -a'

获取所有主机的grains项信息:

salt '*' grains.ls

当然,也可以获取主机单项grains数据,如获取操作系统发行版本,执行命令:salt'SN2013-08-022'grains.item os,结果如图10-9所示。

图10-9 根据grains获取主机操作系统发行版本信息

获取主机id为“SN2013-08-022”的所有grains键及值信息,执行命令如图10-10所示。

10.4.2 定义grains数据

定义grains数据的方法有两种,其中一种为在被控主机定制配置文件,另一种是通过主控端扩展模块API实现,区别是模块更灵活,可以通过Python编程动态定义,而配置文件只适合相对固定的键与值。下面分别举例说明。

图10-10 获取主机所有grains信息(部分截图)

1.被控端主机定制grains数据

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

【/etc/salt/minion.d/hostinfo.conf】

grains:
 roles:
  - webserver
  - memcache
 deployment: datacenter4
 cabinet: 13

重启被控主机salt-minion服务,使之生效:service salt-minion restart。验证结果在主控端主机运行:salt'SN2013-08-022'grains.item roles deployment cabinet,观察配置的键与值,如图10-11所示。

图10-11 定制grains数据信息

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

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

【/srv/salt/_grains/sysprocess.py】

import os,sys,commands
def Grains_openfile:
  '''
     return os max open file of grains value
  '''
  grains = {}
  #init default value
  _open_file=65536
  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
  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的值。

最后同步模块到指定被控端主机并刷新生效,因为grains比较适合采集静态类的数据,比如硬件、内核信息等。当有动态类的功能需求时,需要提行刷新,具体操作如下:

同步模块salt'SN2013-08-022'saltutil.sync_all,看看“SN2013-08-022”主机上发生了什么?文件已经同步到minion cache目录中,如下:

/var/cache/salt/minion/extmods/grains/grains_openfile.py
/var/cache/salt/minion/files/base/_grains/grains_openfile.py

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

刷新模块salt'SN2013-08-022'sys.reload_modules,再看看主机发生了什么变化?在/var/cache/salt/minion/extmods/grains/位置多了一个编译后的字节码文件grains_openfile.pyc文件,为Python可执行的格式。

/var/cache/salt/minion/extmods/grains/grains_openfile.py
/var/cache/salt/minion/extmods/grains/grains_openfile.pyc
/var/cache/salt/minion/files/base/_grains/grains_openfile.py

校验结果为可以在主控端查看grains信息,执行salt'SN2013-08-022'grains.item max_open_file,结果显示“max_open_file:65535”,这就是前面定制的主机grains信息。

SN2013-08-022:
 max_open_file: 65535

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文