Akemi

Salt静态信息grains

2025/09/22

grains和ansible的facts变量差不多,但facts是ansible管理节点动态收集的信息

而grains是记录在minion本地的静态信息,会被minion定期收集,master可以随时收集grains信息,以key-value的形式存放

grains模块的用法

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
salt 'minion1' sys.list_functions grains
minion1:
- grains.append
- grains.delkey
- grains.delval
- grains.equals
- grains.fetch
- grains.filter_by
- grains.get # 常用
- grains.has_value
- grains.item # 常用
- grains.items # 常用
- grains.ls # 常用
- grains.remove
- grains.set
- grains.setval
- grains.setvals

列出可以查看的信息
salt 'minion1' grains.ls
minion1:
- biosreleasedate
- biosvendor
- biosversion
- cpu_flags
- cpu_model
...

查看所有grains的值,和打印facts变量其实差不多
salt 'minion1' grains.items --out=json
minion1:
{
"minion1": {
"cwd": "/",
"ip_gw": true,
"ip4_gw": "10.163.2.200",
"ip6_gw": false,
"dns": {
"nameservers": [
"114.114.114.114"
],
"ip4_nameservers": [
"114.114.114.114"
],
"ip6_nameservers": [],
"sortlist": [],
"domain": "",
"search": [],
"options": []
},
"fqdns": [],
"machine_id": "e16b33fe874b4eba9fec3d3b8b3bdda2",
"master": "salt",
...

查看单个grains的key value值
salt 'minion1' grains.item ip_interfaces
minion1:
----------
ip_interfaces:
----------
bond0:
eth0:
- 10.163.2.128
- fe80::f7c1:e6d6:13f4:d28d
eth1:
eth2:
eth3:
lo:
- 127.0.0.1
- ::1

通过json细化查看:
salt 'minion1' grains.item ip_interfaces:eth0
minion1:
----------
ip_interfaces:eth0:
- 10.163.2.128
- fe80::f7c1:e6d6:13f4:d28d
salt 'minion1' grains.item ip_interfaces:eth0:0
minion1:
----------
ip_interfaces:eth0:0:
10.163.2.128

利用grains筛选目标主机(远程执行模块)

使用-G参数,根据Minion的Grains信息来匹配和选择Minion

1
2
3
4
5
6
7
8
9
10
salt -G "os:Ubuntu" grains.item os
minion3:
----------
os:
Ubuntu
salt -G "os:Centos" test.ping
minion2:
True
minion1:
True

使用-C参数,进行复合匹配

1
2
3
salt -C 'G@os:Ubuntu and G@cpuarch:x86_64' pkg.upgrade
minion3:
True

使用-E参数,使用正则表达式进行匹配(默认)

1
2
3
4
5
6
7
8
9
salt -E 'minion[1-3]' test.ping
minion1:
True
minion3:
True
minion2:
True

salt '*' test.ping

使用-L参数,列表匹配目标主机

1
2
3
4
5
salt -L 'minion1,minion2' test.ping
minion2:
True
minion1:
True

利用grains筛选目标主机(状态管理模块)

可以使用j2模板

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
51
{% 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 %}

delete index:
file.absent:
- name: /var/www/html/index.html

set web content:
file.managed:
- name: /var/www/html/index.html
- contents: |
this is on {{ grains.os_family }} system
ip is {{ grains.ip4_interfaces.eth0.0 }}
- require:
- delete index

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

curl minion1
this is on RedHat system
ip is 10.163.2.128
curl minion2
this is on RedHat system
ip is 10.163.2.102
curl minion3
this is on Debian system
ip is 10.163.2.129

自定义grains

如果觉得grains信息不够,可以通过两种形式自定义grains

在master上使用grains方法直接定义

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
salt 'minion1' sys.doc grains.setval
CLI Example:
salt '*' grains.setval key val
salt '*' grains.setval key "{'sub-key': 'val', 'sub-key2': 'val2'}"

salt 'minion1' grains.setval system centos7.9

变量矩阵

设置多个字典作为key:
salt 'minion1' grains.setval sw "{"op1","op2","op3"}"
minion1:
----------
sw:
----------
op1:
None
op2:
None
op3:
None

设置多个值
salt 'minion1' grains.setval sw "{"op1": "an1","op2": "an2","op3": "an3"}"
minion1:
----------
sw:
----------
op1:
an1
op2:
an2
op3:
an3

设置多个键值对
salt '*' grains.setvals "{'key1': 'val1', 'key2': 'val2'}"

在minion上的grains文件中定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
刚刚在minion1上自定义的变量,会存储到对应节点的/etc/salt/grains中
[root@minion1 ~]# cat /etc/salt/grains
sw:
op1: an1
op2: an2
op3: an3
system: null

那么我们直接手工添加也可以
[root@minion2 ~]# echo "system: centos8.5" >> /etc/salt/grains

刷新方法
方法(1)[root@minion2 ~]# systemctl restart salt-minion.service
方法(2)[root@master ~]# salt 'minion2' saltutil.refresh_pillar

salt 'minion2' grains.item system
minion2:
----------
system:
centos8.5

删除自定义grains的方法

1
2
3
4
5
6
7
8
9
10
11
12
只会删value的值
salt '*' grains.delval key

删除key的方法
salt '*' grains.delkey key
salt 'minion1' grains.item system

[root@minion1 ~]# cat /etc/salt/grains
sw:
op1: an1
op2: an2
op3: an3
CATALOG
  1. 1. grains模块的用法
  2. 2. 利用grains筛选目标主机(远程执行模块)
  3. 3. 利用grains筛选目标主机(状态管理模块)
  4. 4. 自定义grains