Grains 与 Pillars


Grains介绍

Grains接口是salt用来采集底层系统信息的,包含了操作系统信息、域名、IP地址、内核、内存等一些底层信息。就是因为grains采集了这些信息,在salt中就可以利用这些信息,进行minion选择,选择符合条件的minion,来执行操作。

Grains数据是一个相对静态的数据,只是在minion启动的时候进行采集,在下一次minion重启之前,不会主动去更新,也就是说在这段时间,信息发生了变化,grains是不会主动更新的,但是有一些系统参数或者用户自定义参数发生了变化,grains还是会去进行更新的。

Grains数据可以用于信息查询类,比如资产管理,获取指定的参数值,都是字典形式的,可以用于目标选择,通过特定的item值,来选择相同类型的主机。

1.信息查询

[root@master ~]# salt '192.168.64.132' grains.ls
[root@master ~]# salt '192.168.64.132' grains.items
[root@master ~]# salt '192.168.64.132' grains.item os

Grains是以字典的形式,存放这些数据信息的,所有对grains的操作,和对字典的操作类似,其中grains.ls是列出所有的key,grains.items是列出所有的键值对key-value的形式,而grains.item是指定key,获取该key对应的值。

由于可以通过grains进行查询,这里就可以对目标minion进行区别,假如现在的minion中有CenOS和RedHat两种不同的操作系统,只想对CentOS的系统进行操作,就可以通过grains来进行选择。

[root@master ~]# salt -G 'os:CentOS' test.ping
192.168.64.132:
True
192.168.64.131:
True

-G表示通过grains进行匹配,后面需要填写grains的键值对,没有空格,后面就是需要进行的操作了。

除了系统自带的grains意外,还可以对于不同的minion自定义grains,grains是根据minion的配置文件静态指定的,只需要在配置文件中使用grains,然后按照YAML规则,填写相关的值即可。填写完成之后,必须要重启minion,或者同步grains才能生效。

# Custom static grains for this minion can be specified here and used in SLS
# files just like all other grains. This example sets 4 custom grains, with
# the 'roles' grain having two values that can be matched against.
#grains:
# roles:
# - webserver
# - memcache
# deployment: datacenter4
# cabinet: 13
# cab_u: 14-15

在这里,我们可以在132上指定一个grains,roles:webserver。然后通过master去查询所有。

[root@master ~]# salt  '*' grains.item roles
192.168.64.132:
----------
roles:
- webserver
192.168.64.131:
----------
roles:
[root@master ~]# salt -G 'roles:webserver' test.ping
192.168.64.132:
True

只有132有返回值,这样就可以通过用户自定义的grains,来选择minion了。

还有一种方式可以自定义grains,就是直接在/etc/salt/grains文件中,以YAML的格式,编写文件,然后重启minion后,就可以查询到自定义的grains了。

[root@localhost ~]# cat /etc/salt/grains
place:
dc01:
rack13:
10-13U

在132上编写grains文件,然后在master上执行刷新操作,然后进行查询。

[root@master ~]# salt '*' saltutil.sync_grains
192.168.64.131:
192.168.64.132:
[root@master ~]# salt '*' grains.item place
192.168.64.132:
----------
place:
----------
dc01:
----------
rack13:
10-13U
192.168.64.131:
----------
place:

2. 状态管理(目标选择)

有了grains获取信息之后,在编写top.sls的时候,就可以根据minion的特征grains,来有针对性的安装或执行命令。比如现在需要在roles为webserver的主机上,安装httpd,安装文件已经写成了状态文件web.apache了。

base:
'place:dc01:rack13:10-13u'
- match: grain
- web.apache

在top.sls文件中,以YAML的格式编写,其中第一行是键值对,匹配跪着是grian,描述的状态是web.apache。然后通过topfile进行执行。

