salt的环境、pillar和states

目录
  1. 创建salt和pillar环境
  2. 创建pillar数据
  3. 创建states
  4. 将states应用到minion上

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

上篇我们进行了salt的安装和配置,本篇来探索一下如何进行Salt environment的配置,pillar路径的配置以及Salt states的配置。本篇的环境与上篇一致。

创建salt和pillar环境

理想的情况下,为了隔离代码和工作流程,基础设置应该包括开发、测试、QA及生产环境。salt通过提供定义states和pillar环境的选项来使我们可以实现不同环境的配置。通过主配置文件/etc/salt/master中的file_roots参数项,可以配置每个环境的名称和存储该环境配置文件的路径。
首先,要创建四个环境:base,production,staging,development,下面创建用于存储这四个环境配置文件的目录:

[root@centos7-A ~]# mkdir -p /opt/salt/{base,production,staging,development}

在/etc/salt/master.d/文件夹中创建file_roots.conf文件:

file_roots.conf
1
2
3
4
5
6
7
8
9
file_roots:
base:
- /opt/salt/base
production:
- /opt/salt/production
staging:
- /opt/salt/staging
development:
- /opt/salt/development

类似得,创建pillar的相同的四个环境,然后创建用于存储pillar文件的目录:

[root@centos7-A ~]# mkdir -p /opt/salt/pillar/{base,production,staging,development}

同样也在/etc/salt/master.d/文件夹中创建pillar_roots.conf文件:

pillar_roots.conf
1
2
3
4
5
6
7
8
9
pillar_roots:
base:
- /opt/salt/pillar/base
production:
- /opt/salt/pillar/production
staging:
- /opt/salt/pillar/staging
development:
- /opt/salt/pillar/development

配置完成后需要重启master来重新读入配置:

[root@centos7-A ~]# systemctl restart salt-master

上面的配置就完成了对salt环境和pillar环境的配置。

创建pillar数据

Pillar的作用是什么呢?Pillar可以用来存储类似于用户名和密码等数据,或者任何其它类型的数据,此数据可以在states中访问。pillar的数据是存储在master上的,可以存储针对于指定minion的数据。
下面就为development环境创建一个具体的pillar数据:

[root@centos7-A ~]# mkdir /opt/salt/pillar/development/user

在/opt/salt/pillar/development/user文件夹下创建init.sls文件:

init.sls
1
2
3
4
5
dev_user:
name: thomas
password: "$1$PG1inys0$kB2I83KzEVzVs9G7xLHjA1"
uid: 2001
comment: "Thomas"

如果想添加多个用户的数据到同一个pillar文件中,可以使用下面的格式:

init.sls
1
2
3
4
5
dev_user:
thomas:
password: "$1$PG1inys0$kB2I83KzEVzVs9G7xLHjA1"
uid: 1001
comment: "Thomas"

在/opt/salt/pillar/development/文件夹下创建top.sls文件:

top.sls
1
2
3
development:
'*':
- user

top.sls文件定义了哪个节点或minions可以访问哪个pillar数据。当states在minions上运行时,会检查此文件,这定义了某个特别的minion允许访问某个pillar文件中的内容。
第一行为环境名,如果没有指定默认为base环境。
第二行为minion目标,这里使用通配符表示所有minions,有多种方式可以指定minions的目标。
第三行引用了刚才创建的pillar文件夹的名字,如果只指定了文件夹名则实际的pillar内容由init.sls提供;如果在user文件夹下创建了另外一个名为devs.sls的文件,则此文件中的内容可以表示为user.devs
到这里pillar的数据文件便创建完毕了。如何访问呢?通过下面的命令:

[root@centos7-A development]# salt 'minion' pillar.items
minion:
    ----------
    dev_user:
        ----------
        comment:
            Thomas
        name:
            thomas
        password:
            $1$PG1inys0$kB2I83KzEVzVs9G7xLHjA1
        uid:
            2001

如果更改了pillar的数据,通常情况下minions会自动识别出更改后的pillar数据,不过如果minions并没有更新pillar数据的话,就需要手动刷新minions上的pillar数据,通过如下命令:

[root@centos7-A development]# salt '*' saltutil.refresh_pillar

pillar数据也可以在states中访问。下面就创建一个states。

创建states

