saltstack入门系列(二)grains和pillar

点击此处进入---->saltstack入门系列(一) 安装和简单使用

点击此处进入---->saltstack入门系列(三)待续

 

接下来了解的是saltstack的数据系统grains和pillar。

grains:(可以做配置管理)

谷物的意思,它是一个组件,存放在minion端,主要用于minion启动时收集系统静态信息,运行过程中数据不会发生变化,只有再次重启,才会再次进行收集。利用它可以:在客户端自定义信息,然后自动汇报上来,场景应用:客户端某个脚本去定期改某个文件,服务器就能收集这些信息了;也可以从服务器端定义,然后推下去,采集完后,再汇报上来。

常用命令:

#salt 'centos' grains.ls            列出指定对象的所有grains项目。ps:上一章中由于我没有在配置文件里指定id,接下来我将用centos也就是我的客户端主机名代替client,具体情况视个人而定

#salt '*' grains.items              列出所有grains项目以及值,利用python思维来理解,ls只是列出了组的key,items可列出key及value

#salt '*' grains.get ip_interfaces        查看所有minion的ip

#salt '*' saltutil.sync_grains            内存,cpu等信息是相对固定的,所以saltstack对这些值做了cache,可以使用该命令来刷新grains的值

 

1.minion定义信息,master收集:

在Minion端我们可以在/etc/salt/minion配置文件中,查找grains,可以查看或修改到相关注释的示例。为了方便配置管理,我们不一般不会选择在该文件上直接进行修改,而是在default_include的目录下/etc/salt/minion.d目录下单独创建*.conf文件,*代表任意(合法)名字。

在client上自定义grains:         (ip:192.168.58.130  hostname:centos)

vim /etc/salt/minion

           //大概在12行的位置,将default_include: minion.d/*.conf前的#号去掉

#vim /etc/salt/minion.d/test.conf           //名字任取,添加或更改以下信息

grains:
  role:
    - nginx
  env: - test                                       //两种写法

#/etc/init.d/salt-minion restart               //重启minion服务

(其实可以不用重启minion,让更改的配置生效,这需要在master端执行刷新命令,操作如下:salt 'centos' saltutil.sync_grains;还可以touch /etc/salt/grains,将上文中的test.conf改添加到/etc/salt/grains中,这时就可以不用写test.conf中第一行的grains了)

在master上获取grains:             (ip:192.168.58.132  hostname:vmware)

#salt '*' grains.item role env

#salt 'centos' grains.get role

113710_HH7I_2917687.png

2.master定义信息,minion收集:

(1)通过grains模块来定义;主要有grains.append、grains.setval等方法,如:

#salt 'centos' grains.append env 'test01'

#salt 'centos' grains.setvals "{'role':'nginx01','info':'hello'}"

084350_NeIA_2917687.png

084529_1Ifw_2917687.png

