Saltstack handbook:Grains and Pillar
Posted dy1an
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Saltstack handbook:Grains and Pillar相关的知识,希望对你有一定的参考价值。
写在前面的话
上一节谈及了 Saltstack 的安装和初始化配置,本节将谈谈 Saltstack 中两个重要的东西,Grains 和 Pillar。
数据系统 Grains 入门
Grains 是静态数据,其数据来源于 Minion 启动的时候收集的有关客户端本地的相关信息。
包括操作系统,内核,CPU,内存,硬盘,设备型号等等。这就意味着我们可以使用 Saltstack 做资产管理。
这些静态数据除非是 Minion 重启或者 Master 端主动同步更新,否则不会改变。
1. 查看 grains 默认支持的 Key:
salt ‘saltstack-node-01‘ grains.ls
结果如下:
我们可以看到超级多的 Key。我这里只截图了一小部分。grains.ls 这其实就是 python 里面引用 grains 模块中的 ls 方法。
2. 查看所有 Key 的值:
salt ‘saltstack-node-01‘ grains.items
结果如图:
返回的结果其实就是 YAML 格式,后面会单独的提到 YAML 语法特点。这里我们只需要知道其实就是 K/V 结构就行。
3. 查看单独某个 Key 的值:
salt ‘saltstack-node-01‘ grains.item os
结果如图:
这里区别查看所有,item 采用单数的形式,如果该 Key 不存在或者没值,那么就不会有下面绿色部分的显示。
4. 此时,我们就可以根据这里的 KV 来就行选择特定的机器,类似 K8S 中的标签选择器(Label Selector):
salt -G ‘os:CentOS‘ cmd.run ‘uptime‘
结果如图:
注意,如果我们用 KV 选择需要使用 -G 参数。且这里的冒号后面没空格。
5. 当然,默认的 grains 可能无法满足我们的需求,我们可以自定义,一共有两种方法:
方法 1:在 /etc/salt/minion 配置文件的 129 行 有关于 grains 的配置(不同版本可能不一样)
可以添加一下配置进行测试:
grains:
roles: app-server
注意 roles 前面空格 2 个,roles 后面 : 后面空格 1 个,这是 YAML 语法要求。
然后我们重启 minion 测试一下:
systemctl restart salt-minion
在 Master 查看:
salt ‘*‘ grains.item roles
结果如图:
可以发现刚刚添加的 node3 节点已经能够看到我们新添加的 KV 配置了。
方法 2:通过方法 1 我们发现,如果都写到 minion 配置文件,不便于我们管理,所有我们可以抽离出来:
我们可以新建 /etc/salt/grains 文件,该文件能够自动被 salt 识别,直接在内部写 KV:
server_env: product
server_name: mall-server
注意冒号后面有个空格。我们也可以不重启 minion,直接在 Master 端同步,然后再度查看:
# 不重启直接同步 salt ‘*‘ saltutil.sync_grains # 查看多个 salt ‘*‘ grains.item server_env server_name
结果如下:
6. 或者某个 Key 的值我们还可以使用如下方法:
salt ‘*‘ grains.get os
对比 grains.item 查看结果:
我们发现使用 item 相对于使用 get 多显示了 Key。
7. 自己用 Python 开发一个 grains: 方法就是写个脚本,返回一个字典即可。
首先我们需要修改 master 的配置文件:/etc/salt/master 在当前版本的 658 行有关于 file_roots 的配置,我们把配置放开。
file_roots:
base:
- /srv/salt
该目录同时也用于我们之后写 YAML 文件使用。当然这个目录不存在,还需要我们在 Master 节点手动建立。
# 重启 Master systemctl restart salt-master # 创建目录 mkdir /srv/salt
我们存放 Python 脚本的目录为:_grains
cd /srv/salt/ && mkdir _grains
我们在下面新建一个获取时间的 Python 脚本:get_time.py
#!/usr/bin/env python #-*- coding:utf-8 -*- import time def get_time(): grains = grains[‘year‘] = time.localtime().tm_year grains[‘month‘] = time.localtime().tm_mon grains[‘day‘] = time.localtime().tm_mday return grains
然后同步到所有 Minion 节点:
salt ‘*‘ saltutil.sync_grains
结果如图:
我们可以查看同步之后的脚本在 Minion 节点放到了什么位置:
tree /var/cache/salt/
结果如图:
我们需要知道的是 /var/cache/salt 目录相当重要,从 Master 端同步的都会放到该目录下,其中红色部分就是能够执行的代码。
此时我们可以直接查看刚刚我们定义的那些 Key:
salt ‘*‘ grains.item year
结果如图:
如果这过程中出现问题,我们都可以查看日志:/var/log/salt/minion
当然,在我们定义 grains 的时候,可能会和系统的名称出现一样的情况,这就牵扯到一个优先级:
系统自带 > grains 文件中 > minion 中写的 > 自己写的
数据系统 Pillar 入门
Pillar 相比于 Grains,首先 Pillar 是动态的数据。其次 Pillar 定义在 Master 上面,只有特定的节点能看到,所以安全。
以上是关于Saltstack handbook:Grains and Pillar的主要内容,如果未能解决你的问题,请参考以下文章