写在前面的话

上一节谈及了 Saltstack 的安装和初始化配置,本节将谈谈 Saltstack 中两个重要的东西,Grains 和 Pillar。

数据系统 Grains 入门

Grains 是静态数据,其数据来源于 Minion 启动的时候收集的有关客户端本地的相关信息。

包括操作系统,内核,CPU,内存,硬盘,设备型号等等。这就意味着我们可以使用 Saltstack 做资产管理。

这些静态数据除非是  Minion 重启或者 Master 端主动同步更新,否则不会改变。

1. 查看 grains 默认支持的 Key:

  1. salt 'saltstack-node-01' grains.ls

结果如下:

我们可以看到超级多的 Key。我这里只截图了一小部分。grains.ls 这其实就是 python 里面引用 grains 模块中的 ls 方法。

2. 查看所有 Key 的值:

  1. salt 'saltstack-node-01' grains.items

结果如图:

返回的结果其实就是 YAML 格式,后面会单独的提到 YAML 语法特点。这里我们只需要知道其实就是 K/V 结构就行。

3. 查看单独某个 Key 的值:

  1. salt 'saltstack-node-01' grains.item os

结果如图:

这里区别查看所有,item 采用单数的形式,如果该 Key 不存在或者没值,那么就不会有下面绿色部分的显示。

4. 我们就可以根据这里的 KV 来就行选择特定的机器,类似 K8S 中的标签选择器(Label Selector):

  1. salt -G 'os:CentOS' cmd.run 'uptime'

结果如图:

注意,如果我们用 KV 选择需要使用 -G 参数。且这里的冒号后面没空格。

5. 当然,默认的 grains 可能无法满足我们的需求,我们可以自定义,一共有两种方法:

方法 1:在 /etc/salt/minion 配置文件的 129 行 有关于 grains 的配置(不同版本可能不一样)

可以添加一下配置进行测试:

  1. grains:
  2. roles: app-server

注意 roles 前面空格 2 个,roles 后面 : 后面空格 1 个,这是 YAML 语法要求。

然后我们重启 minion 测试一下:

  1. systemctl restart salt-minion

在 Master 查看:

  1. salt '*' grains.item roles

结果如图:

可以发现刚刚添加的 node3 节点已经能够看到我们新添加的 KV 配置了。

方法 2:通过方法 1 我们发现,如果都写到 minion 配置文件,不便于我们管理,所有我们可以抽离出来:

我们可以新建 /etc/salt/grains 文件,该文件能够自动被 salt 识别,直接在内部写 KV:

  1. server_env: product
  2. server_name: mall-server

注意冒号后面有个空格。我们也可以不重启 minion,直接在 Master 端同步,然后再度查看:

  1. # 不重启直接同步
  2. salt '*' saltutil.sync_grains
  3.  
  4. # 查看多个
  5. salt '*' grains.item server_env server_name 

结果如下:

6. 或者某个 Key 的值我们还可以使用如下方法:

  1. salt '*' grains.get os

对比 grains.item 查看结果:

我们发现使用 item 相对于使用 get 多显示了 Key

7. 自己用 Python 开发一个 grains: 方法就是写个脚本,返回一个字典即可。

首先我们需要修改 master 的配置文件:/etc/salt/master 在当前版本的 658 行有关于 file_roots 的配置,我们把配置放开。

  1. file_roots:
  2. base:
  3. - /srv/salt

该目录同时也用于我们之后写 YAML 文件使用。当然这个目录不存在,还需要我们在 Master 节点手动建立。

  1. # 重启 Master
  2. systemctl restart salt-master
  3.  
  4. # 创建目录
  5. mkdir /srv/salt

我们存放 Python 脚本的目录为:_grains

  1. cd /srv/salt/ && mkdir _grains

我们在下面新建一个获取时间的 Python 脚本:get_time.py

  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3.  
  4. import time
  5.  
  6. def get_time():
  7. grains = {}
  8. grains['year'] = time.localtime().tm_year
  9. grains['month'] = time.localtime().tm_mon
  10. grains['day'] = time.localtime().tm_mday
  11. return grains

然后同步到所有 Minion 节点:

  1. salt '*' saltutil.sync_grains

结果如图:

我们可以查看同步之后的脚本在 Minion 节点放到了什么位置:

  1. tree /var/cache/salt/

结果如图:

我们需要知道的是 /var/cache/salt 目录相当重要,从 Master 端同步的都会放到该目录下,其中红色部分就是能够执行的代码。

可以直接查看刚刚我们定义的那些 Key:

  1. salt '*' grains.item year

结果如图:

如果这过程中出现问题,我们都可以查看日志:/var/log/salt/minion

