参考: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]# lltotal 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_pillarcong-55: Truecong-49: ##这个minion没启动所以报错 Minion did not return. [Not connected][root@cong-33 pillar]#
查看pillar信息
[root@cong-33 pillar]# salt 'cong-55' pillar.lscong-55: - apache - ip - user_id - user - master[root@cong-33 pillar]# salt 'cong-55' pillar.item ipcong-55: ---------- ip: 192.168.1.126[root@cong-33 pillar]# salt 'cong-55' pillar.item apachecong-55: ---------- apache: httpd[root@cong-33 pillar]# salt 'cong-55' pillar.item user_idcong-55: ---------- user_id: ---------- redbeard: 1003 shouse: 1001 thatch: 1000 utahdave: 1002[root@cong-33 pillar]# salt 'cong-55' pillar.item user_id:redbeardcong-55: ---------- user_id:redbeard: 1003[root@cong-33 pillar]#
在minion端获取
[root@cong-55 ~]# salt-call pillar.item user_idlocal: ---------- user_id: ---------- redbeard: 1003 shouse: 1001 thatch: 1000 utahdave: 1002[root@cong-55 ~]# salt-call pillar.item user_id:thatchlocal: ---------- user_id:thatch: 1000[root@cong-55 ~]#
这样我们在写sls文件是也可以条用pillar的信息数据了。
pillar的函数
[root@cong-33 pillar]# salt 'cong-55' sys.list_functions pillarcong-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.lspillar.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.itempillar.item: New in version 0.16.2 Return one or more pillar entries from the :ref:`in-memory pillar data`. delimiter Delimiter used to traverse nested dictionaries. Note: This is different from :py:func:`pillar.get ` in that no default value can be specified. :py:func:`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 ` however is when it is desirable to retrieve the values of more than one key, since :py:func:`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]#