• SaltStack Pillar 详解


    简介  

      grains用于存储静态不易变更的数据,而pillar一般用于存储动态, 敏感的数据,通过minion和master设置或获取grains信息,而pillar信息只能在master端配置,在到minion端执行。pillar 默认使用sls文件进行数据存储(YAML格式),除此之外, pillar也同事支持多种后端的数据存储方式,例如:mysql,mongodb,ldap,json,cobbler甚至是puppet。

    常用的场景:

      1. 敏感数据:例如ssh key,加密整数等,由于Pillar使用独立的加密session,可以确保这些敏感数据不被其他minion看到。

      2. 不同变量:可以再pillar中处理平台差异性,比如针对不同的操作系统设置软件包的名字,然后在state中引用。

      3. 用户版本等变量:可以在pillar中添加任何需要用到的数据,比如定义用户和UID的对应关系,软件版本和端口,minion的角色等等

    基础内容:

    • 默认目录: /srv/pillar/, 在master配置文件中指定,目录默认需要自己创建。修改配置文件可修改。
    • 入口文件: /srv/pillar/top.sls , pillar默认的主入口配置文件。
    • Pillar默认值:与grains不同,所有的pillar值都是人为设定的,默认pillar为空。
    • sls 文件:pillar的文件,sls是saltstack的缩写,YAML风格,支持jinja模板。

    常用命令:

        salt '*' sys.doc pillar            # 查看与pillar有关的帮助信息
        salt '*' pillar.items              # 获取所有pillar items值
        salt '*' pillar.data               # 等价于pillar.items
        salt '*' saltutil.refresh_pillar   # 刷新pillar值
        salt '*' saltutil.sync_all         # 刷新pillar值,与refresh_pillar操作类似,但范围更大
        salt '*' sys.list_functions pillar # 列出所有的pillar相关函数方法
        salt '*' pillar.get xxx            # 获取某项的值,类似于python字典的get函数
        salt '*' pillar.raw                 # 内存中获取
        salt '*' state.highstate pillar={'test': 'abc'}  # 在命令设置pillar 数据
    # 数据格式,类似于字典    
            foo:
            bar:
                baz:qux
    # 获取方式:
        {{ pillar['foo']['bar']['baz']}}
        {{ salt['pillar.get']('foo:bar:baz', 'qux')}}        
    pillar.get

    Master配置文件中关于pillar的相关信息

    (1)pillar目录
    pillar_roots:
      base:
        - /srv/pillar
    (2)是否将master配置文件中的数据信息添加到pillar中,默认是不加,需要的话可以改成True,重启服务生效。
    pillar_opts: False
    (3)pillar 源,salt支持引入pillar外部资源,例如从数据库导入pillar值,默认是关闭的
    ext_pillar_first: False
    (4)开启pillar gitgs ssl验证
    pillar_gitfs_ssl_verify: True
    (5)开启pillar render 错误信息
    pillar_safe_render_error: True
    (6)设置pillar配置合并策略
    pillar_source_merging_strategy: smart

    Pillar的刷新方式:

    • salt '*' saltutil.refresh_pillar
    • salt '*' saltutil.sync_all 
    (1) salt '*' saltutil.refresh_pillar 
    [root@saltmaster pillar]# salt '*' saltutil.refresh_pillar
    saltmaster:
        True
    (2)    salt '*' saltutil.sync_all
    [root@saltmaster pillar]# salt '*' saltutil.sync_all 
    saltmaster:
        ----------
        beacons:
        clouds:
        engines:
        grains:
        log_handlers:
        modules:
        output:
        proxymodules:
        renderers:
        returners:
        sdb:
        states:
        utils:
    刷pillar 的输出结果

    关于pillar的 sls 文件使用说明:

      默认的入口文件为/src/pillar/top.sls

      top.sls的引用方式分为两种:

    • 将引用sls文件放在同级目录
    • 在/src/pillar/ 目录下创建对应的packages, services目录,并在该目录下创建init.sls文件。

    备注:如果要引用执行的sls文件和目录同时存在,也就是方法一和方法二都存在,packages.sls和packages/init.sls,会优先使用packages.sls文件。

    (1)方式一:
    [root@saltmaster srv]# tree /srv/pillar/
    /srv/pillar/       # 默认pillar文件目录
    ├── packages.sls   # packages 引用文件
    ├── services.sls   # services 引用文件
    └── top.sls        # 固定的入口文件top.sls
    (2)方式二:
    [root@saltmaster srv]# tree /srv/pillar/
    /srv/pillar/
    ├── packages       # packages 目录
    │   └── init.sls   # 引用文件
    ├── services       # services 目录
    │   └── init.sls   # 引用文件
    └── top.sls        # 固定的入口文件top.sls
     
    # 引入文件说明
    [root@saltmaster pillar]# cat packages.sls
    zabbix:
      package-name: zabbix
      version: 2.2.4
    [root@saltmaster pillar]# cat services.sls
    zabbix:
      port: 10050
      user: admin
    top.sls引用说明

    配置好top.sls以及附属sls文件后,可以刷新一下pillar,查看各个pillar值

    [root@saltmaster pillar]# salt '*' pillar.items 
    saltmaster:
        ----------
        zabbix:
            ----------
            package-name:
                zabbix
            port:
                10050
            user:
                admin
            version:
                2.2.4

    pillar 中jinja模板的使用

      通过jinja模板来写 sls 文件,然后通过操作系统的不同利用grains 获取 pillar 信息。同样在state组件里也可以更方便的调用pillar。

    [root@saltmaster pillar]# cat top.sls
    base:
      '*':
          - packages
    [root@saltmaster pillar]# cat packages.sls
    pkgs: # 模块名称
      {% if grains['os'] == 'CentOS' %}   # 使用jinja模板,通过grains筛选主机
      apache: httpd   # 安装包名称
      git: git        
      {% elif grains['os'] == 'SUSE' %}
      apache: apache2
      git: git-core
      {% endif %}
    [root@saltmaster pillar]# salt '*' saltutil.refresh_pillar
    [root@saltmaster pillar]# salt "*" pillar.items
    saltmaster:
        ----------
        pkgs:
            ----------
            apache:
                httpd
            git:
                git
    salt-minion-1:
        ----------
        pkgs:
            ----------
            apache:
               apache2
            git:
               git-core

    pillar 对敏感数据密码信息的存储

    # cat /srv/pillar/database.sls
    dbname: project
    dbuser: username
    dbpass: password
    dbhost: localhost
    # 在模块文件中引用方式:
    # cat website.conf
    # MySQL setttings
    define('DB_NAME', '{{ pillar['dbname'] }}')
    # MySQL database username
    define('DB_USER''{{ pillar['dbuser'] }}')
    # MySQL database password
    define('DB_PASSWORD', '{{ pillar['dbpass'] }}')
    # MySQL hostname
    define('DB_HOST', '{{ pillar['dbhost'] }}')
  • 相关阅读:
    ZOJ1450 BZOJ1136 BZOJ1137 HDU3932[最小圆覆盖]
    POJ 1755 Triathlon [半平面交 线性规划]
    POJ 3384 Feng Shui [半平面交]
    POJ 3525 Most Distant Point from the Sea [半平面交 二分]
    POJ 1279 Art Gallery [半平面交]
    POJ3335 POJ3130 POJ1474 [半平面交]
    POJ 3608 Bridge Across Islands [旋转卡壳]
    nginx访问量统计
    PV UV QPS 并发数
    PV、UV、IP之间的区别与联系
  • 原文地址:https://www.cnblogs.com/wang-yc/p/8056412.html
Copyright © 2020-2023  润新知