简介

  Grains 是SaltStack 的重要组件之一。主要记录minion的静态信息,比如CPU,内存,磁盘,网络信息等。Grains信息是minion启动时汇报给Master的。

刷新grains方法:
  (1)重启minion
  (2)Master强制刷新: salt '*' saltutil.sync_grains

Grains 相关方法

Grains:
- grains.append # 向grains中添加key/value, 不存在则创建,存在则追加,被追加的key将有两个值,salt '*' grains.append key val. 特别注意:append 操作要时 key必须是个列表
- grains.delkey # 删除指定的grains key,value也会一起删除。salt '*' grains.delkey key
- grains.delval # 删除指定的grains key 的 value值,并不会删除key,主要注意删除value后会将value变成None. salt '*' grains.delval key
- grains.equals # 判断key/value 是否匹配,匹配返回True,反之则为False. salt '*' grains.equals key value
- grains.fetch # 获取指定key的value值,如果不存在则返回空字符串,和get类似。 salt "*" grains.fetch key
- grains.filter_by # 过滤查找
- grains.get # 获取, 和fetch类似
- grains.get_or_set_hash # salt '*' grains.get_or_set_hash 'django:SECRET_KEY' 50
- grains.has_value # salt '*' grains.has_value pkg:apache
- grains.item # 获取指定grains item信息(也可以获取多个,多个用空格分隔),例如: grains.item wan, 获取wan的信息
[root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.item wan
minion:
----------
wan:
41.2.2.2
- grains.items # 获取minion的所有grains item信息
- grains.ls # 获取grains的所有item key值
- grains.remove # 和append 对应,移除grains key 的value 列表中的一个。salt '*' grains.remove key val
- grains.set # 设置key 为任意值,value是嵌套模式的。
# salt '*' grains.set 'apps:myApp:port' 2209
# salt '*' grains.set 'apps:myApp' '{port: 2209}'
- grains.setval # 设置key . salt '*' grains.setval key val
# salt '*' grains.setval key "{'sub-key': 'val', 'sub-key2': 'val2'}"
[root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.setval key11 "{'sub-key': 'val', 'sub-key2': 'val2'}"
minion:
----------
key11:
----------
sub-key:
val
sub-key2:
val2
[root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.item key11:sub-key
minion:
----------
key11:sub-key:
val
[root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.item key11:sub-key2
minion:
----------
key11:sub-key2:
val2
- grains.setvals # 设置多个key/value,salt '*' grains.setvals "{'key1': 'val1', 'key2': 'val2'}"
[root@iz8vb7vqedcq5amxidjpaiz ~]# salt '*' grains.setvals "{'key1': 'val1', 'key2': 'val2'}"
minion:
----------
key1:
val1
key2:
val2

Grains 方法说明

系统默认Grains 内容

[root@yw_home ~]# salt 192.168.0.100 grains.items
192.168.0.100:
biosreleasedate: 03/11/2013
biosversion: 1.5.2
cpu_flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
cpu_model: Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz
cpuarch: x86_64
defaultencoding: UTF8
defaultlanguage: en_US
domain: localdomain
external_ip: 192.168.0.100
fqdn: localhost.localdomain
fqdn_ip4:
127.0.0.1
fqdn_ip6:
::1
gpus:
{'model': 'G200eR2', 'vendor': 'unknown'}
host: localhost
hwaddr_interfaces: {'lo': '00:00:00:00:00:00', 'em1': '保密隐去', 'em2': '保密隐去'}
id: 192.168.0.100
ip_interfaces: {'lo': ['127.0.0.1'], 'em1': ['192.168.0.100'], 'em2': []}
ipv4:
127.0.0.1
192.168.0.100
ipv6:
::1
fe80::92b1:1cff:fe50:d4ac
kernel: Linux
kernelrelease: 2.6.32-431.el6.x86_64
localhost: 192.168.0.100
manufacturer: Dell Inc.
master: 192.168.0.100
mem_total: 64377
nodename: 192.168.0.100
num_cpus: 24
num_gpus: 1
os: CentOS
os_family: RedHat
osarch: x86_64
oscodename: Final
osfinger: CentOS-6
osfullname: CentOS
osmajorrelease:
6
5
osrelease: 6.5
path: /sbin:/usr/sbin:/bin:/usr/bin
productname: PowerEdge R420
ps: ps -efH
pythonpath:
/usr/bin
/usr/lib64/python26.zip
/usr/lib64/python2.6
/usr/lib64/python2.6/plat-linux2
/usr/lib64/python2.6/lib-tk
/usr/lib64/python2.6/lib-old
/usr/lib64/python2.6/lib-dynload
/usr/lib64/python2.6/site-packages
/usr/lib64/python2.6/site-packages/gtk-2.0
/usr/lib/python2.6/site-packages
/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info
pythonversion: 2.6.6.final.0
saltpath: /usr/lib/python2.6/site-packages/salt
saltversion: 2014.1.0
saltversioninfo:
2014
1
0
serialnumber: 保密隐去
server_id: 保密隐去
shell: /bin/sh
virtual: physical

默认grains内容

自定义Grains

  当我们需求更多,默认grains不能满足时,可以自定义grains.

自定义Grains的方式

  (1)通过minion配置文件定义, 优先级1
  (2)通过Master端对Grains定义,优先级3
  (3)通过Master端python脚本定义, 优先级2

自定义grains优先级:

  minion配置文件定义 > master端自定义grains脚本 > master端grains模块定义。

特别注意:

  在 /src/salt/_grains目录下的自定义脚本,在执行完成后,建议移到一个Bak目录,确保_grains中没有残留文件,并在执行一次salt'*'saltutil.sync_grains操作。

使minion主机上自定义模块目录是干净的,这样做的好处是可以避免和另外两个文件有配置冲突,也避免脚本之间有重复的名字定义,造成取值结果错误。

(1)minion配置文件定义

  在minion端,grains 默认的配置文件路径写在minion文件中:default_include: minion.d/*.conf , 需要自己创建 *.conf 这个文件。并在文件中按照YAML格式编写grains配置文件。

需要重启Minion后 Master才能获取最新的grains信息(或者Master主动去刷新)。

# cat grains.conf
# 特别注意 :和 - 后面需要接一个空格,段落开头是2个空格间距
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15
serverid: 1001
# Master 查看grains信息
[root@saltmaster salt]# salt 'salt-min*' grains.item serverid
salt-minion-1:
----------
serverid:
1001

(2)Master端对Grains定义

  通过Master 直接给minion 设定Grains数据,而且不需要重启minion,即可生效。通过Master设定的Grains数据保存在minion端的/etc/salt/grains 文件中。格式依旧遵循YAML。

# Master 向 Minion 添加一个name变量,内容为node1
[root@saltmaster salt]# salt 'salt-min*' grains.append name 'node1'
salt-minion-1:
----------
name:
- node1
# 在次向name变量添加内容时,并不会覆盖,而是追加,name将有2个值
[root@saltmaster salt]# salt 'salt-min*' grains.append name 'node2'
salt-minion-1:
----------
name:
- node1
- node2
# Master 向 Minion 添加多个数据,通过grains.setvals 内容则是一个字典的形式
[root@saltmaster salt]# salt 'salt-min*' grains.setvals "{'serverid':'1002','other':'hi'}"
salt-minion-1:
----------
other:
hi
serverid:
1002
# Master 获取指定Minion 中 grains数据值, grains.item 直接加变量名(一个或多个皆可)
[root@saltmaster salt]# salt 'salt-min*' grains.item name serverid
salt-minion-1:
----------
name:
- node1
- node2
serverid:
1001
# Master 直接获取 Minion 的Grains变量内容
[root@saltmaster salt]# salt 'salt-min*' grains.get name
salt-minion-1:
- node1
- node2

(3)Master端python脚本定义

  默认自定义脚本需要放在 Master 的 /srv/salt/_grains 目录下, 这个目录需要自己创建。同步到Minion的脚本会被放在 minion 的 /var/cache/salt/minion/extmods/grains/ 。

# 自定义grains python脚本格式,类似于创建一个grains空字典并添加一对key/value:
def 自定义函数名():
grains = {}
grains['需要添加的grain item 名字'] = 命令行获取方法
return grains # 获取系统时间的示例
[root@salt-minion-1 salt]# cat /var/cache/salt/minion/extmods/grains/get_time.py
#!/usr/bin/python env
# coding=utf-8
from datetime import datetime
def get_server_time():
grains = {}
grains['server_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return grains
# 使用 sync_grains 命令同步脚本到Minion主机上,并通过grains.item 命令获取相关信息即可。
[root@saltmaster salt]# salt "*" saltutil.sync_grains
saltmaster:
- grains.get_time
salt-minion-1:
- grains.get_time
[root@saltmaster salt]# salt '*' grains.item server_time
salt-minion-1:
----------
server_time:
2017-06-08 16:56:55
saltmaster:
----------
server_time:
2017-06-08 16:56:54
# Minion 存放 Master 同步来的脚本目录
[root@salt-minion-1 salt]# ll /var/cache/salt/minion/extmods/grains/
total 8
-rw-------. 1 root root 197 Jun 8 16:56 get_time.py
-rw-------. 1 root root 443 Jun 8 16:56 get_time.pyc

SaltStack Grains 详解的更多相关文章

  1. SaltStack Pillar 详解

    简介 grains用于存储静态不易变更的数据,而pillar一般用于存储动态, 敏感的数据,通过minion和master设置或获取grains信息,而pillar信息只能在master端配置,在到m ...

  2. saltstack配置文件详解

    软件依赖 Python版本大于2.6或版本小于3.0: 对Python版本要求 msgpack-python: SalStack消息交换库 YAML: SaltStack配置解析定义语法 Jinja2 ...

  3. SaltStack系列(一)之环境部署、命令及配置文件详解

    一.SaltStack介绍 1.1 saltstack简介: saltstack是基于python开发的一套C/S架构配置管理工具,它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证 ...

  4. saltstack自动化运维系列⑤之saltstack的配置管理详解

    saltstack自动化运维系列⑤之saltstack的配置管理详解 配置管理初始化: a.服务端配置vim /etc/salt/master file_roots: base: - /srv/sal ...

  5. SaltStack 入门到精通第三篇:Salt-Minion配置文件详解

    SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ  发布日期:2014-06-09 17:52:16   ##### 主要配置设置 ##### 配置 默认值 ...

  6. SaltStack 入门到精通第二篇:Salt-master配置文件详解

    SaltStack 入门到精通第二篇:Salt-master配置文件详解     转自(coocla):http://blog.coocla.org/301.html 原本想要重新翻译salt-mas ...

  7. Python3安装使用SaltStack以及salt-api详解

    序言 最近在使用salt-api做主机批量管理部署,整理一下文档.之前使用saltstack 多用于命令行管理,自己做web版的自动化管理平台时,发现命令行的些许局限性,接触到salt-api,找到了 ...

  8. saltstack源码详解一

    目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...

  9. Saltstack的部署及其详解

    https://repo.saltstack.com/ Saltstack简介: salt是一个多平台基础设施管理工具通常只用在linux上,使用那个轻量级的通讯器,ZN用python写成的批量管理工 ...

随机推荐

  1. 利用 Chrome 原生工具进行网页长截图

    转自https://sspai.com/post/42193 要想使用截图功能,你需要首先确保 Chrome 已升级至 59 或更高版本.在想要截图的网页中,首先按下 ⌘Command + ⌥Opti ...

  2. VMWare 虚拟机挂载 Homestead NFS 进行老项目(基于 Brophp)维护

    环境: Laravel/homestead + winnfsd VMWare workstation 背景: 众所周知, windows 上成功配置 Homestead 进行开发时,为了解决文件系统的 ...

  3. [分享]PY的Boost自动编译程序 1.1 根据环境自动编译

    Python写的Boost自动编译程序 1.1 改进: 根据自己的环境筛选出已安装环境,并列出 环境提供选择. 支持X64位的自动参数编译. 可以选择编译的参数,其他版本持续改进中 自动编译自动安装到 ...

  4. Undo Architecture

    [Undo Architecture] NSUndoManager is a general-purpose recorder of operations for undo and redo. NSU ...

  5. CentOS 7如何开放其它的端口,比如8080

    CentOS 7如何开放其它的端口,比如8080 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop ...

  6. Xcode6制作动态及静态Framework[repost]

    有没有写SDK或者要将一些常用的工具类做成Framework的经历? 你或许自己写脚本完成了这项工作,相信也有很多的人使用 iOS-Universal-Framework ,随着xCode6的发布,相 ...

  7. jmeter 调用jar包 本地加密

    1.因为加密接口是有我们自己加密方式,所有加密包由开发提供,获得加密包后方式jmeter目录/lib/ext文件夹中 2.选择引入加密包 3.添加BeanShell Sampler和Debug Sam ...

  8. ZOJ3767 Elevator 2017-04-13 23:32 37人阅读 评论(0) 收藏

    Elevator Time Limit: 2 Seconds      Memory Limit: 65536 KB How time flies! The graduation of this ye ...

  9. Scala程序编译运行

    1.编译 Scala演示代码如下: <pre name="code" class="plain">/** * @author Administrat ...

  10. handsontable-cell features

    数据验证:在columns中设置validator,进行同步或异步验证,还可添加beforeValidate, afterValidate函数,allowInvalid:true可以不用验证 var ...