[root@master salt]# salt '*' state.highstate
192.168.64.131:
----------
ID: states
Function: no.None
Result: False
Comment: No Top file or master_tops data matches found. Please see master log for details.
Changes: Summary for 192.168.64.131
------------
Succeeded: 0
Failed: 1
------------
Total states run: 1
Total run time: 0.000 ms
192.168.64.132:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 16:09:59.537687
Duration: 4358.622 ms
Changes:
----------
httpd:
----------
new:
2.4.6-67.el7.centos
old:
----------
ID: apache-install
Function: pkg.installed
Name: httpd-devel
Result: True
Comment: The following packages were installed/updated: httpd-devel
Started: 16:10:03.977852
Duration: 4197.869 ms
Changes:
----------
httpd-devel:
----------
new:
2.4.6-67.el7.centos
old:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: Started Service httpd
Started: 16:10:09.845850
Duration: 146.409 ms
Changes:
----------
httpd:
True Summary for 192.168.64.132
------------
Succeeded: 3 (changed=3)
Failed: 0
------------
Total states run: 3
Total run time: 8.703 s
ERROR: Minions returned with non-zero exit code

在执行这个topfile的时候,也就会将该top.sls文件传递给对应的minion,位置还是/var/cache/salt/minion/file/base/top.sls。

3. 用户自定义grains

在master上,可以对minion进行自定义grains,然后传递给minion。在master上自定义的grains文件,必须存放在file_roots目录下的grains目录下,默认就是/srv/salt/grains。在执行高级状态的时候,也就是top file的时候,或者是执行saltutil.sync_grains的时候,从master上传递给所有的minion上。

用户自定义grains很好写,只需要返回一个字典就好了。在方法中定义一个空字典,然后可以选择填写多个值,然后返回该字典就好了。

自定义granis的使用场景,当需要向maste中增加新的minion的时候,新minion的有些字段和现在的minion不同,需要在现在的minion上配置该字段,就可以直接在master上配置grains,然后同步给所有的minion,以后就可以通过该字段区分这些minion。

写的时候,文件命名一定要是.py结尾的,因为默认呢会将该文件导入到salt中去执行。

[root@master _grains]# cat mygrains.py
def my_grains():
grainsdict = {}
grainsdict['create_time'] = '20190414'
return grainsdict
[root@master _grains]# salt '*' saltutil.sync_grains
192.168.64.131:
- grains.mygrains
192.168.64.132:
- grains.mygrains
[root@master _grains]#

同步给了minion之后,在minion的/var/cache/salt/minion目录下就能看到,是在extmodus中。

[root@localhost minion]# tree
.
├── accumulator
├── extmods
│   └── grains
│   ├── mygrains.py
│   └── mygrains.pyc
├── files
│   └── base
│   ├── _grains
│   │   └── mygrains.py
│   ├── top.sls
│   └── web
│   └── apache.sls
├── highstate.cache.p
├── module_refresh
├── proc
└── sls.p 8 directories, 8 files

以grains命名的目录,然后多了在master上创建的grains。

然后就可以通过该定义的grains来进行匹配目标了。其实在传递的时候,可以指定minion,这意思就是给指定的minion设置grains了。

[root@master _grains]# salt '*' grains.item create_time
192.168.64.132:
----------
create_time:
20190414
192.168.64.131:
----------
create_time:
20190414

4.Pillar

Grains只能预先定义minion的属性,定义完成之后,必须要重启minion或者是刷新grains,master才能通过之前预先定义的grains进行目标选择。如果在定义grains之后,minion上的该属性值发生了变化,grains不会跟着修改,比较麻烦。所以出现了一种可以动态定义的属性,也就是Pillars。

Pillar是一种支持动态数据采集的,然后根据pillar值,动态的匹配minion,也就是target minion。默认情况下,所有的minion是没有pillar的。

[root@master ~]# salt '*' pillar.items
192.168.64.132:
----------
192.168.64.131:
----------
[root@master ~]# salt '*' pillar.item
192.168.64.131:
----------
192.168.64.132:
----------
[root@master ~]# salt '*' pillar.ls
192.168.64.131:
192.168.64.132:

Pillar是在master上进行定义的,然后根据目标minion设置值,也就是说只有目标minion知道该pillar的值,其他minion都不知道有该值,这个就是敏感数据的设置。

