SaltStack之数据系统

SaltStack数据系统

一、数据系统Grains
1、Grains是SaltStack收集的有关底层管理系统的静态信息。包括操作系统版本、域名、IP地址、内存、内核、CPU、操作系统类型以及许多其他系统属性。Minion 收集的信息,可以作为Master端匹配目标。
2、如果需要自定义grains,需要添加到Salt Minion的/etc/salt/grains文件中(配置文件中定义的默认路径),也可以直接写在配置文件/etc/salt/minion中
二、数据系统Pillar
Pillar是动态的,Pillar存储在master上,提供给minion。
Pillar主要记录一些加密信息,可以确保这些敏感数据不被其他minion看到。比如:软件版本号、用户名密码等。存储格式都是YAML格式
Grains是SaltStack的一个组件,存放在SaltStack的minion端,当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion发生过重启时才会进行数据的更新
Grains应用场景:
1.信息查询(用于查询minion端的IP信息、FQDN信息等)
2.匹配minion(如想要在系统为CentOS的minion中执行一条命令)

SaltStack组件之Grains

实例

列出所有grains的key和value
[root@node01 ~]# salt '*' grains.items
node02:
    ----------
    SSDs:
    biosreleasedate:        //bios的时间
        07/29/2019
    biosversion:            //bios的版本
        6.00
    cpu_flags:       //cpu相关的属性
        - 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
        - lm
        - constant_tsc
        - arch_perfmon
        - nopl
        - xtopology
        - tsc_reliable
        - nonstop_tsc
        - eagerfpu
        - pni
        - pclmulqdq
        - ssse3
        - fma
        - cx16
        - pcid
        - sse4_1
        - sse4_2
        - x2apic
        - movbe
        - popcnt
        - tsc_deadline_timer
        - aes
        - xsave
        - avx
        - f16c
        - rdrand
        - hypervisor
        - lahf_lm
        - abm
        - 3dnowprefetch
        - arat
        - fsgsbase
        - tsc_adjust
        - bmi1
        - avx2
        - smep
        - bmi2
        - invpcid
        - mpx
        - rdseed
        - adx
        - smap
        - clflushopt
        - xsaveopt
        - xsavec
    cpu_model:       //CPU具体型号
        Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
    cpuarch:       //CPU架构
        x86_64
    cwd:
        /
    disks:
        - sda
        - sr0
        - dm-0
        - dm-1
        - dm-2
    dns:
        ----------
        domain:
        ip4_nameservers:
            - 1.1.1.1
        ip6_nameservers:
        nameservers:
            - 1.1.1.1
        options:
        search:
        sortlist:
    domain:
    fqdn:
        node02
    fqdn_ip4:         //ip地址
        - 192.168.175.151
    fqdn_ip6:
        - fe80::7790:6522:b7ac:8c7c
    fqdns:
    gid:
        0
    gpus:
        |_
          ----------
          model:
              SVGA II Adapter
          vendor:
              vmware
    groupname:
        root
    host:     //主机名
        node02
    hwaddr_interfaces:
        ----------
        ens33:
            00:0c:29:6d:98:29
        lo:
            00:00:00:00:00:00
    id:       //minion的ID  
        node02
    init:
        systemd
    ip4_gw:
        192.168.175.2
    ip4_interfaces:
        ----------
        ens33:
            - 192.168.175.151
        lo:
            - 127.0.0.1
    ip6_gw:
        False
    ip6_interfaces:
        ----------
        ens33:
            - fe80::7790:6522:b7ac:8c7c
        lo:
            - ::1
    ip_gw:
        True
    ip_interfaces:
        ----------
        ens33:
            - 192.168.175.151
            - fe80::7790:6522:b7ac:8c7c
        lo:
            - 127.0.0.1
            - ::1
    ipv4:
        - 127.0.0.1
        - 192.168.175.151
    ipv6:
        - ::1
        - fe80::7790:6522:b7ac:8c7c
    kernel:
        Linux
    kernelrelease:
        3.10.0-514.el7.x86_64
    kernelversion:
        #1 SMP Tue Nov 22 16:42:41 UTC 2016
    locale_info:
        ----------
        defaultencoding:
            UTF-8
        defaultlanguage:
            zh_CN
        detectedencoding:
            UTF-8
        timezone:
            unknown
    localhost:
        node02
    lsb_distrib_codename:
        CentOS Linux 7 (Core)
    lsb_distrib_id:
        CentOS Linux
    machine_id:
        e13393c56c6f42a092d1ab26051a644a
    manufacturer:
        VMware, Inc.
    master:
        192.168.175.150
    mdadm:
    mem_total:
        7806
    nodename:
        node02
    num_cpus:
        4
    num_gpus:
        1
    os:
        CentOS
    os_family:
        RedHat
    osarch:
        x86_64
    oscodename:
        CentOS Linux 7 (Core)
    osfinger:
        CentOS Linux-7
    osfullname:
        CentOS Linux
    osmajorrelease:
        7
    osrelease:
        7.3.1611
    osrelease_info:
        - 7
        - 3
        - 1611
    path:
        /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
    pid:
        50799
    productname:
        VMware Virtual Platform
    ps:
        ps -efHww
    pythonexecutable:
        /usr/bin/python
    pythonpath:
        - /usr/bin
        - /usr/lib64/python27.zip
        - /usr/lib64/python2.7
        - /usr/lib64/python2.7/plat-linux2
        - /usr/lib64/python2.7/lib-tk
        - /usr/lib64/python2.7/lib-old
        - /usr/lib64/python2.7/lib-dynload
        - /usr/lib64/python2.7/site-packages
        - /usr/lib/python2.7/site-packages
    pythonversion:
        - 2
        - 7
        - 5
        - final
        - 0
    saltpath:
        /usr/lib/python2.7/site-packages/salt
    saltversion:
        3000.3
    saltversioninfo:
        - 3000
        - 3
    selinux:
        ----------
        enabled:
            True
        enforced:
            Enforcing
    serialnumber:
        VMware-56 4d f6 10 b4 a5 f7 3e-5a 58 8a 22 98 6d 98 29
    server_id:
        711731264
    shell:
        /bin/sh
    swap_total:
        8063
    systemd:
        ----------
        features:
            +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
        version:
            219
    uid:
        0
    username:
        root
    uuid:
        10f64d56-a5b4-3ef7-5a58-8a22986d9829
    virtual:
        VMware
    zfs_feature_flags:
        False
    zfs_support:
        False
    zmqversion:
        4.1.4
