文章目录
1. SaltStack数据系统
SaltStack有两大数据系统,分别是:
- Grains
- Pillar
1.1 Grains和Pillar的区别
名称 | 存储位置 | 数据类型 | 数据采集更新方式 | 应用 |
---|---|---|---|---|
grains | minion端 | 静态数据 | minion启动时收集,也可以使用saltutil.sync_grains进行刷新 | 存储minion基本数据。比如用于匹配minion,自身数据可以用来做资产管理cmdb等。 |
pillar | master端 | 动态数据 | 在master端定义,指定给对应的minion。可以使用saltutil.refresh_pillar进行刷新 | 存储master指定数据,只用指定的minion可以看到。用于敏感数据保存。 |
2. SaltStack数据系统组件
2.1 SaltStack组件之Grains
Grains
是saltstack
记录minion
的一些静态信息组件,可以简单的理解为grains
里面记录着每台minion
的一些常用的属性,比如cpu
、内存、磁盘、网络信息等,可以通过grains.items
查看某台minion
的grains
所有信息,minion
的grains
信息是minion
启动的时候采集汇报给master
的。
grains
会在minion
进程启动时进行加载,并缓存在内存中。这样salt-minion
进程无需每次操作都要重新检索系统来获取grain
,提升了minion
性能。
grains的定义:
- 通过minion配置文件定义
- 通过grains相关模块定义
- 通过python脚本定义
Grains的功能:
- 收集资产信息
Grains应用场景:
- 信息查询
- 在命令行下进行目标匹配
- 在top file中进行目标匹配
- 在模板中进行目标匹配
关于Grain进行目标匹配可以查看官方文档
信息查询
[root@node01 ~]# salt 'node02' 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
- invpcid_single
- ssbd
- ibrs
- ibpb
- stibp
- fsgsbase
- tsc_adjust
- bmi1
- avx2
- smep
- bmi2
- invpcid
- mpx
- rdseed
- adx
- smap
- clflushopt
- xsaveopt
- xsavec
- arat
- md_clear
- spec_ctrl
- intel_stibp
- flush_l1d
- arch_capabilities
cpu_model: //cpu的具体型号
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz
cpuarch: //cpu架构
x86_64
domain:
fqdn:
node02
fqdn_ip4: //ip地址
- 192.168.159.137
fqdn_ip6:
- fe80::20c:29ff:feb2:1a0e
gpus:
|_
----------
model:
SVGA II Adapter
vendor:
unknown
host: //主机名
node02
hwaddr_interfaces:
----------
eno16777736:
00:0c:29:b2:1a:0e
lo:
00:00:00:00:00:00
id: //minion的ID
node02
init:
systemd
ip4_interfaces: //网卡名
----------
eno16777736:
- 192.168.159.137
lo:
- 127.0.0.1
ip6_interfaces:
----------
eno16777736:
- fe80::20c:29ff:feb2:1a0e
lo:
- ::1
ip_interfaces:
----------
eno16777736:
- 192.168.159.137
- fe80::20c:29ff:feb2:1a0e
lo:
- 127.0.0.1
- ::1
ipv4:
- 127.0.0.1
- 192.168.159.137
ipv6:
- ::1
- fe80::20c:29ff:feb2:1a0e
kernel:
Linux
kernelrelease:
3.10.0-1127.18.2.el7.x86_64
locale_info:
----------
defaultencoding:
UTF-8
defaultlanguage:
zh_CN
detectedencoding:
UTF-8
localhost:
node02
lsb_distrib_id:
CentOS Linux
machine_id:
7ea8cf102d5b4482ab28d073081b860f
manufacturer:
VMware, Inc.
master:
192.168.159.136
mdadm:
mem_total:
972
nodename:
node02
num_cpus:
1
num_gpus:
1
os:
CentOS
os_family:
RedHat
osarch:
x86_64
oscodename:
Core
osfinger:
CentOS Linux-7
osfullname:
CentOS Linux
osmajorrelease:
7
osrelease:
7.8.2003
osrelease_info:
- 7
- 8
- 2003
path:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
productname:
VMware Virtual Platform
ps:
ps -efH
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:
2015.5.10
saltversioninfo:
- 2015
- 5
- 10
- 0
selinux:
----------
enabled:
False
enforced:
Disabled
serialnumber:
VMware-56 4d 95 64 04 8e bc 7e-03 a7 8a 6d ba b2 1a 0e
server_id:
711731264
shell:
/bin/sh
systemd:
----------
features:
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
version:
219
virtual:
VMware
zmqversion:
4.1.4
//只查询所有的grains的key
[root@node01 ~]# salt 'node02' grains.ls
node02:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- gpus
- host
- hwaddr_interfaces
- id
- init
- ip4_interfaces
- ip6_interfaces
- ip_interfaces
- ipv4
- ipv6
- kernel
- kernelrelease
- locale_info
- localhost
- 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
- productname
- ps
- pythonexecutable
- pythonpath
- pythonversion
- saltpath
- saltversion
- saltversioninfo
- selinux
- serialnumber
- server_id
- shell
- systemd
- virtual
- zmqversion
//查询某个key的值,比如想获取ip地址
[root@node01 ~]# salt 'node02' grains.get iqdn_ip4
node02:
- 192.168.159.137
[root@node01 ~]# salt 'node02' grains.get ip4_interfaces
node02:
----------
eno16777736:
- 192.168.159.137
lo:
- 127.0.0.1
-
[root@node01 ~]# salt 'node02' grains.get ip4_interfaces:eno16777736
node02:
- 192.168.159.137
目标匹配
用Grains
来匹配minion
:
[root@node01 ~]# salt -G 'os:CentOS' cmd.run 'uptime'
node01:
02:26:33 up 2:51, 1 user, load average: 0.00, 0.01, 0.05
node02:
18:33:32 up 2:51, 1 user, load average: 0.00, 0.01, 0.05
在top file里面使用Grains:
[root@node01 ~]# vim /srv/salt/base/top.sls
[root@node01 ~]#
[root@node01 ~]# cat /srv/salt/base/top.sls
base:
'os:CentOS':
- match: grain
- web.apache.apache
自定义Grains的两种方法
- minion配置文件,在配置文件中搜索grains
- 在/etc/salt下生成一个grains文件,在此文件中定义(推荐方式)
[root@node01 ~]# vim /etc/salt/grains
[root@node01 ~]# cat /etc/salt/grains
test-grains: node1
[root@node01 ~]# systemctl restart salt-minion
[root@node01 ~]# salt '*' grains.get test-grains
node02:
node01:
node1
不重启的情况下自定义Grains
:
[root@node01 ~]# vim /etc/salt/grains
[root@node01 ~]# cat /etc/salt/grains
test-grains: node2
longnian: dragonyear
[root@node01 ~]# salt '*' saltutil.sync_grains
node01:
node02:
[root@node01 ~]# salt '*' saltutil.get longnian
node02:
dragonyear
node01:
2.2 SaltStack组件之Pillar
Pillar是数据管理中心,主要作用就是存储和定义配置管理中需要的一些数据,比如软件版本号、用户密码等信息,格式与grains类似,都是YAML格式。
Pillar也是Salt用来分发全局变量到所有minions的一个接口。安全起见,有些数据是不可以共享出来的,需要指定。比如高度敏感的数据:通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。
默认Base环境下Pillar的工作目录在/srv/pillar目录下。若你想定义多个环境不同的Pillar工作目录,只需要修改此处配置文件即可。
Pillar的特点:
- 可以给指定的minion定义它需要的数据
- 只有指定的人才能看到定义的数据
- 在master配置文件里设置
//查看pillar的信息
[root@node01 ~]# salt '*' pillar.items
node01:
----------
node02:
----------
默认pillar
是没有任何信息的,如果想查看信息,需要在 master 配置文件上把 pillar_opts
的注释取消,并将其值设为 True。
[root@node01 ~]# vim /etc/salt/master
..........
//修改False为True
pillar_opts: True
//重启master并查看pillar的信息
[root@node01 ~]# systemctl restart salt-master
[root@node01 ~]# salt '*' pillar.items
node01:
----------
master:
----------
__role:
master
auth_mode:
1
auto_accept:
False
cache_sreqs:
True
cachedir:
/var/cache/salt/master
cli_summary:
False
client_acl:
----------
client_acl_blacklist:
----------
cluster_masters:
cluster_mode:
paranoid
con_cache:
False
conf_file:
/etc/salt/master
config_dir:
/etc/salt
cython_enable:
False
daemon:
False
default_include:
master.d/*.conf
enable_gpu_grains:
False
enforce_mine_cache:
False
enumerate_proxy_minions:
False
environment:
None
event_return:
event_return_blacklist:
event_return_queue:
0
event_return_whitelist:
ext_job_cache:
ext_pillar:
extension_modules:
/var/cache/salt/extmods
external_auth:
----------
failhard:
False
file_buffer_size:
1048576
file_client:
local
file_ignore_glob:
None
file_ignore_regex:
None
file_recv:
False
file_recv_max_size:
100
file_roots:
----------
base:
- /srv/salt/base
prod:
- /srv/salt/prod
test:
- /srv/salt/test
..........
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 ~]# systemctl restart salt-master
[root@node01 ~]#
[root@node01 ~]# vim /srv/pillar/base/apache.sls
[root@node01 ~]# cat /srv/pillar/base/apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'RedHat' %}
apache: apache2
{% endif %}
[root@node01 ~]# vim /srv/pillar/base/top.sls
[root@node01 ~]# cat /srv/pillar/base/top.sls
base:
'node02': //指定目标
- apache //引用apache.sls或apache/init.sls
//这个top.sls文件的意思表示的是node02这台主机的base环境能够访问到apache这个pillar
[root@node01 ~]# salt '*' pillar.items
node01:
----------
master:
----------
__role:
master
auth_mode:
1
auto_accept:
False
cache_sreqs:
True
..........
node02:
----------
apache:
httpd
master:
----------
..........
//在salt下修改apache的状态文件,引用pillar的数据
[root@node01 ~]# vim /srv/salt/base/web/apache/apache.sls
[root@node01 ~]# cat /srv/salt/base/web/apache/apache.sls
apache-install:
pkg.installed:
- name: {{ pillar['apache'] }}
apache-service:
service.running:
- name: {{ pillar['apache'] }}
- enable: True
//执行高级状态文件
[root@node01 ~]# salt 'node02' state.highstate
node02:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 19:26:16.648756
Duration: 1497.248 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 19:26:16.648756
Duration: 158.657 ms
Changes:
Summary for 192.168.69.137
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 23.254 s