点击此处进入---->
点击此处进入---->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
2.master定义信息,minion收集:
(1)通过grains模块来定义;主要有grains.append、grains.setval等方法,如:
#salt 'centos' grains.append env 'test01'
#salt 'centos' grains.setvals "{'role':'nginx01','info':'hello'}"
从上面两图中可以发现,如果/minion.d/*.conf中(默认定义目录)已经存在自定义的items,再通过执行grains.append或grains.setvals去执行时,还是会以/minion.d/*.conf中的为准,并不会覆盖掉原来的信息,事实上,执行这样的操作会在minion端/etc/salt/生成配置文件grains,如下图:
换一句话说,/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方式的字典。如下图做一个简单示例:
执行同步命令后,自定义脚本会上传到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
验证:
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
完成pillar配置后接下来介绍简单使用方法。
eg: 操作目标主机:#salt -I 'info:Here are some test data!' test.ping
是不是发现pillar和grains很像,比如上面的示范中,我们也可以用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的全局配置。
未完待续