只查询所有的grains的key
[root@node01 ~]# salt '*' grains.ls
node02:
    - 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的值,如想获取ip地址
[root@node01 ~]# salt '*' grains.get fqdn_ip4
node02:
    - 192.168.175.151
查看当前虚拟机镜像
[root@node01 ~]# salt '*' grains.get os
node02:
    CentOS
查看当前虚拟机网卡
[root@node01 ~]# salt '*' grains.get ip4_interfaces
node02:
    ----------
    ens33:
        - 192.168.175.151
    lo:
        - 127.0.0.1
查看某个网卡的ip
[root@node01 ~]# salt '*' grains.get ip4_interfaces:ens33
node02:
    - 192.168.175.151

用Grains来匹配minion

[root@node01 ~]# salt -G 'os:CentOS' test.ping
node02:
    True

开启一台Redhat镜像的虚拟机去验证,名为node03

安装salt-minion
[root@node03 ~]# yum -y install salt-minion

编辑文件
[root@node03 ~]# vim /etc/salt/minion
把master改为master的地址
master: 192.168.175.150
重启服务
[root@node03 ~]# systemctl restart salt-minion

master接收key
[root@node01 ~]# salt-key -L
Accepted Keys:
node02
Denied Keys:
Unaccepted Keys:
node03
Rejected Keys:
[root@node01 ~]# salt-key -ya node03
The following keys are going to be accepted:
Unaccepted Keys:
node03
Key for minion node03 accepted.
[root@node01 ~]# salt-key -L
Accepted Keys:
node02
node03
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@node01 ~]# salt '*' test.ping
node03:
    True
node02:
    True

