Saltstack的数据信息采集者Grains和Pillar

一、SaltStack 的配置文件格式及写法

   在谈到grains和pillar之前,要和大家先谈一下SaltStack的配置文件写法

因为下面谈到的自定义grains和如何配置pillar需要涉及到。

   关于SaltStack的所有配置文件都是YAML格式的,编写归则有以下几点:

   1.1 配置文件中用空格来表示层级之间的关系,每层每次都递增2个空格,不是Tab键。

      每次每组的配置首层必须顶头没有缩进。

   1.2 配置文件中用冒号(:)及其后面跟和一个空格来表示其是一个含有值的父层;

      就是其下面还有其他值。

   1.3 用短横杠(-)和其后紧跟一个空格来表示后面跟的是一个值。

下面具体看下图的说明:

 wKioL1fJjryzf10VAACZUf2ifgw259.png-wh_50

二、Grains


  grains 是在minion端定义的,其数据信息相对是静态的。

  就是说当master/minion互相建立连接的时刻开始,在master 端

通过 grains 所获取的minion端的主机信息是固定不变的,就是在minion端主机配置发生改变时,这种数据仍然不会发生改变;除非重启服务;当然还有给命令可以刷新,使之生效,那是后话了;

  值得一提的是我们可以利用grains 采集的数据信息,用来做资产管理。


2.1. 查看目标主机的所有 grains 信息

在master端执行

salt  'minion1.saltstack.com'  grains.items


  实例应用:

    2.1.1 获取目标主机的操作系统信息

wKioL1fJj03iPENFAAAocsvWddQ083.png-wh_50

   

    2.1.2 用 grains 在远程执行上来匹配目标minion;(grains的内容是不区分大小写的)

wKiom1fJkJShqAR8AAA4BF40c04451.png-wh_50

    2.1.3 你也可以利用 grains模块的get方法来获取目标的grains信息

[root@master stats]# salt 'minion1.saltstack.com' grains.get fqdn

minion1.saltstack.com:

    minion1.saltstack.com


2.2. 自定义 grains


    自定义的 grains 是在minion端的主配置文件中定义的


2.2.1 方法一: [root@minion1 ~]# vi /etc/salt/minion

653 ######      Grains  setings           ######

654 ############################################

655 grains:

656   roels: nginx

657   env: prod


修改后,要重启minion服务

重启客户端服务成功后,在master端测试一下:

[root@master salt]# salt -G 'env:prod' test.ping

minion1.saltstack.com:

    True


2.2.2 方法二:

这也是建议的方法,这样看着比较清晰,好管理

就是把自定义的grains 配置文件单独的放在 /etc/salt/minion.d/目录下

  2.2.2.1 首先在 minion端的主配置文件 /etc/salt/minion 里设置如下选项:

default_include: minion.d/*.conf


  2.2.2.2 在目录 /etc/slat/minon.d/  下创建 grains.conf文件;添加如下内容:

[root@minion1 minion.d]# cat grains.conf 

######      Grains  setings           ######

############################################

grains:

  roles: nginx

  env: prod

  2.2.2.3 重启minion端服务

[root@minion1 minion.d]# service salt-minion restart

Stopping salt-minion daemon:                               [  OK  ]

Starting salt-minion daemon:                               [  OK  ]


  2.2.2.4 在 master 端测试

[root@master ~]# salt -G 'roles:windows' test.ping

minion1.saltstack.com:

    True

2.3. 同步 grains 数据

    你也许很讨厌修改grains数据后,必须重启才能生效的方式;现在你有更好的方法:

    刷新granins数据

  2.3.1 在minion端修改grains数据

[root@minion1 minion.d]# cat grains.conf 

######      Grains  setings           ######

############################################

grains:

  roles: windows

  env: prod

  test: salt


  2.3.2在master测试:

[root@master ~]# salt -G 'test:salt' test.ping

No minions matched the target. No command was sent, no jid was assigned.

ERROR: No return received                     # 没执行刷新命令前

[root@master ~]# salt '*'  saltutil.sync_grains      # 执行刷新命令

minion1.saltstack.com:

minion2.saltstack.com:

    Minion did not return. [Not connected]         # 这个minion2是没有启动的情况


[root@master ~]# salt -G 'test:salt' test.ping

minion1.saltstack.com:

    True                                # 刷新后的返回状态为真


三、 Pillar


 pillar 数据系统是在master端对minion主机进行任何数据参数的定义,可动态匹配minion端的主机特性。

 而且在 pillar 中定义的参数,可以被其他组件使用,如模板、state、API等,这也是其价值的体现


3.1. 如何定义和是使用 pillar

 3.1.1 首先在 /etc/salt/master 中定义 pillar 的根目录

内容如下:

pillar_roots:

  base:

    - /srv/pillar

[root@master ~]# service salt-master restart  # 重启 master 服务

  3.1.2  在master主机上创建以上目录

[root@master stats]# install -d /srv/pillar/


  3.1.3  在上面的目录里创建入口文件: top.sls 添如下内容

[root@master stats]# cat /srv/pillar/top.sls

base:    # 定义环境

  '*':  # 匹配的minion目标

    - init.rsyslog  # 在/srv/pillar/init目录下,有个rsyslog.sls文件

  3.1.4 在 /srv/pillar/目录下创建init目录,

      mkdir /srv/pillar/init

      之后在 init目录下创建文件rsyslog.sls文件,内容如下

[root@master init]# cat rsyslog.sls

{% if granis['osfinger'] == 'CentOS-6' % }  # 用grains判断系统发行版本是CentOS-6

syslog: rsyslog                             # pillar的参数syslog的名字就是 rsyslog

{% elif grains['osfinger'] == 'CentOS-5'%}  # 用grains判断若是Centos-5

syslog: syslog                              # pillar的参数syslog的名字就是 syslog

{% endif %}                                 # if语句的结束语句

  3.1.5 在master端刷新 pillar 数据

[root@master init]# salt '*' saltutil.refresh_pillar

minion2.saltstack.com:

    True

minion1.saltstack.com:

    True

  3.1.6 测试 pillar 

[root@master pillar]# salt '*' pillar.data syslog

minion1.saltstack.com:

    ----------

    syslog:

        rsyslog

minion2.saltstack.com:

    ----------

    syslog:

        rsyslog

  3.1.7 在远程执行中使用自定义的 pillar