配置管理篇(2)_SaltStack grains

grains主要负责采集并返回客户端minion的一些基本信息, saltstack自带grains模块可以采集机器的很多基本信息,对于比较特别的信息grains可以在客户端或服务器端自定义item后采集,不管是那种方式自定义grains的item,最终grains的item值都是由客户端minion采集完成后上报给服务端master的,采集动作只在启动客户端或有新的grains添加时触发,grains采集上报的数据可以作为资产管理的元数据。
一个客户端在启动时就将自定义或基本的item信息值读取到内存了,这些值是个常量在下次重启客户端之前不会改变。
先看看怎样使用,然后瞧瞧怎样自定义(4种自定义方法)
查看所有的grains项 grains.ls

1
2
3
4
5
6
7
8
9
$ salt minion01 grains.ls 
minion01:
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- defaultencoding
... ... ...

查看所有的grains项的详细信息 grains.items

1
2
3
4
5
$ salt minion01 grains.items 
minion01:
biosreleasedate: 07/02/2012
biosversion: 6.00
... ... ...

查看grains指定的item信息

1
2
3
4
5
6
7
8
9
10
11
$ salt minion01 grains.item shell 
minion01:
shell: /bin/sh

$ salt minion01 grains.item os
minion01:
os: CentOS

$ salt minion01 grains.item ipv4
minion01:
ipv4: 127.0.0.1 192.168.186.135

grains添加自定义items
1、在master端添加
在配置文件file_roots指定的目录(默认是/srv/salt)下创建_grains目录,编写可以返回一个字典的py文件(需要懂点python)。

1
2
3
4
5
6
7
$ grep -Ev "^$|^#" /etc/salt/master 
file_roots:
base:
- /srv/salt
pillar_roots:
base:
- /srv/pillar

例如grains添加自定义item(disk_size)返回磁盘的大小,注意python脚本返回值是一个字典。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat disk.py 
#coding=utf-8
import os


def disk_size():
''' get disk size '''
disk = os.statvfs("/")
capacity = disk.f_bsize * disk.f_blocks
ret = int(float(capacity)/1000/1000/1000)
if ret > 1000:
obj = ret/1000.0
disk_size = ("%.1f" % obj) + 'T'
else:
ret = str(ret)
disk_size = ret + 'G'
return {'disk_size': disk_size}

saltutil.sync_grains或者saltutil.sync_all将自定义的grains item同步到minion端,如果只同步grains建议使用saltutil.sync_grains

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ salt minion01 saltutil.sync_grains
minion01:
- grains.__init__
- grains.disk

$ salt minion01 saltutil.sync_all
minion01:
----------
grains:
modules:
outputters:
renderers:
returners:
states:

从结果可以看到sync_grainssync_all不同之处了吧。
同步完成后在minion端的以下目录中可以找到master下发的grains文件

1
2
$ ls /var/cache/salt/minion/extmods/grains/ 
disk.py disk.pyc __init__.py

看看是否同步成功

1
2
3
$ salt minion01 grains.item disk_size 
minion01:
disk_size: 19G

2、在minion端添加 可以直接在配置文件/etc/salt/minion中添加,但一般不这么干。一般会将default_include: minion.d/*.conf配置项打开,然后将自定义grains的以.conf结尾的配置文件放到minion.d这个目录中。

1
2
3
4
$ grep -Ev "^$|#" /etc/salt/minion 
default_include: minion.d/*.conf
master: 192.168.186.134
id: minion01

在minion.d目录中添加并编辑grains.conf文件(文件名随意)

1
2
3
4
$ cat grains.conf 
grains:
IDC: xxx-xxx-xxx
dFlag: 2014/10/31

重启salt-minion后生效,然后在master端查看自定义的grains

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ salt minion01 grains.get IDC 
minion01:
xxx-xxx-xxx

$ salt minion01 grains.get dFlag
minion01:
2014/10/31

$ salt minion01 grains.item dFlag
minion01:
dFlag: 2014/10/31

$ salt minion01 grains.item IDC
minion01:
IDC: xxx-xxx-xxx

3、在master端直接用grains.setval为指定minion的grains设定一个item 设定welcome的值为hello world

1
2
3
$ salt minion01 grains.setval welcome 'hello world' 
minion01:
welcome: hello world

查看定义的item的值

1
2
3
4
5
6
7
$ salt minion01 grains.item welcome 
minion01:
welcome: hello world

$ salt minion01 grains.get welcome
minion01:
hello world

这次定义的grains保存在minion端的配置文件/etc/salt/grains

1
2
3
4
$ pwd 
/etc/salt
$ cat grains
welcome: hello world

4、在master端通过states的grains方法也可以自定义grains
为了方便管理,在文件夹/salt/srv下再创建文件夹gitems,然后再该文件夹下编辑新的sls文件gtest.sls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ pwd 
/srv/salt/gitems
$ ls
gtest.sls
$ cat gtest.sls
country:
grains.present:
- value: china
```

下发到minion端,并查看新添加的item

``` bash
$ salt minion01 state.sls gitems.gtest
minion01:
----------
ID: country
Function: grains.present
Result: True
Comment: Set grain country to china
Changes:
----------
country:
china

Summary
------------
Succeeded: 1
Failed: 0
------------
Total: 1

$ salt minion01 grains.get country
minion01:
china

该方法定义的grains同样保存在minion端的配置文件/etc/salt/grains中

1
2
3
$ cat grains 
country: china
welcome: hello world
----------------本文结束 感谢阅读----------------