saltstack有三种定义数据的方式,分别是grains,pillar,mine,每种方式的使用情况不一样,在前期学习的时候各种蛋疼,不知道哪种情况使用哪种方式,很模糊。经过自己的学习,终于弄清楚了它们的不同点。先不用急,我们先学习下基础的用法,后期会总结下它们的不同点和具体使用情况。


    salt有一个接口用来收集客户端的系统基础信息,这个接口就是grains,收集到的数据就称为grains数据。通过grains数据,我们可以做很多事情,比如使用grains指定target,使用grains来定义不同的值,在sls中使用grains使得sls更加灵活等等。

    但是grains数据是随着minion启动时就加载的数据,这些数据是静态的,不可修改的。除非你去重启minion或者刷新grains。但是这个代价是很高的。所以我们在定义数据时尽量不要使用grains。

    说了这么多,我们实际操作下。直接上图。

grains学习_第1张图片


这个操作显示了192.168.79.49这台机器的所有grains信息。

如果你只想显示某个信息,可以直接使用grains.item host就会显示host这个key对应的信息。

具体用法可以使用salt-call sys.doc grains查看帮助。

现在我们看看如何自定义grains数据。

第一种方式是在minion配置中定义,需要重启minion才能更新

grains学习_第2张图片

第二种方式是在minion配置同一目录增加文件grains,和上面类似,只是不需要grains开头,同样需要重启minion

grains学习_第3张图片

以上两种方式,我基本不会使用,接下来介绍第三种方式,就是自定义模块返回grains数据,这个就要刷新grains数据,不需要重启minion。

在_grains目录下自定义模块,这个目录放哪里呢?记得file_roots定义的目录吗?对的,_grains目录需要放在file_roots定义的目录下才会起作用的。也就是/opt/app/salt/state/prod/_grains目录。

在_grains建立文件test.py,内容如下

grains学习_第4张图片

操作如下,看看,神奇吧,很牛是吧。

grains学习_第5张图片

grains的加载顺序如下:

1、加载核心grains

2、加载_grains目录下的grains信息

3、加载grains文件

4、加载minion配置中的grains


为了避免覆盖之前的信息,我们可以给grains添加名字空间,这样就不会覆盖了。

grains学习_第6张图片

其实就是多加一层字典而已。


待续。