一、grains和pillar介绍
1. Grains简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端。当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
(1)信息查询,可用作CMDB
(2)在target中使用,匹配minion
(3)在state系统中使用,配置管理模块
2. Pillar介绍
pillar和grains一样也是一个数据系统,但是应用场景不同。pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。pillar更加适合在配置管理中运用。
二、Grains取值
1. 查询minion端的IP、FQDN等信息
salt server2 grains.ls #默认可用的grains
salt server2 grains.items #查看每一项的值
salt server2 grains.item os #取单项的值
salt server2 grains.item fqdn
salt server2 grains.item nodename
2. 自定义grains项
在server2中通过/etc/salt/minion配置文件设置roles
(1)在minion端写入roles
vim /etc/salt/minion
grains:
roles:
- apache
systemctl restart salt-minion
(2)在master端进行测试,查看自定义roles
salt server2 grains.item roles
在server3中通过grains文件设置roles
(1)设置grains文件
cd /etc/salt/
vim grains
roles:
- nginx
(2)在server1端查看roles自定义项
salt server3 grains.item roles
salt server3 saltutil.sync_grains #同步数据
3. 在salt-master端创建_grains目录,编写grains
mkdir /srv/salt/_grains
vim my_grains.py
def my_grains():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'stack'
return grains
salt server2 saltutil.refresh_modules
salt server2 grains.item hello
salt server2 saltutil.sync_grains #同步模块到minion端
在server2中查看模块是否加入
cd /var/cache/salt
tree .
4. 在target中匹配minion
salt -G 'roles:apache' test.ping #匹配minion
salt -G 'roles:nginx' test.ping
在top文件中匹配自定义项
vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache.install
'roles:nginx':
- match: grain
- nginx.service
salt -G "os:RedHat" test.ping
三、Pillar取值
1. 声明pillar,在配置文件中定义pillar基础目录
vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
mkdir /srv/pillar
systemctl restart salt-master
cd /srv/pillar/
mkdir web
vim web/vars.sls #自定义pillar项
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
vim top.sls
base:
'*':
- web.vars
salt '*' saltutil.refresh_pillar #刷新pillar数据
查询pillar项
salt '*' pillar.items #查询所有的pillar项
salt server2 pillar.item webserver #查询某一minion端的pillar项
salt server3 pillar.item webserver
四、jinja模板在服务中的应用(httpd为例)
1. 安装文件中定义变量的取值
(1)修改apache目录中的安装文件sls(添加jinja模板)
cd /srv/salt/apache
vim 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.5.2
service.running:
- name: httpd
- reload: True
- watch:
- file: install-apache
(2)修改files目录下的模板文件httpd.conf(主机和端口设置为变量)
vim files/httpd.conf
Listen {
{ host }}:{
{ port }}
(3)将修改推送到server2中
salt server2 state.sls apache.install
2. 通过grains取主机ip值
方法一:
(1)修改apache的安装文件install.sls
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
方法二:直接在模板文件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
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