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。
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所示。
获取主机 id 为 “SN2013-08-022” 的所有 grains 键及值信息,执行命令如图10-10所示。
定义grains数据
定义 grains 数据的方法有两种,其中一种为在被控主机定制配置文件,另一种是通过主控端扩展模块 API 实现,区别是模块更灵活,可以通过 Python 编程动态定义,而配置文件只适合相对固定的键与值。下面分别举例说明。
-
被控端主机定制 grains 数据
SSH 登录一台被控主机,如 SN2013-08-022,配置文件定制的路径为 /etc/salt/minion,参数为 default_include:minion.d/*.conf,具体操作如下:
salt/minion.d/hostinfo.confgrains: roles: - webserver - memcache deployment: datacenter4 cabinet: 13重启被控主机 salt-minion 服务,使之生效:service salt-minion restart。验证结果在主控端主机运行:salt ' SN2013-08-022' grains.item roles deployment cabinet,观察配置的键与值,如图10-11所示。
Figure 3. 图10-11 定制grains数据信息 -
主控端扩展模块定制grains数据
首先在主控端编写 Python 代码,然后将该 Python 文件同步到被控主机,最后刷新生效(即编译 Python 源码文件成字节码 pyc)。在主控端 bash 目录(见 /etc/salt/master 配置文件的file_roots 项,默认的 base 配置在 /srv/salt)下生成 _grains 目录,执行 install -d /srv/salt/_grains 开始编写代码,实现获取被控主机系统允许最大打开文件数(ulimit -n)的 grains 数据。
Unresolved include directive in modules/ROOT/pages/section02/ch10/ch10-04.adoc - include::example$/第十章/saltstack/salt/_grains/nginx_config.py[]
上面代码的说明如下。
-
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