Akemi

Salt的pillar变量

2025/09/23

pillar是一个定义在全局的变量,并且可以分发给指定的minion,有点像group_vars和host_vars

与之相对的,grains就是局部的变量,但grains的特性就导致不适合存放敏感数据

  • 安全性:敏感数据(如密码、密钥、API令牌)不能写在所有Minion都能看到的State文件里。
  • 针对性:不同的Minion(服务器)需要不同的配置。例如,Web服务器需要数据库的连接地址,而数据库服务器本身不需要这个信息。
  • 灵活性:将数据与配置逻辑(State状态文件)分离,使States更通用,数据管理更灵活。

定义pillar变量

与salt状态文件使用方法类似,都需要在配置文件中定义其存放位置,并且可以区分出多环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat /etc/salt/master
...
pillar_roots:
base:
- /srv/pillar
...

mkdir -p /srv/pillar
systemctl restart salt-master.service

echo "web_package: httpd
dhcp_package: dhcp-server" > /srv/pillar/centos.sls
echo "web_package: apache2
dhcp_package: isc-dhcp-server" > /srv/pillar/ubuntu.sls

定义top.sls

top.sls是salt开发者定义的高级pillar文件,用来分配pillar文件中的变量是应用给哪些主机的

1
2
3
4
5
6
7
8
9
10
11
12
vim /srv/pillar/top.sls
base:
'minion[12]':
- centos
'minion3':
- ubuntu

前面进行主机名的匹配(支持正则)
-后面就是使用的pillar文件

针对minion1和2,应用centos.sls的pillar文件
针对minion3,应用ubuntu.sls的pillar文件

pillar模块的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
salt minion1 pillar.
pillar.data pillar.file_exists pillar.item pillar.ls
pillar.ext pillar.filter_by pillar.items pillar.obfuscate
pillar.fetch pillar.get pillar.keys pillar.raw

salt \* pillar.ls
minion3:
- web_package
- dhcp_package
minion1:
- web_package
- dhcp_package
minion2:
- web_package
- dhcp_package

salt \* pillar.items
minion3:
----------
dhcp_package:
isc-dhcp-server
web_package:
apache2
minion1:
----------
dhcp_package:
dhcp-server
web_package:
httpd
minion2:
----------
dhcp_package:
dhcp-server
web_package:
httpd

# 单独检索key只能在minion上检索
[root@minion1 ~]# salt-call pillar.item web_package
local:
----------
web_package:
httpd

使用pillar变量

我们直接使用jinja2进行引用

如果不使用pillar,这种区分就需要通过grains做条件判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /srv/salt/dev/dhcp.sls
install dhcp:
pkg.installed:
- name: {{ pillar.dhcp_package }}

salt \* state.sls saltenv=dev dhcp --summary
-------------------------------------------
Summary
-------------------------------------------
# of minions targeted: 3
# of minions returned: 3
# of minions that did not return: 0
# of minions with errors: 0
-------------------------------------------

改造之前的sls状态文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
重新编辑pillar文件
/srv/pillar/centos.sls
web_package: httpd
dhcp_package: dhcp-server
web_service: httpd

/srv/pillar/ubuntu.sls
web_package: apache2
dhcp_package: isc-dhcp-server
web_service: apache2

原本:
{% if grains.os_family == 'RedHat' %}
install httpd:
pkg.installed:
- name: httpd
start httpd:
service.running:
- name: httpd
- enable: yes
{% elif grains.os_family == 'Debian' %}
install apache:
pkg.installed:
- name: apache2
start apache:
service.running:
- name: apache2
- enable: yes
{% endif %}

现在:
vim /srv/salt/prod/web.sls
install web:
pkg.installed:
- name: {{ pillar.web_package }}
start web-service:
service.running:
- name: {{ pillar.web_service }}
- enable: yes

salt \* state.sls saltenv=prod web --summary
-------------------------------------------
Summary
-------------------------------------------
# of minions targeted: 3
# of minions returned: 3
# of minions that did not return: 0
# of minions with errors: 0
-------------------------------------------

CATALOG
  1. 1. 定义pillar变量
  2. 2. 定义top.sls
  3. 3. pillar模块的用法
  4. 4. 使用pillar变量