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只能查看自己的,没有权限做新增、变更、删除操作
名称 | 存储位置 | 数据类型 | 数据采集更新方式 | 应用 |
---|---|---|---|---|
grains | minion端 | 静态数据 | minion启动时收集,也可以使用saltutil.sync_grains进行刷新 | 存储minion基本数据。比如用于匹配minion,自身数据可以用来做资产管理cmdb等。 |
pillar | master端 | 动态数据 | 在master端定义,指定给对应的minion。可以使用saltutil.refresh_pillar进行刷新 | 存储master指定数据,只用指定的minion可以看到。用于敏感数据保存。 |