signed

QiShunwang

“诚信为本、客户至上”

自动化运维-SaltStack之数据系统

2020/8/20 11:07:47   来源:

SaltStack之数据系统

文章目录

  • SaltStack之数据系统
    • 1. saltstack数据系统
    • 2. Grains
      • 2.1 Grains查询信息
      • 2.2 Grains目标匹配
      • 2.3 在top file里面使用Grains
      • 2.4 自定义Grains
    • 3. Pillar
      • 3.1 Pillar信息查询
      • 3.2 自定义pillar数据
    • 4. Grains和Pillar的区别

1. saltstack数据系统

saltstack有静态和动态两种数据系统:

  • 静态:Grains
  • 动态:Pillar

2. Grains

Grains是saltstack的组件,用于收集salt-minion在启动时候的信息,又称为静态信息。可以理解为Grains记录着每台Minion的一些常用属性,比如CPU、内存、磁盘、网络信息等。我们可以通过grains.items来查看某台Minion的所有Grains信息。

Grains是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息。在执行salt的sls时候可以根据Grains信息的不同对服务器进行匹配分组,例如可以根据系统是centos服务器跟系统是redhat环境的安装不同的软件包。

Grains的功能:

  • 收集资产信息

Grains应用场景:

  • 信息查询
  • 在命令行下进行目标匹配
  • 在top file中进行目标匹配
  • 在模板中进行目标匹配

官方文档

2.1 Grains查询信息

//列出所有grains的key和value
[root@master ~]# salt 'minion' grains.items
minion:
    ----------
    SSDs:
    biosreleasedate:
        02/27/2020
    biosversion:
        6.00
    cpu_flags:
        - fpu
        - vme
        - de
        - pse
        - tsc
        - msr
        - pae
        - mce
        - cx8
        - apic
        - sep
        - mtrr
        - pge
        - mca
        - cmov
        - pat
        - pse36
        - clflush
        - mmx
        - fxsr
        - sse
        - sse2
        - ss
        - syscall
        - nx
        - pdpe1gb
        - rdtscp
......
......
    uid:
        0
    username:
        root
    uuid:
        a2264d56-8f10-c585-a67a-afea30b3584f
    virtual:
        VMware
    zfs_feature_flags:
        False
    zfs_support:
        False
    zmqversion:
        4.1.4

//只查询所有的grains的key
[root@master ~]# salt 'minion' grains.ls
minion:
    - SSDs
    - biosreleasedate
    - biosversion
    - cpu_flags
    - cpu_model
    - cpuarch
    - cwd
    - disks
    - dns
    - domain
    - fqdn
    - fqdn_ip4
    - fqdn_ip6
    - fqdns
    - gid
    - gpus
    - groupname
    - host
    - hwaddr_interfaces
    - id
    - init
    - ip4_gw
    - ip4_interfaces
    - ip6_gw
    - ip6_interfaces
    - ip_gw
    - ip_interfaces
    - ipv4
    - ipv6
    - kernel
    - kernelrelease
    - kernelversion
    - locale_info
    - localhost
    - lsb_distrib_codename
    - lsb_distrib_id
    - machine_id
    - manufacturer
    - master
    - mdadm
    - mem_total
    - nodename
    - num_cpus
    - num_gpus
    - os
    - os_family
    - osarch
    - oscodename
    - osfinger
    - osfullname
    - osmajorrelease
    - osrelease
    - osrelease_info
    - path
    - pid
    - productname
    - ps
    - pythonexecutable
    - pythonpath
    - pythonversion
    - saltpath
    - saltversion
    - saltversioninfo
    - selinux
    - serialnumber
    - server_id
    - shell
    - swap_total
    - systemd
    - uid
    - username
    - uuid
    - virtual
    - zfs_feature_flags
    - zfs_support
    - zmqversion
    
//查询某个key的值
[root@master ~]# salt 'minion' grains.get os
minion:
    CentOS   

2.2 Grains目标匹配

