salt minion的高级配置及grains

目录
  1. 配置masterless minion
  2. 在minion上配置grains
  3. 从minions拉取master上的配置

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

前两篇文章学习了salt的state、pillar和top文件的应用,本篇学习一下salt minions的其它配置,包括如何配置masterless的minion,如何配置grains以及在minions上直接执行salt命令。

配置masterless minion

salt有一种配置方式允许minions运行在没有master的模式下。在这种情况下minion充当它自己的master。这是通过将配置文件/etc/salt/minion中的file_client参数从remote改为local实现的。改为local后,还需要配置本地的存储states和pillars的路径。具体操作如下:
首先在/etc/salt/minion.d文件夹中添加文件file_client.conf,file_roots.conf和pillar_roots.conf:

file_client.conf
1
file_client: local

值local允许minion从本地文件系统中查找states和pillars。

file_roots.conf
1
2
3
4
5
file_roots:
base:
- /opt/salt/base
development:
- /opt/salt/development

pillar_roots.conf
1
2
3
4
5
pillar_roots:
base:
- /opt/salt/pillar/base
development:
- /opt/salt/pillar/development

上面这两个文件设置了states和pillars在本地的存储位置,与master上的配置类似,states和pillars的配置要放在这两个文件定义的位置里。配置完成后需要重启minion。

[root@centos7-B minion.d]# systemctl restart salt-minion

下面测试一下上面的配置。在/opt/salt/base创建一个名为user-wilma.sls的文件,内容如下:

user-wilma.sls
1
2
3
4
5
6
user_wilma:
user.present:
- name: wilma
- fullname: Wilma Flintstone
- uid: 2002
- home: /home/wilma

使用下面的命令检查此state:

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
[root@centos7-B base]# salt-call state.show_sls user-wilma
[INFO ] Loading fresh modules for state activity
[INFO ] Fetching file from saltenv 'base', ** done ** 'user-wilma.sls'
local:
----------
user_wilma:
----------
__env__:
base
__sls__:
user-wilma
user:
|_
----------
name:
wilma
|_
----------
fullname:
Wilma Flintstone
|_
----------
uid:
2002
|_
----------
home:
/home/wilma
- present
|_
----------
order:
10000

应用state到本地:

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
[root@centos7-B base]# salt-call state.sls user-wilma
[INFO ] Loading fresh modules for state activity
[INFO ] Fetching file from saltenv 'base', ** skipped ** latest already in cache 'salt://user-wilma.sls'
[INFO ] Running state [wilma] at time 14:50:51.175126
[INFO ] Executing state user.present for wilma
[INFO ] Executing command ['useradd', '-u', '2002', '-m', '-d', '/home/wilma', 'wilma'] in directory '/root'
[INFO ] Executing command ['usermod', '-c', 'Wilma Flintstone,,,', 'wilma'] in directory '/root'
[INFO ] {'shell': '/bin/bash', 'workphone': '', 'uid': 2002, 'passwd': 'x', 'roomnumber': '', 'groups': ['wilma'], 'home': '/home/wilma', 'name': 'wilma', 'gid': 2002, 'fullname': 'Wilma Flintstone', 'homephone': ''}
[INFO ] Completed state [wilma] at time 14:50:51.540919
local:
----------
ID: user_wilma
Function: user.present
Name: wilma
Result: True
Comment: New user wilma created
Started: 14:50:51.175126
Duration: 365.793 ms
Changes:
----------
fullname:
Wilma Flintstone
gid:
2002
groups:
- wilma
home:
/home/wilma
homephone:
name:
wilma
passwd:
x
roomnumber:
shell:
/bin/bash
uid:
2002
workphone:
Summary
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1

可见,这种配置在没有master的情况下,minion自己充当master,只是将master上的salt命令换成了minions上的salt-call命令,其它用法与在master上操作完全一致。上面是使用的state.sls将特定的state应用到本地,如果写了top.sls文件,可以像在master上一样,使用state.highstate来引用top文件里规定的states。

在masterless minion的配置中,也可以不指定file_client为local,这样在使用salt-call命令时需要加上命令行参数--local,其效果与将file_client配置为local的效果相同。不过当在配置文件中指定了file_client为local后,salt master就不能再连接上此minion,使用时一定要注意

在minion上配置grains

在salt中,grains是存储在minions上的关于系统属性的一些信息,它可以帮助salt根据这些信息选择目标minions,通常它用来存储相对静态的数据。默认情况下,salt提供了许多grains信息,包括os、cup、内存、机器名等。然而我们也可以在minions上配置定制的grains信息,例如机器位置、服务器类型、应用程序名称、数据库等,这些定制信息使grains更加符合我们的需要。
有多种方法可以配置grains。首先可以在minion的默认配置文件/etc/salt/minion中配置;也可以将grains配置在一个单独的文件/etc/salt/grains中。无论哪种配置,grains都是以YAML键值对的形式配置的。这里我们以在/etc/salt/grains文件中配置grains举例:

grains
1
2
3
environment: development
location: datacenter1
server_type: webserver

grains是为了存储静态信息的,如果grains的信息发生了变动或新的grains添加进来,必须要刷新minion来使master得到这些新的数据。这可以通过执行模块完成,不过现在直接重启salt-minion daemon就可以是这些新的数据可用。

[root@centos7-B salt]# systemctl restart salt-minion

在master上通过命令grains.item得到grains的相关信息:

1
2
3
4
5
6
7
8
9
[root@centos7-A ~]# salt '*' grains.item environment location server_type
minion:
----------
environment:
development
location:
datacenter1
server_type:
webserver

也可以通过grains.items得到某个minion的所有grains:

[root@centos7-A ~]#  salt '*' grains.items
...

从minions拉取master上的配置

前两篇文章都是在master上通过salt命令将state推送到minions上,state也可以在minion上通过salt-call命令从master上拉取过来。可以使用下面的命令:

[root@centos7-B ~]# salt-call state.highstate

这里使用了只存在于minion上的salt-call命令,调用了state.highstate执行模块。然后minion将系统中所有需要的数据从master上缓存到本地,最后根据top.sls中的规则将特定环境下符合minion目标的特定state应用到本地。也可以使用另外一种方法应用某个state:

[root@centos7-B ~]# salt-call state.sls user saltenv=development

这里仍然使用只存在于minion上的salt-call命令,但是使用了另外一个state.sls的执行模块,它可以指定应用某个特定的state(这里是名为user的state)到此minion上,最后的saltenv指定了state文件在master上的存放位置。如果不提供saltenv参数,系统会到base环境下寻找相关的state文件。
上面的命令是在minion上拉取了master上的state配置,然后应用到本地。salt-call命令还可以从master上拉取pillar数据:

[root@centos7-B ~]# salt-call pillar.get dev_user
local:
    ----------
    comment:
        Thomas
    name:
        thomas
    password:
        $1$PG1inys0$kB2I83KzEVzVs9G7xLHjA1
    uid:
        2001

可以将salt命令与salt-call命令进行类比,它们非常类似,最大的不同就是salt命令只存在于master主机上,而salt-call命令只存在于minion主机上。

本篇学习了salt minion的高级配置及grains,下篇看一下如何在state中使用grains数据。