从上面两图中可以发现,如果/minion.d/*.conf中(默认定义目录)已经存在自定义的items,再通过执行grains.append或grains.setvals去执行时,还是会以/minion.d/*.conf中的为准,并不会覆盖掉原来的信息,事实上,执行这样的操作会在minion端/etc/salt/生成配置文件grains,如下图:

085429_1V2e_2917687.png

换一句话说,/etc/salt/minion.d/*.conf(或/etc/salt/minion)的优先级大于/etc/salt/grains的优先级。

该处也适用通过分发文件到minion的/etc/salt/grains,不过分发文件和命令执行的区别是,分发文件必须要minion端重启salt-minion服务器后才能生效,而通过grains内置模块来定义则是立即生效的。

(2)在master编写然后推送到minion端;在/srv/salt/创建_grains目录,编写grains文件,需要返回一个key和value方式的字典。如下图做一个简单示例:

100720_0Nlx_2917687.png

执行同步命令后,自定义脚本会上传到minion的/var/cache/salt/minion/extmods/grains目录下.

再在master写一个脚本,实现获取被控主机系统允许最大打开文件数(ulimit -n)的数据#vim /srv/salt/_grains/file.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#上面两行可以不写

import os,sys,commands

#定义一个获取最大打开文件数的函数
def openfiel():
  '''
     return os max open file of grains value
  '''
  grains = {}    #初始化一个字典,变量名一定要用grains,以便saltstack识别
  _open_file = 65535                #初始化一个默认值
  
  try:
      getulimit = commands.getstatusoutput('source /etc/profile;ulimit -n')
  except Exception,e:
      pass

  if getulimit[0] == 0:
      _open_file = int(getulimit[1])
  grains['max_open_fiel'] = _open_file    #将获取的ulimit -n的结果进行赋值
  return grains

最后同步模块到指定被控主机并刷新生效,因为grains比较适合采集静态类的数据,比如硬件、内核信息等,当有动态类的功能需求时,需要进行刷新。同步操作:

#salt 'centos' saltutil.sync_all               或#salt 'centos' saltutil.sync_grains

验证:

111518_qkiH_2917687.png

 

grains其实在远程执行命令时,很方便。我们可以按照grains的一些指标来操作。

#salt -G ’role:nginx’ cmd.run 'hostname'

#salt -G ‘os:CentOS’ cmd.run 'df -h'     匹配所有系统是Centos的客户端运行命令df -h

grains组件在saltstack中是一个非常重要的组件,我们执行的时候主机的正则匹配,主机端信息的获取等都会用到该组件,不过grains也有自身的局限性,就是主要存储静态、不常变化的数据。

 

--------------------分割线--------------------

pillar:

pillar是一个字典,和grains不一样,是完全在master上定义的,用于给特定的minion定义任何你需要的数据(数据是动态的),产生特定于minions的任意数据的接口,这些数据可以被salt的其他组件如state使用,如定义用户和uid相关的变量,操作系统与软件包相关的变量等。看不懂没关系,往下继续

通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,像一些比较重要的数据(如密码)可以存在pillar里,还可以定义变量等。

查看指定minion的pillar值(默认为空):#salt 'centos' pillar.items

配置自定义pillar:

#vim /etc/salt/master               //修改或增加以下信息

pillar_roots:
  base:
    - /srv/pillar

#mkdir /srv/pillar

#vim /srv/pillar/top.sls                  //配置格式、入口文件top.sls

base:
  'centos':
    - test

#vim /srv/pillar/test.sls

info: Here are some test data!

保存退出后,指定minion的pillar将会被更新:#salt '*' pillar.items

103637_Q6aZ_2917687.png

完成pillar配置后接下来介绍简单使用方法。

eg:      操作目标主机:#salt -I 'info:Here are some test data!' test.ping

115352_eqLI_2917687.png

是不是发现pillargrains很像,比如上面的示范中,我们也可以用grains自定义的信息来做:

#salt -G 'env:test' test.ping

先来看下他们的区别

    1、grains是静态数据;pillar则是动态数据

    2、grains是存储在minion本地,而pillar存储在master本地

    3、minion有权限操作自己的grains值,如增加、删除,但minion只能查看自己的pillar,无权修改

    4、grains是在minion启动时收集,可以用saltutil.sync_grains刷新;pillar是在master端定义,指定给对应的minion,可以使用saltutil.refresh_pillar刷新

如果你想定义的属性值是经常变化的,那请采用pillar,如果是很固定、不易变的那请用grains。

实际上,pillar是可以引用grains的,比如我们写一个apache.sls的jinja2模板

#vim /srv/pillar/apache.sls

{% if grains['os'] == 'CentOS' %}

apache: httpd

{% elif grains['os'] == 'Debian' %}

apache: apache2

{% endif %}

上面的意思就是:

如果机器是 centOS ,那么看到的 Apache 名称就叫做 httpd

如果机器是 Debian ,那么看到的 Apache 名称就叫做 Apache2

然后在top.sls中添加apache即可。

 

接下来用pillar做一些更复杂的数据

(参考文献:http://blog.csdn.net/cnweike/article/details/12746399)

我们可以在state、模板文件中引用,模板格式为:{{ pillar变量 }}

示例1:创建一个带有UID的用户:

 

当更改完pillar配置文件后,可以通过刷新pillar配置来获取新的pillar状态:

#salt '*' saltutil.refresh_pillar

验证:#salt '*' pillar.item test

pillar同样可以用来作为salt的匹配对象

#salt -l 'conf:/etc/123.conf' test.ping

默认情况下,master配置文件中的内容是被载入到每个minion的pillar中的。这使得master的配置文件可以作为所有minions的全局配置。

未完待续

转载于:https://my.oschina.net/shaoyu/blog/1036924

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值