salt 之 pillar

参考: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]# 
原文地址:https://www.cnblogs.com/LYCong/p/7878192.html