参考:https://docs.saltstack.com/en/latest/topics/pillar/index.html
grains 和pillar的区别
grains 负责采集客户端的基本信息的,可以在客户端自定义然后汇报给服务端,也可在服务端配置然后下发给客户端。grains是静态的,不常变化的。比如主机名,IP,接口。
grains是minion每一次启动的时候都会采集的静态数据,再向master汇报一次。可以用在salt的模块和其他组件。
pillar 给minion定义你需要的数据,这些数据库可以被salt的其他组件使用。数据是动态的,
区别:
1、grains是静态、不常变化的;pillar则是动态的
2、grains是存储在minion本地,而pillar存储在master本地
3、minion有权限操作自己的grains值,如增加、删除,但minion只能查看自己的pillar,无权修改
pillar是在master端配置定义的,可以配置指定的数据给指定的minion访问,所以可以配置敏感的数据。
默认的pillar_roots目录是: /srv/pillar/ 不存在需要创建。
配置pillar_roots目录
[root@cong-33 pillar]# cat /etc/salt/master |grep -A 3 "pillar_roots"
pillar_roots:
base:
- /srv/salt/pillar ##我配置的pillar_roots目录是在/srv/salt/pillar
#
[root@cong-33 pillar]#
配置打开系统自带的pillar参数
[root@cong-33 pillar]# cat /etc/salt/master |grep "^pillar_opts" pillar_opts: True [root@cong-33 pillar]#
重启master端的salt-master服务
[root@cong-33 pillar]# /etc/init.d/salt-master restart
pillar目录,pillar文件编写
[root@cong-33 pillar]# pwd /srv/salt/pillar [root@cong-33 pillar]# ll total 24 -rw-r--r--. 1 root root 28 Oct 30 16:27 data.sls -rw-r--r--. 1 root root 112 Nov 15 09:45 httpd.sls -rw-r--r--. 1 root root 28 Nov 14 17:34 ip.sls -rw-r--r--. 1 root root 73 Nov 15 09:45 top.sls ##pillar的入口文件 -rw-r--r--. 1 root root 74 Nov 14 19:32 uid.sls -rw-r--r--. 1 root root 11 Oct 31 09:31 user.sls [root@cong-33 pillar]#
查看pillar的入口文件top.sls
[root@cong-33 pillar]# cat top.sls base: ##配置文件的环境选项 '*': ##minion,这里是匹配所有的minion。可以使用正则匹配 - ip ##会引用pillar_roots目录下的ip.sls文件,或ip/init.sls文件,优先读取ip.sls - user - uid - httpd
'web*': ##匹配以web开头的minion_id,然后执行这个定义下面的文件操作
- vim [root@cong-33 pillar]#
查看pillar文件
[root@cong-33 pillar]# cat ip.sls ip: {{ grains['ipv4'][1] }} ##设置pillar的ip key,value是使用grains的信息,根据grains获取IP信息 [root@cong-33 pillar]# cat user.sls user: cong ##配置pillar的user kye,值为cong [root@cong-33 pillar]# cat uid.sls user_id: ##pillar信息的一个嵌套, thatch: 1000 shouse: 1001 utahdave: 1002 redbeard: 1003 [root@cong-33 pillar]# cat httpd.sls ##根据grains获取系统类型,然后根据系统类型设置软件包的名称 {% if grains['os'] == 'CentOS' %} apache: httpd {% elif grains['os'] == 'Debian' %} apache: apache2 {% endif %} [root@cong-33 pillar]#
刷新pillar数据到minion
[root@cong-33 pillar]# salt '*' saltutil.refresh_pillar cong-55: True cong-49: ##这个minion没启动所以报错 Minion did not return. [Not connected] [root@cong-33 pillar]#
查看pillar信息
[root@cong-33 pillar]# salt 'cong-55' pillar.ls cong-55: - apache - ip - user_id - user - master [root@cong-33 pillar]# salt 'cong-55' pillar.item ip cong-55: ---------- ip: 192.168.1.126 [root@cong-33 pillar]# salt 'cong-55' pillar.item apache cong-55: ---------- apache: httpd [root@cong-33 pillar]# salt 'cong-55' pillar.item user_id cong-55: ---------- user_id: ---------- redbeard: 1003 shouse: 1001 thatch: 1000 utahdave: 1002 [root@cong-33 pillar]# salt 'cong-55' pillar.item user_id:redbeard cong-55: ---------- user_id:redbeard: 1003 [root@cong-33 pillar]#
在minion端获取
[root@cong-55 ~]# salt-call pillar.item user_id local: ---------- user_id: ---------- redbeard: 1003 shouse: 1001 thatch: 1000 utahdave: 1002 [root@cong-55 ~]# salt-call pillar.item user_id:thatch local: ---------- user_id:thatch: 1000 [root@cong-55 ~]#
这样我们在写sls文件是也可以条用pillar的信息数据了。
pillar的函数
[root@cong-33 pillar]# salt 'cong-55' sys.list_functions pillar cong-55: - pillar.data - pillar.ext - pillar.fetch - pillar.file_exists - pillar.filter_by - pillar.get - pillar.item - pillar.items - pillar.keys - pillar.ls - pillar.obfuscate - pillar.raw [root@cong-33 pillar]#
查看函数的使用方法
[root@cong-33 pillar]# salt 'cong-55' sys.doc pillar.ls pillar.ls: New in version 2015.8.0 Calls the master for a fresh pillar, generates the pillar data on the fly (same as :py:func:`items`), but only shows the available main keys. CLI Examples: salt '*' pillar.ls [root@cong-33 pillar]# salt 'cong-55' sys.doc pillar.item pillar.item: New in version 0.16.2 Return one or more pillar entries from the :ref:`in-memory pillar data <pillar-in-memory>`. delimiter Delimiter used to traverse nested dictionaries. Note: This is different from :py:func:`pillar.get <salt.modules.pillar.get>` in that no default value can be specified. :py:func:`pillar.get <salt.modules.pillar.get>` should probably still be used in most cases to retrieve nested pillar values, as it is a bit more flexible. One reason to use this function instead of :py:func:`pillar.get <salt.modules.pillar.get>` however is when it is desirable to retrieve the values of more than one key, since :py:func:`pillar.get <salt.modules.pillar.get>` can only retrieve one key at a time. New in version 2015.8.0 CLI Examples: salt '*' pillar.item foo salt '*' pillar.item foo:bar salt '*' pillar.item foo bar baz [root@cong-33 pillar]#