在salt中,states是用来决定什么样的资源将要添加进入系统中。states使用salt内置的state模块,通过这些模块可以配置各种各样的系统资源,包括用户、组、文件、软件仓库、软件包、代码库、服务等。完整的state模块列表可以参考官方文档。然后,这些states可以根据不同的属性应用于特定的节点上。下面就在development环境中创建一个具体的state:

[root@centos7-A ~]# mkdir /opt/salt/development/user

在/opt/salt/development/user文件夹中创建init.sls文件:

init.sls
1
2
3
4
5
6
7
generic_user:
user.present:
- name: {{ pillar['dev_user']['name'] }}
- shell: /bin/bash
- home: /home/{{ pillar['dev_user']['name'] }}
- uid: {{ pillar['dev_user']['uid'] }}
- password: {{ pillar['dev_user']['password'] }}

创建state时有几点需要注意:

  1. state文件的格式为yaml格式,后缀为sls(Salt State File)。
  2. 可以在salt定义的环境文件夹下(例如根据前面的配置,development环境的文件夹为/opt/salt/development)创建新文件夹,新文件夹的名字即为state的名称(这里创建了user文件夹,此state的名称即为user)。在新创建的user文件夹下创建init.sls文件,此文件是state的定义文件。
  3. 也可以直接在salt定义的环境文件夹下创建一个sls文件,此文件的名称即为state的名称(在state非常简单只有一个文件时可以这样使用)。
  4. sls文件的第一行为资源的名称,应该在此minion上的整个state名称空间上唯一,可以通过此名称引用该资源。
  5. sls文件的第二行为内置的state模块名。这里模块为user,函数为present。
  6. 在state中可以通过如下方式引用pillar的数据:
    1
    {{ pillar[<first_key>][<second_key>]... }}

注意在引用中pillar数据时,pillar的文件夹名(这里是/opt/salt/pillar/development/user)并没有使用到。而是通过在文件中找到的第一个yaml键值开始的(这里是dev_user),后面跟着第二个键值。另外需要注意的是,在一个minion的同一环境中,第一个键值必须唯一(就是说如果创建了另外一个pillar定义文件,该文件中的第一个key不能是dev_user了)。
还有另外一种引用pillar数据的方式:

1
{{ salt['pillar.get']('dev_user:name', 'defaultuser') }}

这里使用salt关键字代替了pillar关键字,表示使用salt的pillar.get函数。然后来看括号中的部分:要使用的pillar文件中某个key可以写为:的形式,也就是[‘dev_user’][‘name’]写为’dev_user:name’的形式;如果这个key在pillar文件中不存在,则括号的后半部分也就是逗号的后面,给出了默认值,这里是defaultuser。

另外,一个pillar文件中可以通过include关键字包含另外一个pillar文件中的所有数据。也可以在salt命令行中通过pillar关键字设置pillar数据的内容:
salt ‘*’ state.sls user saltenv=development \
pillar=’{“qa_user”: “qa-deploy-user”}’

下面通过命令验证一下这个名为user的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
[root@centos7-A user]# salt \* state.show_sls user saltenv=development
minion:
----------
generic_user:
----------
__env__:
development
__sls__:
user
user:
|_
----------
name:
thomas
|_
----------
shell:
/bin/bash
|_
----------
home:
/home/thomas
|_
----------
uid:
2001
|_
----------
password:
$1$PG1inys0$kB2I83KzEVzVs9G7xLHjA1
- present
|_
----------
order:
10000

将states应用到minion上

可以通过如下命令将state应用到minions上:

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
[root@centos7-A development]# salt 'minion' state.sls user saltenv=development
minion:
----------
ID: generic_user
Function: user.present
Name: thomas
Result: True
Comment: New user thomas created
Started: 17:49:03.759470
Duration: 260.155 ms
Changes:
----------
fullname:
gid:
2001
groups:
- thomas
home:
/home/thomas
homephone:
name:
thomas
passwd:
x
password:
XXX-REDACTED-XXX
roomnumber:
shell:
/bin/bash
uid:
2001
workphone:
Summary
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1

上面的salt命令的一般格式为:

salt minions的目标(这里是minion) 模块名.函数名(这里是state.sls) state名(这里是user) \
saltenv=环境名(这里是development)

如果没有加saltenv命令行选项,默认的环境为base(也可以在/etc/salt/minion中配置为其它环境)。

本篇探索了salt的对于不同环境提供不同的配置文件的方式,定义了pillar数据文件和state文件,并将state应用到某个特定的minion上。下篇研究一下应用state到minions上的另外一种方式,使用top文件。