和file_root类似,pillar也有一个root环境,在master的配置文件中需要设置,pillar_root,推荐存放在/srv/pillar目录下,也有环境的区分,比如base等等。在pillar中也有top.sls的概念。

# Salt Pillars allow for the building of global data that can be made selectively
# available to different minions based on minion grain filtering. The Salt
# Pillar is laid out in the same fashion as the file server, with environments,
# a top file and sls files. However, pillar data does not need to be in the
# highstate format, and is generally just key/value pairs.
pillar_roots:
base:
- /srv/pillar

修改完master配置之后,需要重启master环境。pillar的编写,也是基于YAML格式来的。可以在pillar目录下创建目录或直接的sls文件,来定义pillar。

比如现在两个主机上都没有一个对象称为owners,可以创建一个owners.sls定义owner。

[root@master pillar]# cat top.sls
base:
'*':
- owners
[root@master pillar]# cat owners.sls
owner:
- administrator
[root@master pillar]# salt '*' pillar.ls
192.168.64.131:
- owner
192.168.64.132:
- owner
[root@master pillar]# salt '*' pillar.items
192.168.64.131:
----------
owner:
- administrator
192.168.64.132:
----------
owner:
- administrator
[root@master pillar]# salt '*' pillar.item owner
192.168.64.132:
----------
owner:
- administrator
192.168.64.131:
----------
owner:
- administrator

在上面的例子中,定义了一个顶层文件top.sls,在顶层文件中,表明,所有的minion,都拥有base环境下的owners.sls这个文件定义的pillar。而base环境就是在master文件中定义的pillar_roots中有定义。

然后重新定义了一个owner.sls的状态文件,描述的是一个Key-Value的形式,表示owner为administrator。

配置完成之后,执行刷新命令,为所有的minion赋予该值。

[root@master pillar]# salt '*' saltutil.refresh_pillar
192.168.64.132:
True
192.168.64.131:
True

然后就可以通过pillar的命令来查看刚才定义的pillar,和grains的查看方式是一样的。

这种定义方式,和grains的定义是相同的,都是在master上定义,grains需要将文件同步到minion上,pillar貌似没有将文件传递过去。

pillar的另一种方式,就是可以根据其他信息,来动态定义,比如通过grains来做定义。

[root@master pillar]# cat top.sls
base:
'*':
- owners
- apache
[root@master pillar]# cat apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
[root@master pillar]#

在这个例子中,首先是在top文件中增加了一个字段,有apache文件中定义的的属性,然后定义了一个apache文件,里面定义了一个变量apache,该变量的值,是根据grains的值来动态指定的,如果操作系统os是CentOS,则该变量的值为httpd,如果操作系统os为Debian,则该变量的值为apache2.这个和python里面的简单判断很类似,不过这个语法模板成为jinja模板。

使用pillar,最有效的,就是在状态管理/配置管理中,对目标minion进行选择。比如可以选择apache为httpd的节点,进行连通性测试。

[root@master pillar]# salt -I 'apache:httpd' test.ping
192.168.64.131:
True
192.168.64.132:
True
[root@master pillar]# salt '*' pillar.item apache
192.168.64.132:
----------
apache:
httpd
192.168.64.131:
----------
apache:
httpd

通过pillar进行minion节点选择,是使用了-I参数。

下面对grains和pillar进行一下对比。

  grains pillar
数据采集方式 minion启动时采集 master自定义
数据类型  静态

动态生成

应用场景

数据查询

目标选择

配置管理  

数据查询

目标选择

配置管理

敏感数据

定义的位置

minion上定义

master可以传递给minion

master上定义

