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. python的学习笔记01_3 基本运算符 流程控制if while 字符串常用办法

    基本运算符 运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运 ...

  2. vue 外部字体图标使用,无须绝对路径引入办法

    通常外部字体图标都在使用 iconfont ,这种图标在网上搜到一大把都是由于路径问题显示不出来,或者是显示个方块. 最近的项目中也碰到这个坑爸的问题,总结一下解决办法: 和 webpack.conf ...

  3. IDEA启动tomcat乱码

    1.找到IDEA安装目录 2.找到2个文件 3.编辑,在最后一行加入 -Dfile.encoding=UTF-8 4.修改IDEA里tomcat内得编码 5.修改IDEA中tomcat中,startu ...

  4. hbase 工作原理

    一.HBASE介绍HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建大规模结构化的存储集群.HBase的目标是存储并处理大型数据,具体 ...

  5. WPF软件开发系统之五——展会展厅触摸屏企业产品宣传展示系统

    本系统开发背景:上海展会多点触摸大屏(60寸以上)上互动展示. 功能包括:企业背景.产品.合作伙伴.所获荣誉等以图片.文字.视频多媒体的方式呈块状显示,亮点功能为支持多点操作去旋转.缩放.拖拽呈现各种 ...

  6. Jenkins 配置 Git 错误解决:CAfile: C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt

    错误信息: Failed to connect to repository : Command "C:/tools/Git/bin/git.exe ls-remote -h https:/X ...

  7. maven-3.5.3通过eclipse打包问题(1)

    1.maven版本:3.5.3 2.ide: Eclipse Oxygen.2 (4.7.2)(Version: 3.9.2.RELEASE) 3. 配置ide 错误原因: 解决方法以及运行结果:

  8. ubuntu安装Nginx

    什么都不说了 直接干 一.安装Nginx 首先从Nginx的官网下载最新的稳定版本1.14.0:nginx 1.解压安装包 1.root@ubuntu:tar -zxf nginx-1.14.0.ta ...

  9. Git + Docker + Jenkins自动化部署web到Linux(Centos)

    1.把代码托管到Github上 2.安装Docker 3.安装Jenkins 4.在项目中编写Dockerfile.publish.sh (1)Dockerfile内容 # 基于dotnet基础环境构 ...

  10. Linux 下操作Mysql指令的总结 远程连接的设置

    参考博客:https://www.cnblogs.com/liaocheng/p/4243579.html (常用命令) https://www.cnblogs.com/zhangzhu/archiv ...