pillar 存储位置:master端,数据类型:动态数据 ,数据采集方式:
在master端定义,指定给对应的minion。可以使用saltuitl.refresh_pillar刷新。
应用:存储master指定的数据。只有指定的minion可以看到。用于敏感数据保存。
通过一个例子来了解:
###salt '*' pillar.items
###默认是没有显示的,需在打开配置选项,我们演示完后,把这一项还原回来
###vim /etc/salt/master
###552行,pillar_opts: True
###重启服务/etc/init.d/salt-master restart
###再次执行salt '*' pillar.items 就会有显示啦
########################定义pillar数据#######################################
vim /etc/salt/master
打开下面三行:
pillar_roots:
base:
- /srv/pillar
保存退出
mkdir /srv/pillar
/etc/init.d/salt-master restart
#################################################################################
vim /srv/pillar/apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
##################################################################################
vim /srv/pillar/top.sls
base:
'*':
- apache
######################################################################################
salt '*' saltutil.refresh_pillar #刷新一下
salt '*' pillar.items
######################################pillar定位主机 ##############################
salt -I 'apache:httpd' test.ping
1、关于Pillar
Pillar:
存储位置:Master端
数据类型:动态数据
数据采集更新方式:
在Master端定义,指定给对应的Minion,可以用saltutil.refresh_pillar刷新
应用:存储Master指定的数据,只有指定的Minion可以看到。用于敏感数据保存
Pillar的使用Grains不同,需要手动设置。配置方法与State管理。需要先在master配置文件中定义pillar_roots.
同时,
默认情况下,master配置文件中的所有数据都添加到Pillar中,且对所有minion可用。如果要禁用这一默认值,可以在master配置文件中添加如下数据,重启服务后生效:
2、配置pillar
a)定义pillar_roots:
[root@master ~]#
vim /etc/salt/master
pillar_roots:
base:
- /etc/salt/pillar
[root@master ~]#
mkdir -p /etc/salt/pillar
b)定义top.sls:
[root@master ~]#
vim /etc/salt/pillar/top.sls
base:
'*':
- init.rsyslog
备注:所有的minion端都匹配init目录下的rsyslog.sls文件
默认情况下,master配置文件中的所有数据都添加到Pillar中,且对所有minion可用。
c)编辑Pillar下的SLS文件:
[root@master ~]#
mkdir -p /etc/salt/pillar/init
[root@master ~]# cd /etc/salt/pillar/init
[root@master init]#
vim rsyslog.sls
{% if grains['osfinger'] == 'CentOS-6' %}
syslog: rsyslog
{% elif grains['osfinger'] == 'CentOS-5' %}
syslog: syslog
{% endif %}
说明:这个是使用Jiajia模板定义的Pillar。同时使用了Grains来进行条件判断。
注意:key与value之间需要用冒号加空格分隔,没有空格的话会出现报错
d)刷新Pillar数据:
在master上修改pillar文件后,需要用以下命令刷新minion上的数据:
[root@master ~]#
salt '*' saltutil.refresh_pillar
node01.saltstack.com:
True
node02.saltstack.com:
True
[root@master ~]#
salt '*' pillar.item syslog
node01.saltstack.com:
----------
syslog:
rsyslog
node02.saltstack.com:
----------
syslog:
rsyslog
[root@master ~]#
salt '*' pillar.raw
node01.saltstack.com:
----------
syslog:
rsyslog
node02.saltstack.com:
----------
syslog:
rsyslog
使用pillar.raw查看的是目前正在使用的,存在于minion端的Pillar数据,使用pillar.items会刷新后重新加载的Pillar。所以你如果添加了Pillar,可以使用该方法查询。
[root@master ~]#
salt -I 'syslog:rsyslog' test.ping
node01.saltstack.com:
True
node02.saltstack.com:
True
[root@master ~]#
salt -I 'syslog:rsyslog' cmd.run 'df -h'
node02.saltstack.com:
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 14G 8.4G 4.5G 66% /
tmpfs 932M 12K 932M 1% /dev/shm
/dev/sda1 190M 42M 139M 23% /boot
/dev/sda3 2.0G 18M 1.8G 1% /tmp
node01.saltstack.com:
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 14G 8.4G 4.5G 66% /
tmpfs 932M 84K 932M 1% /dev/shm
/dev/sda1 190M 42M 139M 23% /boot
/dev/sda3 2.0G 18M 1.8G 1% /tmp
案例2:
[root@master init]# cd /etc/salt/pillar/
[root@master pillar]# mkdir -p packages
[root@master pillar]# cd packages/
[root@master packages]#
vim packages.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
git: git
{% elif grains['os'] == 'Debian' %}
apache: apache2
git: git-core
{% endif %}
[root@master init]# salt '*' grains.get os
node01.saltstack.com:
CentOS
node02.saltstack.com:
CentOS
[root@master packages]# cd ..
[root@master pillar]# ls
init packages top.sls
[root@master pillar]#
vim top.sls
base:
'*':
- init.rsyslog
- packages.packages
说明:
salt使用-I选项表示使用Pillar来匹配minion.
[root@master init]#
salt -I 'apache:httpd' test.ping
node01.saltstack.com:
True
node02.saltstack.com:
True
[root@master init]# salt -I 'git:git' test.ping
node02.saltstack.com:
True
node01.saltstack.com:
True
grains 存储位置minion端,数据类型:静态数据,数据采集更新方式:
minion启动时采集,也可以使用saltutil.sync_grains 进行刷新。
应用:存储minion基本数据,比如用于匹配minion,自身数据可以用来做资 产管理。
1、什么是Grains
Grains是SaltStack的一个组件,存放着minion启动时收集的底层系统的静态信息。Grains是存储在minion端的,当minion启动时,会进行Grains的采集工作,然后保存下来。在以后的生命周期(再次重启minion,会重新收集)是不会发生变化的,所以是静态数据。
Grains中包含诸如运行的内核版本、操作系统、CPU个数、内存、物理设备型号等信息。
数据采集更新方式:Minion启动时收集,也可以使用saltutil.sync_grains
2、Grains的应用场景
Grains可以在state系统中使用,用于配置管理模块。
Grains可以target中使用,在用来匹配Minion,比如匹配操作系统,使用-G选项。
Grains可以用于信息查询,Grains保存着收集到的客户端的详细信息。
3、Grains常用操作
a、列出Minion上所有可用的grains的名称
[root@master ~]#
salt '*' grains.ls
node02.saltstack.com:
- 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_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
- productname
- ps
- pythonexecutable
- pythonpath
- pythonversion
- saltpath
- saltversion
- saltversioninfo
- selinux
- serialnumber
- server_id
- shell
- virtual
- zmqversion
node01.saltstack.com:
- 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_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
- productname
- ps
- pythonexecutable
- pythonpath
- pythonversion
- saltpath
- saltversion
- saltversioninfo
- selinux
- serialnumber
- server_id
- shell
- virtual
- zmqversion
b、列出Minion上所有grains的的名称及内容
[root@master ~]#
salt 'node01.saltstack.com' grains.items
node01.saltstack.com:
----------
SSDs:
biosreleasedate:
07/02/2015
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
- msr
- pae
- mce
- cx8
- apic
- sep
- mtrr
- pge
- mca
- cmov
- pat
- pse36
- clflush
- dts
- mmx
- fxsr
- sse
- sse2
- ss
- syscall
- nx
- rdtscp
- lm
- constant_tsc
- up
- arch_perfmon
- pebs
- bts
- xtopology
- tsc_reliable
- nonstop_tsc
- aperfmperf
- unfair_spinlock
- pni
- pclmulqdq
- ssse3
- cx16
- pcid
- sse4_1
- sse4_2
- x2apic
- popcnt
- tsc_deadline_timer
- aes
- xsave
- avx
- f16c
- rdrand
- hypervisor
- lahf_lm
- ida
- arat
- epb
- pln
- pts
- dts
- fsgsbase
- smep
cpu_model:
Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
cpuarch:
x86_64
domain:
saltstack.com
fqdn:
node01.saltstack.com
fqdn_ip4:
- 10.10.10.141
fqdn_ip6:
gpus:
|_
----------
model:
SVGA II Adapter
vendor:
unknown
host:
node01
hwaddr_interfaces:
----------
eth0:
00:0c:29:98:68:91
lo:
00:00:00:00:00:00
pan0:
f6:aa:1f:cb:87:f0
id:
node01.saltstack.com
init:
upstart
ip4_interfaces:
----------
eth0:
- 10.10.10.141
lo:
- 127.0.0.1
pan0:
ip6_interfaces:
----------
eth0:
- fe80::20c:29ff:fe98:6891
lo:
- ::1
pan0:
ip_interfaces:
----------
eth0:
- 10.10.10.141
- fe80::20c:29ff:fe98:6891
lo:
- 127.0.0.1
- ::1
pan0:
ipv4:
- 10.10.10.141
- 127.0.0.1
ipv6:
- ::1
- fe80::20c:29ff:fe98:6891
kernel:
Linux
kernelrelease:
2.6.32-573.el6.x86_64
locale_info:
----------
defaultencoding:
UTF8
defaultlanguage:
en_US
detectedencoding:
UTF-8
localhost:
node01.saltstack.com
lsb_distrib_codename:
Final
lsb_distrib_id:
CentOS
lsb_distrib_release:
6.7
machine_id:
5bd0d598c3ad4f78b38c6e7600000020
manufacturer:
VMware, Inc.
master:
master.saltstack.com
mdadm:
mem_total:
1863
nodename:
node01.saltstack.com
num_cpus:
1
num_gpus:
1
os:
CentOS
os_family:
RedHat
osarch:
x86_64
oscodename:
Final
osfinger:
CentOS-6
osfullname:
CentOS
osmajorrelease:
6
osrelease:
6.7
osrelease_info:
- 6
- 7
path:
/sbin:/usr/sbin:/bin:/usr/bin
productname:
VMware Virtual Platform
ps:
ps -efH
pythonexecutable:
/usr/bin/python2.6
pythonpath:
- /usr/bin
- /usr/lib64/python26.zip
- /usr/lib64/python2.6
- /usr/lib64/python2.6/plat-linux2
- /usr/lib64/python2.6/lib-tk
- /usr/lib64/python2.6/lib-old
- /usr/lib64/python2.6/lib-dynload
- /usr/lib64/python2.6/site-packages
- /usr/lib64/python2.6/site-packages/PIL
- /usr/lib64/python2.6/site-packages/gst-0.10
- /usr/lib64/python2.6/site-packages/gtk-2.0
- /usr/lib64/python2.6/site-packages/webkit-1.0
- /usr/lib/python2.6/site-packages
- /usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info
pythonversion:
- 2
- 6
- 6
- final
- 0
saltpath:
/usr/lib/python2.6/site-packages/salt
saltversion:
2015.5.10
saltversioninfo:
- 2015
- 5
- 10
- 0
selinux:
----------
enabled:
False
enforced:
Disabled
serialnumber:
VMware-56 4d e6 9b 20 1f b4 60-77 5d 03 1d 1d 98 68 91
server_id:
1356238538
shell:
/bin/sh
virtual:
VMware
zmqversion:
3.2.5
c、查看虚拟化的类型
[root@master ~]#
salt '*' grains.get virtual
node01.saltstack.com:
VMware
node02.saltstack.com:
VMware
d、查询eth0所有IP地址
[root@master ~]#
salt '*' grains.get ip_interfaces
node01.saltstack.com:
----------
eth0:
- 10.10.10.141
- fe80::20c:29ff:fe98:6891
lo:
- 127.0.0.1
- ::1
pan0:
node02.saltstack.com:
----------
eth0:
- 10.10.10.142
- fe80::20c:29ff:fead:83d
lo:
- 127.0.0.1
- ::1
pan0:
e、查询eth0所有IP地址
[root@master ~]#
salt '*' grains.get ip_interfaces:eth0
node02.saltstack.com:
- 10.10.10.142
- fe80::20c:29ff:fead:83d
node01.saltstack.com:
- 10.10.10.141
- fe80::20c:29ff:fe98:6891
4、自定义grains
a)
在minion上的/etc/salt/minion直接配置grains
[root@node01 ~]#
vim /etc/salt/minion
grains:
roles: IT
dept: system
[root@master ~]#
salt -G 'roles:IT' test.ping
node01.saltstack.com:
True
[root@master ~]#
salt -G 'dept:system' test.ping
node01.saltstack.com:
True
b)
通过/etc/salt/grains进行定义
[root@node01 ~]#
vim /etc/salt/grains
virtual: openstack
[root@node01 ~]# /etc/init.d/salt-minion restart
Stopping salt-minion daemon: [确定]
Starting salt-minion daemon: [确定]
[root@node02 ~]#
cat /etc/salt/grains
virtual: xen
[root@node02 ~]#
/etc/init.d/salt-minion restart
Stopping salt-minion daemon: [确定]
Starting salt-minion daemon: [确定]
[root@master ~]#
salt -G 'virtual:xen' test.ping
node02.saltstack.com:
True
在minion端添加一个mysqlversion的信息
[root@node01 ~]#
cat /etc/salt/grains
virtual: openstack
mysqlversion: 5.5
测试,发现存在报错信息
[root@master ~]# salt -G 'mysqlversion:5.5' test.ping
No minions matched the target. No command was sent, no jid was assigned.
ERROR: No return received
使用saltutil.sync_grains进行刷新测试
[root@master ~]#
salt '*' saltutil.sync_grains
node02.saltstack.com:
node01.saltstack.com:
[root@master ~]#
salt -G 'mysqlversion:5.5' test.ping
node01.saltstack.com:
True
grains收集信息:
salt '*'
grains.ls
salt 'web13*'
grains.items
也可以单个显示
salt '*'
grains.item fqdn
salt '*'
grains.item server_id
salt '*'
grains.get ip_interfaces:eth0
grains匹配minion
#比如查看所有centos的机器上执行uptime命令:
salt -G os:centos cmd.run 'uptime'
web12.limingyu.com:
02:24:36 up 5:45, 1 user, load average: 0.06, 0.11, 0.08
web13.limingyu.com:
02:24:37 up 5:45, 1 user, load average: 0.19, 0.09, 0.06
#
自定义grains: vim /etc/salt/minion
#打下面几行
88 grains:
89 roles:
90 - webserver
91 - memcache
保存退出,重启minion
/etc/init.d/salt-minion restart
salt -G 'roles:memcache' cmd.run 'echo hehe'
或者
vim /etc/salt/grains
web: nginx
保存退出,重启minion
salt '*' grains.item web
web12.limingyu.com:
----------
web:
nginx
web13.limingyu.com:
----------
web:
salt -G web:nginx cmd.run 'echo hehe'
web12.limingyu.com:
hehe
在top.sls里匹配:
vim /srv/salt/top.sls
base:
'web:nginx' :
- match: grain
- apache
保存,重启服务
salt -G web:nginx cmd.run 'w'
pillar的数据是跟特定的minion关联的,可以用来传递minion自己的信息。管理员也可以自定义自己的pillar来对minion进行管理。
默认情况下,master配置文件中的所有数据都添加到Pillar中,且对所有minion可用。如果要禁用这一默认值,可以在master配置文件中添加如下数据,重启服务后生效:
pillar_opts: False
自定义Pillar数据
在Master的SLS文件中定义
假设使用默认pillar_roots配置 /srv/pillar
vim /srv/pillar/top.sls
## 编辑pillar 的 top.sls 文件添加下面内容
base :
'*':
- data
- git
dev :
'os:CentOs':
- git
vim /srv/pillar/data/init.sls
## 添加下面内容
roles:webserver
vim /srv/pillar/git.sls
## 添加下面内容
{% if grains['os'] == 'CentOs' %}
git: git
{% elif grains['os'] == 'Debian' %}
git: git-core
{% endif %}
pillar 跟sls一样拥有自己的
top.sls文件,通过top.sls文件作为入口,组织其它的pillar文件。
data定义了一个roles的值,如果不使用详细的data.init声明,
则默认会使用data下的init.sls作为声明文件,如果同时存在data.sls跟data/init.sls文件,则会优先使用data.sls文件来访问。
git是使用grains的系统类型来进行不同的pillar定义。
在master上修改Pilla文件后,需要用以下命令
刷新minion上的数据:
salt '192.168.0.100' saltutil.refresh_pillar
怎么使用Pillar ?
Targeting :
Salt使用-I 选项来使用
salt -I 'roles:webserver' test.ping
SLS文件中使用
需要根据系统环境安装一个git软件
vim /srv/salt/git_env.sls
## 添加下面内容
git :
pkg.installed:
- name : {{pillar['git']}}
## 或是添加成下面样式,设置默认的pillar值
git:
pkg.installed:
- name: {{ salt['pillar.get']('git', 'git') }
Minion ID : 每个minion都有独立的ID,
可以直接使用minion id 对对象进行操作,例如:
salt '192.168.0.100' test.ping
通配符(*): salt的匹配规则跟shell差不多,通配符的使用也跟shell的用法一样
## 匹配所有的minion
# salt '*' test.ping
## 匹配ID开头为192.168.0.的mimion
# salt '192.168.0.*' test.ping
## 匹配web1,web2,web3,web4,web5
# salt 'web[1-5]' test.ping
## 匹配web-x ,web-y, web-z
# salt 'web-[x-z]' test.ping
正则表达式
# 匹配id为web1-prod ,web1-devel 的minion
salt -E 'web1-(prod|devel)' test.ping
# 在state文件中也可以这么配置minion的匹配
base:
'web1-(prod|devel)':
- match: pcre
- webserver
列表方式匹配
对一些特殊要求的minion对象,也可以手动指定一系列ID作为目标
salt
-L 'web1,web21,web30' test.ping
Grains方式匹配
Grains 匹配是简单易用的操作方式,可以非常方便的对minion进行分类管理。
# 测试所有系统是CentOS的minion
salt
-G ’os:CentOS’ test.ping
# 查询CPU架构是x84的minion的CPU个数:
salt
-G ’cpuarch:x86_64’
grains.item num_cpus
在top.sls文件中使用grains匹配
'node_type:web':
-
match: grain
- webserver
'node_type:postgres':
-
match: grain
- database
Pillar进行匹配
# pillar的匹配方式跟grains差不多,不过key/value换成pillar对象
salt
-I 'somekey:specialvalue' test.ping
Node Group 匹配
节点分组匹配需要预先在top.sls文件中定义好minions的分组信息,例如可以在top.sls添加下面的group进行定义
nodegroups:
group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
group2: 'G@os:Debian and foo.domain.com'
备注:
L@开头表示分组使用列表匹配,G@开头表示分组使用grains匹配
# 可以使用这样在salt中调用分组
salt
-N group1 test.ping
# 在top.sls中可以使用下面定义来使用分组
base:
group1:
- match: nodegroup
- webserver
最后,有时候匹配到的minion会有很多,如果同时执行可能导致master直接挂机,所以salt很贴心得给了个分批执行的功能,例如下面的操作:
#
分10个minion一批进行执行,直到执行完毕
salt '*'
-b 10 test.ping
#
分成25%一批进行执行,直到执行完毕
salt
-G 'os:RedHat'
--batch-size 25% apache.signal restart
怎么运用Grains
第一种,
命令行中使用,salt 命令中使用grains
#对系统是CentOS的服务器进行ping测试操作
#os:CentOS ; 就是对应上面grains.items显示出来的os值是CentOs的对象进行匹配
salt
-G 'os:CentOS' test.ping
#对cpu架构是x86_64的服务器显示CPU的个数
salt
-G 'cpuarch:x86_64' grains.item num_cpus
#对字典值的对象进行匹配
salt
-G 'ip_interfaces:em1:192.168.0.*'
第二种,
在SLS中使用grains
# 在top.sls中使用grais
'os:CentOS':
-
match: grain
- webserver
上面是在top.sls中定义对系统是CentOs的服务器执行webserver.sls定义的状态信息.
进阶,自定义Grains
Grains的四种存在形式
Core grains.
在 /etc/salt/grains 自定义grains。
在 /etc/salt/minion 自定义grains。
在 _grains 目录自定义grain,同步到minions。
自定义的grains编写格式参考上面grains.items显示出来的格式
直接值对应
os:CentOS
字典格式
ip_interfaces: {'lo': ['127.0.0.1'], 'em1': ['192.168.0.100'], 'em2': []}
分多行值的列表格式
osmajorrelease:
6
5
Core Grains : 是salt定义好的grains,后面三种自定义的grains,如果名称跟Core grains定义的一样,将会覆盖掉Core grains定义的值.
/etc/salt/grains : 单独的grains来放置自定义的grains可以更加好的独立***。
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15
* 上面的内容定义了四个grain。 roles是一个列表,还有deployment,cabinet,cab_u三个值
* 需要重启minion才能生效
/etc/salt/minion : 这个的定义跟在/etc/salt/grains中的定义一样,只不过要多个grains的声明
grains :
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
cab_u: 14-15
* 需要重启minion才能生效
_grains 目录自定义grain :
假设使用默认的master 的file_roots配置路径 /srv/salt ,那么_grains的位置是/srv/salt/_grains
# mkdir /srv/salt/_grains
# vim /srv/salt/_grains/my_grain.py
## 添加下面内容
def my_grains():
grains = {'roles' : ['phpserver','webserver']}
return grains
# salt '192.168.0.100' saltutil.sync_grains
# salt '192.168.0.100' grains.item roles
这里是通过定以一个grains模块注入给minion一个roles信息。
如果查询grains.items roles无法查出相关信息,可以重启下master,再重新测试
下面给给出一个Core grains定义的一个例子,使用了比较复杂的方式来定义grains,更多的信息点击这里
saltutil.sync_grainsdef _windows_cpudata():
'''
Return some CPU information on Windows minions
'''
# Provides:
# num_cpus
# cpu_model
grains = {}
if 'NUMBER_OF_PROCESSORS' in os.environ:
# Cast to int so that the logic isn't broken when used as a
# conditional in templating. Also follows _linux_cpudata()
try:
grains['num_cpus'] = int(os.environ['NUMBER_OF_PROCESSORS'])
except ValueError:
grains['num_cpus'] = 1
grains['cpu_model'] = platform.processor()
return grains
分发自定义的grains到客户端
### 下面的三个操作均会将自定义的grains分发到192.168.0.100上
#salt '192.168.0.100' state.highstate
#salt '192.168.0.100' saltutil.sync_all
#salt '192.168.0.100' saltutil.sync_grains