Grains 与 Pillars的更多相关文章

  1. grains

    用途 1,匹配客户端 2,配置文件里使用 3,资产管理     定义grains方法1:             方法2:        

  2. Saltstack数据系统Grains和Pillar(三)

    Saltstack数据系统 分为Grains和Pillar 一.Grains 静态数据,当Minion启动的时候收集的MInion本地的相关信息.(包含操作系统版本.内核版本.CPU.内存.硬盘.设备 ...

  3. Saltstack grains组件

    grains是Saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态的数据,包括CPU.内核.操作系统.虚拟化等,在服务器端可以根据这些信息进行灵活定 ...

  4. 3.saltstack的grains和pillar学习笔记

    作者:刘耀 QQ:22102107 SaltStack_Grains Grains grains是minion第一次启动的时候采集的静态数据,可以用在salt的模块和其他组件中.其实grains在每次 ...

  5. saltstack之(五)数据系统Grains和Pillar

    一.grains 1.什么是grainsgrains:存储minion端的信息,包括一些网络.硬件等信息,保存在minion端.一般为静态信息,非经常变化的数据. 2.grains的使用:获取mini ...

  6. Saltstack系列4:Saltstack之Grains组件

    grains说明 grains是Saltstack最重要的组件之一,grains的作用是手机被控主机的基本信息,这些信息通常都是一些静态类的数据,包括CPU.内核.操作系统.虚拟化等,在服务器端可以根 ...

  7. saltstack实战3--配置管理之grains

    grains是什么 grains是minion服务启动后,采集的客户端的一些基本信息,硬件信息,软件信息,网络信息,软件版本等.你可以在minion上自定义一些grains信息. 它是静态的信息,mi ...

  8. saltstack:使用教程之二高级模块用法Grains、Pillar

    1.grains用法: 在客户端服务启动的时候收集客户的基础信息,在配置发生变化后也可以通过master重新同步 显示一个客户端的所有项目: [root@node5 ~]# salt "no ...

  9. Codeforces 474 E. Pillars

    水太...... E. Pillars time limit per test 1 second memory limit per test 256 megabytes input standard ...

随机推荐

  1. selenium+python自动化测试系列---基础知识篇(1、HTML基础知识1)

    1.什么是HTML HTML是一种描述网页的语言.HTML指超文本标记语言(Hyper Text Markup Language),它不是一种编程语言,而是一种标记语言(markup language ...

  2. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  3. DevExpress TreeList 禁止节点拖动到其他节点上

    背景 在做一个类似文件树的控件,支持节点从树上向其它的控件拖动程序,但是要保证树上的节点不能拖动上其他的节点上. 代码 /// <summary> /// 拖动节点完成 /// </ ...

  4. selenium-自动化用例(十一)

    思路 将页面操作与用例case分别封装,编写case时就可以用同一个操作方法对应多个case 如下图: PageGUI:存放页面操作方法,每个页面写一个文件,每个文件中写同一个页面不同的操作,例如检索 ...

  5. SQLServer之多表联合查询

    多表联合查询简介 定义:连接查询是关系型数据库最主要的查询,通过连接运算符可以实现多个表连接数据查询. 分类:内连接,外连接,全外连接. 内连接 定义 内联接使用比较运算符根据每个表的通用列中的值匹配 ...

  6. c# 创建excel表头及内容

    主要通过ajax调用函数Getinfo 1.定义表dh DataTable dh = new DataTable(); 2.创建表头 public void CreateCol(string Colu ...

  7. Java集合框架体系JCF

    Java 集合框架体系作为Java 中十分重要的一环, 在我们的日常开发中扮演者十分重要的角色, 那么什么是Java集合框架体系呢? 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一 ...

  8. tmux resurrect 配置

    概述 tmux 用了很长时间了, 快捷键定制了不少, 唯一的遗憾是没法保存 session, 每次关机重开之后, 恢复不到之前的 tmux session. 虽然也能忍受, 但是每天都手动打开之前的 ...

  9. Docker:pipeline编写基本技巧- jenkins配置通过免交互方式拉取git源码管理仓库的代码

    工作中,从git仓库拉取代码有2种方式:交互式和非交互式 什么是交互式?就是拉取需要权限才能访问的代码时,需要输入密码 免交互式呢? 是通过密钥,私钥的方式,让服务端信任客户端,产生信任后,任何一次客 ...

  10. Vue组织架构图组件

    vue-tree-chart   :deciduous_tree: Vue2树形图组件 安装 npm i vue-tree-chart --save 使用 in template: <TreeC ...