//对os系统为centos系统执行命令
[root@master ~]# salt -G 'os:CentOS' cmd.run 'uptime'
minion:
     07:02:42 up 52 min,  1 user,  load average: 0.00, 0.01, 0.05
master:
     07:02:42 up 52 min,  1 user,  load average: 0.12, 0.10, 0.11

//在init为systemd的系统上执行命令
[root@master ~]# salt -G 'init:systemd' cmd.run 'uptime'
minion:
     07:02:37 up 52 min,  1 user,  load average: 0.00, 0.01, 0.05
master:
     07:02:37 up 52 min,  1 user,  load average: 0.13, 0.10, 0.11

2.3 在top file里面使用Grains

[root@master ~]# vim /srv/salt/base/top.sls
//添加以下内容
base:
  'os:CentOS':
    - match: grain
    - web.nginx.service
    
[root@master ~]# salt '*' state.highstate
master:
----------
          ID: nginx-service
    Function: service.running
        Name: nginx
      Result: False
     Comment: The named service nginx is not available
     Started: 07:07:45.634167
    Duration: 47.21 ms
     Changes:   

Summary for master
------------
Succeeded: 0
Failed:    1
------------
Total states run:     1
Total run time:  47.210 ms
minion:
----------
          ID: nginx-service
    Function: service.running
        Name: nginx
      Result: True
     Comment: Service nginx is already disabled, and is running
     Started: 07:07:45.779042
    Duration: 417.437 ms
     Changes:   
              ----------
              nginx:
                  True

Summary for minion
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 417.437 ms
ERROR: Minions returned with non-zero exit code    

2.4 自定义Grains

自定义Grains的两种方法:

  • minion配置文件,在配置文件中搜索grains
  • 在/etc/salt下生成一个grains文件,在此文件中定义(推荐方式)
[root@master ~]# vim /etc/salt/grains
role: webserver
[root@master ~]# salt-cp '*' /etc/salt/grains /etc/salt/grains
master:
    ----------
    /etc/salt/grains:
        True
minion:
    ----------
    /etc/salt/grains:
        True
[root@master ~]# systemctl restart salt-minion   //重启master的salt-minion 

[root@minion ~]# systemctl restart salt-minion   //重启minion的salt-minion

[root@master ~]# salt '*' grains.get role
minion:
    webserver
master:
    webserver

不重启的情况下自定义Grains:

[root@master ~]# vim /etc/salt/grains
role: webserver
nginx: v1.18.0

[root@master ~]# salt-cp '*' /etc/salt/grains /etc/salt/grains
master:
    ----------
    /etc/salt/grains:
        True
minion:
    ----------
    /etc/salt/grains:
        True
[root@master ~]# salt '*' saltutil.sync_grains
master:
minion:
[root@master ~]# salt '*' grains.get nginx
minion:
    v1.18.0
master:
    v1.18.0

3. Pillar

Pillar是数据管理中心,主要作用就是存储和定义配置管理中需要的一些数据,比如软件版本号、用户密码等信息,格式与grains类似,都是YAML格式。

Pillar也是Salt用来分发全局变量到所有minions的一个接口。安全起见,有些数据是不可以共享出来的,需要指定。比如高度敏感的数据:通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。

在Master配置文件中有一段Pillar settings选项专门定义Pillar相关的一些参数:

#pillar_roots:
#  base:
#    - /srv/pillar

默认Base环境下Pillar的工作目录在/srv/pillar目录下。若你想定义多个环境不同的Pillar工作目录,只需要修改此处配置文件即可。

Pillar的特点:

  • 可以给指定的minion定义它需要的数据
  • 只有指定的人才能看到定义的数据
  • 在master配置文件里设置

3.1 Pillar信息查询

pillar默认是没有任何信息的,如果想查看信息,需要在 master 配置文件上把 pillar_opts的注释取消,并将其值设为 True。

[root@master ~]# vim /etc/salt/master
...
# master config file that can then be used on minions.
pillar_opts: True    //此处设置为True
...

