- 本书赞誉
- 前言
- 第一部分 基础篇
- 第1章 系统基础信息模块详解
- 第2章 业务服务监控详解
- 第3章 定制业务质量报表详解
- 第4章 Python 与系统安全
- 第二部分 高级篇
- 第5章 系统批量运维管理器 pexpect 详解
- 第6章 系统批量运维管理器 paramiko 详解
- 第7章 系统批量运维管理器Fabric详解
- 第8章 从零开发一个轻量级 WebServer
- 第9章 集中化管理平台 Ansible 详解
- 第10章 集中化管理平台 Saltstack 详解
- 第11章 统一网络控制器 Func 详解
- 第12章 Python 大数据应用详解
- 第三部分 案例篇
- 第13章 从零开始打造 B/S 自动化运维平台
- 第14章 打造 Linux 系统安全审计功能
- 第15章 构建分布式质量监控平台
- 第16章 构建桌面版 C/S 自动化运维平台
10.4 grains 组件
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论