查看镜像
[root@node01 ~]# salt -G 'os:CentOS' test.ping
node02:
    True
[root@node01 ~]# salt '*' grains.get os
node03:
    RedHat
node02:
    CentOS

在top file里面使用Grains:

卸载node02上面的nginx
[root@node01 ~]# salt -G 'os:CentOS' pkg.remove nginx
node02:
    ----------
    nginx:
        ----------
        new:
        old:
            1:1.16.1-1.el7
    nginx-all-modules:
        ----------
        new:
        old:
            1:1.16.1-1.el7
    nginx-mod-http-image-filter:
        ----------
        new:
        old:
            1:1.16.1-1.el7
    nginx-mod-http-perl:
        ----------
        new:
        old:
            1:1.16.1-1.el7
    nginx-mod-http-xslt-filter:
        ----------
        new:
        old:
            1:1.16.1-1.el7
    nginx-mod-mail:
        ----------
        new:
        old:
            1:1.16.1-1.el7
    nginx-mod-stream:
        ----------
        new:
        old:
            1:1.16.1-1.el7
[root@node02 ~]# rpm -qa|grep nginx
nginx-filesystem-1.16.1-1.el7.noarch

编辑文件
[root@node01 ~]# tree /srv/salt/base/
/srv/salt/base/
├── top.sls
└── web
    └── nginx
        ├── 1
        └── install.sls

2 directories, 3 files
[root@node01 ~]# vim /srv/salt/base/top.sls 
[root@node01 ~]# cat /srv/salt/base/top.sls 
base:
  'os:RedHat':      //代表只是Redhat装nginx
    - match: grain
    - web.nginx.install

验证
[root@node01 ~]# salt '*' state.highstate       //node03安装成功,node02安装失败,说明以上配置文件成功
node02:
----------
          ID: states
    Function: no.None
      Result: False
     Comment: No Top file or master_tops data matches found. Please see master log for details.
     Changes:   

Summary for node02
------------
Succeeded: 0
Failed:    1
------------
Total states run:     1
Total run time:   0.000 ms
node03:
----------
          ID: nginx-install
    Function: pkg.installed
        Name: nginx
      Result: True
     Comment: The following packages were installed/updated: nginx
     Started: 19:12:27.629300
    Duration: 51359.374 ms
     Changes:   
              ----------
              centos-indexhtml:
                  ----------
                  new:
                      7-9.el7.centos
                  old:
              dejavu-fonts-common:
                  ----------
                  new:
                      2.33-6.el7
                  old:
              dejavu-sans-fonts:
                  ----------
                  new:
                      2.33-6.el7
                  old:
              fontconfig:
                  ----------
                  new:
                      2.13.0-4.3.el7
                  old:
              fontpackages-filesystem:
                  ----------
                  new:
                      1.44-8.el7
                  old:
              freetype:
                  ----------
                  new:
                      2.8-14.el7
                  old:
                      2.4.11-15.el7
              gd:
                  ----------
                  new:
                      2.0.35-26.el7
                  old:
              gperftools-libs:
                  ----------
                  new:
                      2.6.1-1.el7
                  old:
              libX11:
                  ----------
                  new:
                      1.6.7-2.el7
                  old:
              libX11-common:
                  ----------
                  new:
                      1.6.7-2.el7
                  old:
              libXau:
                  ----------
                  new:
                      1.0.8-2.1.el7
                  old:
              libXpm:
                  ----------
                  new:
                      3.5.12-1.el7
                  old:
              libjpeg-turbo:
                  ----------
                  new:
                      1.2.90-8.el7
                  old:
              libpng:
                  ----------
                  new:
                      2:1.5.13-7.el7_2
                  old:
              libxcb:
                  ----------
                  new:
                      1.13-1.el7
                  old:
              nginx:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-all-modules:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-filesystem:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-image-filter:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-perl:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-xslt-filter:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-mail:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-stream:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:

Summary for node03
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  51.359 s