[root@master ~]# systemctl restart salt-master
[root@master ~]# salt 'master' pillar.items
master:
    ----------
    master:
        ----------
        __cli:
            salt-master
        __role:
            master
        allow_minion_key_revoke:
            True
        archive_jobs:
            False
        auth_events:
            True
        auth_mode:
            1
        auto_accept:
            False
        azurefs_update_interval:
            60
       ......
       ......
        winrepo_passphrase:
        winrepo_password:
        winrepo_privkey:
        winrepo_pubkey:
        winrepo_refspecs:
            - +refs/heads/*:refs/remotes/origin/*
            - +refs/tags/*:refs/tags/*
        winrepo_remotes:
            - https://github.com/saltstack/salt-winrepo.git
        winrepo_remotes_ng:
            - https://github.com/saltstack/salt-winrepo-ng.git
        winrepo_ssl_verify:
            True
        winrepo_user:
        worker_threads:
            5
        zmq_backlog:
            1000
        zmq_filtering:
            False
        zmq_monitor:
            False

3.2 自定义pillar数据

[root@master ~]# vim /etc/salt/master
...
//取消注释并添加以下内容
pillar_roots:
  base:
    - /srv/pillar/base
  prod:
    - /srv/pillar/prod
...

[root@master ~]# mkdir -p /srv/pillar/{base,prod}
[root@master ~]# systemctl restart salt-master
[root@master ~]# vim /srv/pillar/base/apache.sls
//添加以下内容
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}

//定义top file入口文件
[root@master ~]# vim /srv/pillar/base/top.sls
base:
  'master':
    - apache
//这个top.sls文件的意思表示的是master这台主机的base环境能够访问到apache这个pillar    

[root@master ~]# salt '*' pillar.items
minion:
    ----------
master:
    ----------
    apache:
        httpd
        
//在salt下修改apache的状态文件,引用pillar的数据
[root@master ~]# mkdir -p /srv/salt/base/web/apache/
[root@master ~]# vim /srv/salt/base/web/apache/apache.sls
//添加以下内容
apache-install:
  pkg.installed:
    - name: {{ pillar['apache'] }}

apache-service:
  service.running:
    - name: {{ pillar['apache'] }}
    - enable: True

//编辑base环境的top.sls
[root@master ~]# vim /srv/salt/base/top.sls
base:
  'master':
    - web.apache.apach

//执行高级状态文件
[root@master ~]# salt 'master' state.highstate
master:
----------
          ID: apache-install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: The following packages were installed/updated: httpd
     Started: 22:45:36.250599
    Duration: 26150.821 ms
     Changes:   
              ----------
              apr:
                  ----------
                  new:
                      1.4.8-5.el7
                  old:
              apr-util:
                  ----------
                  new:
                      1.5.2-6.el7
                  old:
              httpd:
                  ----------
                  new:
                      2.4.6-93.el7.centos
                  old:
              httpd-tools:
                  ----------
                  new:
                      2.4.6-93.el7.centos
                  old:
              mailcap:
                  ----------
                  new:
                      2.1.41-2.el7
                  old:
----------
          ID: apache-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service httpd has been enabled, and is running
     Started: 22:46:02.443071
    Duration: 635.43 ms
     Changes:   
              ----------
              httpd:
                  True

Summary for master
------------
Succeeded: 2 (changed=2)
Failed:    0
------------
Total states run:     2
Total run time:  26.786 s

4. Grains和Pillar的区别

存储位置 类型 采集方式 应用场景
Grains minion 静态 minion启动时采集
可通过saltutil.sync_grains刷新避免重启minion服务
minion有权限操作自己的grains值,如增加、删除
1.信息查询
2.在命令行下进行目标匹配
3.在top file中进行目标匹配
4.在模板中进行目标匹配
Pillar master 动态 指定,实时生效,也可以通过saltutil.refresh_pillar刷新数据
minion只能查看自己的pillar,无权修改
1.目标匹配
2.敏感数据配置