当然,在我们定义 grains 的时候,可能会和系统的名称出现一样的情况,这就牵扯到一个优先级:

系统自带 > grains 文件中 > minion 中写的 > 自己写的

数据系统 Pillar 入门

Pillar 相比于 Grains,首先 Pillar 是动态的数据。其次 Pillar 定义在 Master 上面,只有特定的节点能看到,所以安全。

我们可以查看当前系统中的 Pillar 数据:

  1. salt '*' pillar.items

可以看到目前是没数据的,但是其实系统是有一部分数据的,只是被隐藏了而已,如果你确实想看,可以通过修改 Master 配置实现查看,配置在 /etc/salt/master 的 878 行(我当前的版本),修改配置为如下配置,再度重启 Master 即可:

  1. pillar_opts: True

其最终查看的结果其实际是一个叫做 master 的字典,但是并不推荐开启,因为不便于管理 pillar 配置。

我们从前面知道了 Grains 是可以直接在 minion 配置文件中定义的,那么 Pillar 需要这么定义呢?此时就可以看出 Grains 和 Pillar 的明显不同,Grains 配置在 Minion 端,Pillar 配置在 Master 端,且 Pillar 使用我们后面会经常用到的 sls 文件进行管理。至于 sls 的具体使用方法,后面会单独详讲。

1. 我们需要通过修改 master 配置文件,放开 Pillar 配置,在 /etc/salt/master 我当前版本的 828 行:

  1. pillar_roots:
  2. base:
  3. - /srv/pillar

重启 Master 新建目录:

  1. # 重启
  2. systemctl restart salt-master
  3.  
  4. # 新建目录
  5. /srv/pillar
  6.  
  7. # 查看目录结构
  8. tree /srv/

结果如图:

2. 为了更好的进行管理,可以对 sls 文件进行归类,我们这里在 pillar 下面新建一个 test 目录,用于存放测试 sls 文件:

  1. cd /srv/pillar/ && mkdir test
  2.  
  3. # 创建配置
  4. vim server_role.sls

内容如下:

  1. {% if grains['fqdn'] == 'demo-node1' %}
  2. salt_role: master
  3. {% else %}
  4. salt_role: minion
  5. {% endif %}

在该配置中我们加入了 Grains 判断。至于这个文件的语法,如果你学过 Python 并且使用过 Django 你就会发现特别熟悉,没错,Jinja2 语法。后面也会详讲,这里先简单应用。该配置大致意思就是根据主机名给不同的 Minion 设置不同的角色属性。

3. 新建 top.sls,在 Saltstack 中 sls 配置有一个统一的入口,那就是 top.sls 文件,我们这里也是简单的应用,后面讲到配置的时候单独详讲,先有这么个概念和印象就行。

  1. vim top.sls

内容如下:

  1. base:
  2. '*':
  3. - test.server_role

简单做个说明:* 指代所有主机,你也可以写特定的主机或者通配符,因为我们新建了 test 目录,所有我们得像 Python 调用模块一样,使用 test.server_role 来调用配置文件。此时可以查看下目录结构:

4. 同步配置,可以像 grains 一样不用重启直接同步:

  1. salt '*' saltutil.refresh_pillar

结果如下:

再度查看:

  1. salt '*' pillar.item salt_role

结构如图:

5. 使用选择器执行想要的:

  1. salt -I 'salt_role:master' cmd.run 'w'

查看结果:

注意:这里 Pillar 的规则需要使用 -I (大写 i)参数,就行 Grains 需要使用 -G 参数一样。同时可能会遇到这样的情况,如下:

对于 Minion did not return. [No response] 这种问题,一般重启 minion 端就能解决。

小结

通过对比 Grains 和 Pillar,我们会发现其最大的特点有以下几个:

1. Grains 主要配置在 Monion,而 Pillar 主要配置在 Master。

2. Grains 可以自己用 Python 写方法,返回一个字典就行。Pillar 则是用 Salt 最为主要的 sls 配置。

3. Grains 一般是静态数据,虽然自定义的可以使用方法动态获取,而 Pillar 则是可以利用 Jinja2 模板进行逻辑判断。

4. Grains 和 Pillar 都能很好的支持数据查询,配置管理,Pillar 还能够进行敏感数据管理。

5. 两者都能很好的协助我们通过类似标签选择器(Label Selector)的方式对服务器进行批量选择。

注意:这里所说的所谓保护敏感数据其实是因为我们在 Master 端做的定义,这样即使黑客攻陷了某台 Minion 他也无法拿到敏感数据而已。