node03验证
[root@node03 ~]# rpm -qa|grep nginx
nginx-mod-stream-1.16.1-1.el7.x86_64
nginx-all-modules-1.16.1-1.el7.noarch
nginx-filesystem-1.16.1-1.el7.noarch
nginx-mod-http-perl-1.16.1-1.el7.x86_64
nginx-mod-http-xslt-filter-1.16.1-1.el7.x86_64
nginx-mod-http-image-filter-1.16.1-1.el7.x86_64
nginx-mod-mail-1.16.1-1.el7.x86_64
nginx-1.16.1-1.el7.x86_64

自定义Grains的两种方法:
1.minion配置文件,在配置文件中搜索grains
(此方式不被推荐)

1.在node03下面的minion下面配置
[root@node03 ~]# vim /etc/salt/minion
可以找到下面内容把#号去掉进行修改,但是不被推荐,因为不方便
#grains:
#  roles:
#    - webserver
#    - memcache
#  deployment: datacenter4
#  cabinet: 13
#  cab_u: 14-15

[root@node03 ~]# vim /etc/salt/minion
最后添加
grains:
  role:
    - webserver
[root@node03 ~]# systemctl restart salt-minion
[root@node01 ~]# salt -G 'os:RedHat' grains.get role
node03:
    - webserver
这个方式不方便,因为假如有多个需要安装,就只能一台一台安装

2.在/etc/salt下生成一个grains文件,在此文件中定义(推荐方式)(推荐此方式)

[root@node01 ~]# vim /etc/salt/grains
[root@node01 ~]# cat /etc/salt/grains
role: webserver
[root@node01 ~]# salt-cp '*' /etc/salt/grains /etc/salt/grains
node02:
    ----------
    /etc/salt/grains:
        True
node03:
    ----------
    /etc/salt/grains:
        True
[root@node01 ~]# salt '*' grains.get role
node03:
node02:

不重启服务需要同步

[root@node01 ~]# salt '*' saltutil.sync_grains
node03:
node02:
继续查看,此时可以看到内容
[root@node01 ~]# salt '*' grains.get role
node03:
    webserver
node02:
    webserver

SaltStack组件之Pillar

pillar也是Saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模板、state、API等。

在pillar中定义的数据与不同业务特性的被控主机相关联,这样不同被控主机只能看到自己匹配的数据,因此pillar安全性很高,适用于一些比较敏感的数据,这也是区别于grains最关键的一点,如定义不同业务组主机的用户id、组id、读写权限、程序包等信息,定义的规范是采用Python字典形式,即键/值,最上层的键一般为主机的id或组的名称。
Pillar的特点:

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

在Master配置文件中有一段Pillar settings选项专门定义Pillar相关的一些参数只需要取消这些注释即可

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

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

[root@node01 ~]# vim /etc/salt/master
pillar_roots:    取消注释并且添加内容
  base:
    - /srv/pillar/base
  prod:
    - /srv/pillar/prod
  test:
    - /srv/pillar/test
#
[root@node01 ~]# mkdir -p /srv/pillar/{base,prod,test}    //创建目录
[root@node01 ~]# tree /srv/pillar/
/srv/pillar/
├── base
├── prod
└── test

3 directories, 0 files

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

查看确实没有
[root@node01 ~]# salt '*' pillar.items
node03:
    ----------
node02:
    ----------
修改文件
[root@node01 ~]# vim /etc/salt/master
把这一行#号去掉并且把false改为true
pillar_opts: True
重启
[root@node01 ~]# systemctl restart salt-master
[root@node01 ~]# salt '*' pillar.items
node03:
    ----------
    master:
        ----------
        __cli:
            salt-master
        __role:
            master
        allow_minion_key_revoke:
            True
  省略。。。。。。

一般是不用上面这个功能的,都是自己定义的所有需要改回

[root@node01 ~]# vim /etc/salt/master
改回
#pillar_opts: Flase
[root@node01 ~]# systemctl restart salt-master

pillar自定义数据:
在master的配置文件里找pillar_roots可以看到其存放pillar的位置

[root@node01 ~]# vim /etc/salt/master
pillar_roots:    取消注释并且添加内容
  base:
    - /srv/pillar/base
  prod:
    - /srv/pillar/prod
  test:
    - /srv/pillar/test
