Grains是saltstack组件中非常重要的组件之一,它用来记录minion的系统信息(操作系统、域名、IP地址、内核信息、操作系统类型、内存信息以及其他更多的系统信息)。
Grain收集的信息是静态的,在minion第一次启动时采集数据(除非下次重起,否则数据不会变化)。
Pillar是在salt 0.9.8版本后才添加的功能组件。它跟grains的结构一样,也是一个字典格式,数据通过key/value的格式进行存储。在Salt的设计中,Pillar使用独立的加密sessiion,所以Pillar可以用来传递敏感的数据,例如ssh-key,加密证书等。
相对于Grains的静态参数,Pillar可以配置更灵活的参数,熟练地运用Pillar可以十分强大的发挥Saltstack的威力。
Salt中的pillar接口是Salt开发中最重要的接口之一。Pillar是用来产生特定于minions的任意数据的接口。pillar中产生的数据几乎可以在Salt的任何组件中使用,用途广泛:
高度敏感的数据:
通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。
Minion配置:
minion模块,像是execution模块,states,和returner可以通过存储在pillar中的数据配置。
Variables:
特定minions或者groups需要变量可以定义在pillar中,以后可以在sls公式或者模板文件中使用。
任意的数据:
Pillar可以包含任何基础数据结构,像是一个列表的值,键值存储结构都可以定义使得可以在sls公式中简单的遍历一组值。
SaltStack数据系统之间的区别
名称 | 存储位置 | 数据类型 | 数据采集更新方式 | 应用 |
---|---|---|---|---|
Grains | Minion端 | 静态数据 | Minion启动时采集,也可以使用saltutil.sync_grains进行刷新。 | 存在Minion基本数据。比如用于匹配Minion,自身数据可以用来做资产管理等。 |
Pillar | Master端 | 动态数据 | 在Master端定义,指定给对应的Minion。可以使用saltutil.refresh_pillar刷新。 | 存储Master指定的数据,只有指定的Minion可以看到。用于敏感数据保存。 |
实验环境:
1.系统默认变量
salt server2 grains.ls #显示grains全部变量名称
server2:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- 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
- lsb_distrib_release
- 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
salt server2 grains.items #查看minion全部静态变量
server2:
----------
SSDs:
biosreleasedate:
01/01/2011
biosversion:
0.5.1
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
- msr
- pae
- mce
- cx8
- apic
- sep
- mtrr
- pge
- mca
- cmov
- pat
- pse36
- clflush
- mmx
- fxsr
- sse
- sse2
- syscall
- nx
- rdtscp
- lm
- constant_tsc
- rep_good
- nopl
- eagerfpu
- pni
- pclmulqdq
- ssse3
- cx16
- sse4_1
- sse4_2
- x2apic
- popcnt
- tsc_deadline_timer
- aes
- xsave
- avx
- f16c
- rdrand
- hypervisor
- lahf_lm
- fsgsbase
- smep
- erms
- xsaveopt
cpu_model:
Intel Xeon E312xx (Sandy Bridge)
cpuarch:
x86_64
disks:
- sda
- dm-0
- dm-1
dns:
----------
domain:
ip4_nameservers:
- 114.114.114.114
ip6_nameservers:
nameservers:
- 114.114.114.114
options:
search:
sortlist:
domain:
fqdn:
server2
fqdn_ip4:
- 172.25.60.2
fqdn_ip6:
- fe80::5054:ff:feb1:973a
fqdns:
gid:
0
gpus:
|_
----------
model:
QXL paravirtual graphic card
vendor:
unknown
groupname:
root
host:
server2
hwaddr_interfaces:
----------
eth0:
52:54:00:b1:97:3a
lo:
00:00:00:00:00:00
id:
server2
init:
systemd
ip4_gw:
172.25.60.250
ip4_interfaces:
----------
eth0:
- 172.25.60.2
lo:
- 127.0.0.1
ip6_gw:
False
ip6_interfaces:
----------
eth0:
- fe80::5054:ff:feb1:973a
lo:
- ::1
ip_gw:
True
ip_interfaces:
----------
eth0:
- 172.25.60.2
- fe80::5054:ff:feb1:973a
lo:
- 127.0.0.1
- ::1
ipv4:
- 127.0.0.1
- 172.25.60.2
ipv6:
- ::1
- fe80::5054:ff:feb1:973a
kernel:
Linux
kernelrelease:
3.10.0-514.el7.x86_64
kernelversion:
#1 SMP Wed Oct 19 11:24:13 EDT 2016
locale_info:
----------
defaultencoding:
UTF-8
defaultlanguage:
en_US
detectedencoding:
UTF-8
timezone:
EDT
localhost:
server2
lsb_distrib_codename:
Red Hat Enterprise Linux Server 7.3 (Maipo)
lsb_distrib_id:
Red Hat Enterprise Linux Server
lsb_distrib_release:
7.3
machine_id:
b3c6b44f45144265ac542f73294f7e54
manufacturer:
Red Hat
master:
172.25.60.1
mdadm:
mem_total:
992
nodename:
server2
num_cpus:
1
num_gpus:
1
os:
RedHat
os_family:
RedHat
osarch:
x86_64
oscodename:
Maipo
osfinger:
Red Hat Enterprise Linux Server-7
osfullname:
Red Hat Enterprise Linux Server
osmajorrelease:
7
osrelease:
7.3
osrelease_info:
- 7
- 3
path:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
pid:
2161
productname:
KVM
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/lib64/python2.7/site-packages/gtk-2.0
- /usr/lib/python2.7/site-packages
pythonversion:
- 2
- 7
- 5
- final
- 0
saltpath:
/usr/lib/python2.7/site-packages/salt
saltversion:
2019.2.0
saltversioninfo:
- 2019
- 2
- 0
- 0
selinux:
----------
enabled:
False
enforced:
Disabled
serialnumber:
server_id:
1398511438
shell:
/bin/sh
swap_total:
2047
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:
b3c6b44f-4514-4265-ac54-2f73294f7e54
virtual:
kvm
zfs_feature_flags:
False
zfs_support:
False
zmqversion:
4.1.4
salt server2 grains.item os #查看系统信息
salt server2 grains.item fqdn #查看完整主机名
salt server2 grains.item nodename #查看缩略名
2.自定义Grains
方法1:在minion端写入roles
[root@server2 ~]# vim /etc/salt/minion ##设置server2的roles为apache
129 grains:
130 roles:
131 - apache
[root@server1 salt]# salt server2 saltutil.sync_grains ##刷新grains或者重启minion
server2:
[root@server1 salt]# salt server2 grains.item roles
server2:
----------
roles:
- apache
salt-minion:
[root@server3 ~]# vim /etc/salt/grains
[root@server3 ~]# cat /etc/salt/grains
roles: nginx
[root@server3 ~]# systemctl restart salt-minion.service
salt-master:
[root@server1 salt]# salt server3 saltutil.sync_grains
server3:
[root@server1 salt]# salt server3 grains.item roles
server3:
----------
roles:
nginx
[root@server1 salt]# mkdir /srv/salt/_grains
[root@server1 salt]# cd /srv/salt/_grains
[root@server1 _grains]# vim my_grains.py
[root@server1 _grains]# cat my_grains.py
def my_grains():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'stack'
return grains
[root@server1 _grains]# salt server2 saltutil.refresh_modules
server2:
True
[root@server1 _grains]# salt server2 grains.item hello
server2:
----------
hello:
[root@server1 _grains]# salt server2 saltutil.sync_grains
server2:
- grains.my_grains
[root@server1 _grains]# systemctl restart salt-master.service ##重启服务
[root@server2 salt]# systemctl restart salt-minion
[root@server3 salt]# systemctl restart salt-minion
[root@server1 _grains]# salt -G 'roles:apache' test.ping
server2:
True
[root@server1 _grains]# salt -G 'roles:nginx' test.ping
server3:
True
在server2上查看模块是否载入
在target中匹配minion
修改top文件的匹配方式
[root@server1 _grains]# vim /srv/salt/top.sls
[root@server1 _grains]# cat /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache.install
'roles:nginx':
- match: grain
- nginx.service
默认情况下,master配置文件中的内容是被载入到每个minion的pillar中的。这使得master的配置文件可以作为所有minions的全局配置。
pillar和state tree的建立方式相似,由sls文件组成,并有一个top文件,这和state tree类似。pillar默认的路径是:/srv/pillar。
注意,pillar的位置可以通过master配置见中的pillar_roots配置项来自定义。
要来是建立pillar的话,我们需要/srv/pillar目录:
[root@server1 ~]# vim /etc/salt/master ##pillar_roots前面还有一个空格,顶格写会报错
828 pillar_roots:
829 base:
830 - /srv/pillar
[root@server1 _grains]# mkdir /srv/pillar
[root@server1 _grains]# systemctl restart salt-master
[root@server1 _grains]# cd /srv/pillar/
[root@server1 pillar]# mkdir web
[root@server1 pillar]# cd web/
[root@server1 web]# vim vars.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
[root@server1 pillar]# salt '*' saltutil.refresh_pillar
server3:
True
server2:
True
使用方法:
1.File状态使用template参数
- template: jinja
2.模板文件里面变量使用{
{ 名称 }}
{
{ PORT }}
3.变量列表
- defaults:
PORT: 80
以saltstack推送httpd服务为例
(1)添加监听主机和端口变量
[root@server1 files]# vim httpd.conf
Listen {
{ host }}:{
{ port }}
[root@server1 apache]# vim install.sls
[root@server1 apache]# cat install.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja
port: 80
host: 172.25.60.2
service.running:
- name: httpd
- reload: True
- watch:
- file: install-apache
将修改推送到server2中
salt server2 state.sls apache.install
vim install.sls
host: {
{ grains['ipv4'][-1]}}
salt server2 state.sls apache.install #推送
推送后配置文件中监听端口不变
在httpd.conf模板文件中设置
vim apache/install.sls
#host: {
{ grains['ipv4'][-1]}} #将该行注释掉
vim files/httpd.conf
Listen {
{ grains['ipv4'][-1] }}:{
{ port }}
推送后配置文件中监听端口不变
3.在pillar中取值
方法一:在install.sls文件设置变量,在pillar目录中定义变量的取值
vim apache/install.sls
host: {
{ pillar['ip'] }}
vim files/httpd.conf
Listen {
{ host }}:{
{ port }}
在/srv/pillar目录中设置pillar变量的取值
cd /srv/pillar/
vim web/vars.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
ip: 172.25.5.2
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
salt server2 state.sls apache.install 推送结果相同
方法2:直接在模板文件httpd.conf文件中设定变量
cd /srv/salt/apache/
vim install.sls
#host: {
{ pillar['ip'] }}
vim files/httpd.conf
Listen {
{ pillar['ip'] }}:{
{ port }}
salt server2 state.sls apache.install
salt server2 state.sls apache.install 推送结果相同
4.将端口设置为变量
vim apache/install.sls
#port: 80
vim apache/lib.sls
{% set port = '80' %}
vim files/httpd.conf
{% from 'apache/lib.sls' import port %}
salt server2 state.sls apache.install
salt server2 state.sls apache.install 推送结果相同