【02】Saltstack:Grains and Pillar的更多相关文章

  1. 【04】Saltstack:配置管理

    写在前面的话 当我们需要进行一系列可重复且复杂的操作的时候,如果还继续用传统的 cmd.run 来执行显然难以满足我们的需求.这时候就会在想一个问题,我们能不能把这些操作编辑成一个类似脚本的操作,我们 ...

  2. 【02】Python:数据类型和运算符

    写在前面的话 任何编程语言一开始都是从概念出发的,但各种编程语言之间的概念可能又会有差异,所以,老生常谈,我们还是需要从新过一遍 Python 的概念,当然,如果你已经是老司机了,完全可以一晃而过,不 ...

  3. 【02】Kubernets:使用 kubeadm 部署 K8S 集群

    写在前面的话 通过上一节,知道了 K8S 有 Master / Node 组成,但是具体怎么个组成法,就是这一节具体谈的内容.概念性的东西我们会尽量以实验的形式将其复现. 部署 K8S 集群 互联网常 ...

  4. 【03】Saltstack:远程执行

    写在前面的话 远程执行可以说是我们使用 Saltstack 最为基础的目的.所以在这里专门作为单独的一篇来详细的聊聊. 远程执行命令 示例命令: salt '*' cmd.run 'w' 命令分析: ...

  5. 【05】Saltstack:配置详解

    写在前面的话 上一节迷迷糊糊的说了一下配置管理,这一节主要谈谈我们常见的一些操作如何将他转换成配置文件的形式来实现.这样的好处在于,我们可以一次编写到处使用,不用每次再去编写复杂的命令. 配置回顾 在 ...

  6. 【01】Saltstack:从零开始 Saltstack

    写在前面的话 最近一直都在整理以前的乱七八糟的笔记,所以会有很多老旧的东西都会被拉出来重新遛遛.算是再度系统的进行学习. 关于 Saltstack 的一些概念 Saltstack 是基于 Python ...

  7. 【02】Nginx:基本配置和日志处理

    写在前面的话 Nginx 在安装完成后自动为我们生成了一个展示欢迎页的虚拟主机,除此之外,还附带了很多基础的配置,我们先来看看这些配置有什么用,顺便添加一些常用但是配置文件中并未初始化进去的配置来专门 ...

  8. 【02】Jenkins:第一个项目

    写在前面的话 通过上一节我们成功的搭建起来 Jenkins,那么接下来就是体验如何构建我们的第一个项目了.当然在这之前我们得专门针对 Java 环境就行简单的配置. 全局工具配置 其实这次配置的主要还 ...

  9. SSAS系列——【02】多维数据(维度对象)

    原文:SSAS系列——[02]多维数据(维度对象) 1.维度是什么? 数学中叫参数,物理学中是独立的时空坐标的数目.0维是一点,1维是线,2维是一个长和宽(或曲线)面积,3维是2维加上高度形成体积面. ...

随机推荐

  1. Gson+GsonFormat+Postman简单粗暴解析json

    现在有时候之前的项目需要返回来修改bug看到以下这段代码 if (test != null) { JSONTokener jsonParser = new JSONTokener(test); JSO ...

  2. 五、select的5种子句

    1.Where 条件查询 比较运算符: 运算符 说明 >   <   =   >=   <=   !=或<>   In 在某集合内 between 在某范围内 In ...

  3. CCF-CSP 201709-3 JSON查询 题解

    试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一 ...

  4. nginx源码安装与使用

    [root@localhost ~]# yum -y install pcre-devel zlib-devel openssl openssl-devel gcc* [root@localhost ...

  5. sql初——基础

    1.JDBC: Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成. JDB ...

  6. Java中的 Invalid character constant(无效的字符常数)

    将双引号误写成单引号,会出现这个错误. 1 package dftpkg; 2 3 public class Test { 4 5 public static void main(String[] a ...

  7. [LeetCode] 13. Roman to Integer 罗马数字转化成整数

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  8. 关于对STL容器重载运算符的问题

    注意:下文中vector数组指的是每个数组元素都是一个vector的数组 大部分有序STL容器都重载了小于号,且比较方式是对容器中元素进行字典序比较. 此时如果你写\(bool\ operator&l ...

  9. [LeetCode] 684. Redundant Connection 冗余的连接

    In this problem, a tree is an undirected graph that is connected and has no cycles. The given input ...

  10. HDU 3686 Traffic Real Time Query System(点双连通)

    题意 ​ 给定一张 \(n\) 个点 \(m\) 条边的无向图,\(q\) 次询问,每次询问两边之间的必经之点个数. 思路 ​ 求两点之间必经之边的个数用的是边双缩点,再求树上距离.而对比边双和点双之 ...