#
[root@node01 ~]# mkdir -p /srv/pillar/{base,prod,test}    //创建目录
[root@node01 ~]# tree /srv/pillar/
/srv/pillar/
├── base
├── prod
└── test

3 directories, 0 files
[root@node01 ~]# vim /srv/pillar/base/nginx.sls
[root@node01 ~]# cat /srv/pillar/base/nginx.sls
{% if grains['os'] ==  'RedHat' %}
nginx: nginx
{% elif grains['os'] ==  'CentOS' %}
nginx: nginx2
{% endif %}

定义top file入口文件
[root@node01 ~]# vim /srv/pillar/base/top.sls
[root@node01 ~]# cat /srv/pillar/base/top.sls
base:
  '*':
    - nginx
查看环境能够访问到nginx这个pillar
[root@node01 ~]# salt '*' pillar.items
node03:
    ----------
    nginx:
        nginx
node02:
    ----------
    nginx:
        nginx2
 假设只允许一个可以,只需要把*改为允许的虚拟机名即可
   [root@node01 ~]# vim /srv/pillar/base/top.sls
[root@node01 ~]# cat /srv/pillar/base/top.sls
base:
  'node03*':
    - nginx
[root@node01 ~]# salt '*' pillar.items
node02:
    ----------
node03:
    ----------
    nginx:
        nginx

在salt下修改apache的状态文件,引用pillar的数据
查看node03没有nginx
[root@node03 ~]# rpm -qa|grep nginx
nginx-filesystem-1.16.1-1.el7.noarch
修改并执行
[root@node01 ~]# vim /srv/salt/base/web/nginx/install.sls 
[root@node01 ~]# cat /srv/salt/base/web/nginx/install.sls 
nginx-install:
  pkg.installed:
    - name: {{ pillar['nginx'] }}

执行高级状态文件
[root@node01 ~]# salt '*' state.highstate    //可以看到node03安装成功
node02:
----------
          ID: states
    Function: no.None
      Result: False
     Comment: No Top file or master_tops data matches found. Please see master log for details.
     Changes:   

Summary for node02
------------
Succeeded: 0
Failed:    1
------------
Total states run:     1
Total run time:   0.000 ms
node03:
----------
          ID: nginx-install
    Function: pkg.installed
        Name: nginx
      Result: True
     Comment: The following packages were installed/updated: nginx
     Started: 21:27:10.001409
    Duration: 18507.811 ms
     Changes:   
              ----------
              nginx:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-all-modules:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-image-filter:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-perl:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-http-xslt-filter:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-mail:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:
              nginx-mod-stream:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:

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

Grains与Pillar的区别

  • grains类似于puppet的facter!facter是用来收集客户的信息的
  • pillar相当于puppet的Hiera!Hiera用来组织变量,结构化变量!
    grains类似于puppet的facter 是用来探测出minion的一些变量,比如主机名,内存大小,IP地址,系统及版本号等。相对来说,grains存储的是静态/不常变化的内容

而pillar作为salt中独立的系统,个人认为是配置管理的精髓,其信息是存储在master上或其他扩展的后端,如mongodb等,结合SLS,通过pillar传送对应的配置管理变量(如需要安装的软件版本,安装位置,配置文件参数,防火墙规则等)实现一套SLS即可完成各种需求的状态配置.

grains和pillar的另一个区别就是grains是存储在minion本地,所以grains可以进行新增、变更、删除等操作(通过grains模块append、remove、setval、delval等方法); 而pillar是存储在master本地或者第三方平台上,minion只能查看自己的,没有权限做新增、变更、删除操作

名称存储位置数据类型数据采集更新方式应用
grainsminion端静态数据minion启动时收集,也可以使用saltutil.sync_grains进行刷新存储minion基本数据。比如用于匹配minion,自身数据可以用来做资产管理cmdb等。
pillarmaster端动态数据在master端定义,指定给对应的minion。可以使用saltutil.refresh_pillar进行刷新存储master指定数据,只用指定的minion可以看到。用于敏感数据保存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值