salt的环境、pillar和states
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处: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文件:
类似得,创建pillar的相同的四个环境,然后创建用于存储pillar文件的目录:
[root@centos7-A ~]# mkdir -p /opt/salt/pillar/{base,production,staging,development}
同样也在/etc/salt/master.d/文件夹中创建pillar_roots.conf文件:
配置完成后需要重启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文件:
如果想添加多个用户的数据到同一个pillar文件中,可以使用下面的格式:
在/opt/salt/pillar/development/文件夹下创建top.sls文件:
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文件:
创建state时有几点需要注意:
- state文件的格式为yaml格式,后缀为sls(Salt State File)。
- 可以在salt定义的环境文件夹下(例如根据前面的配置,development环境的文件夹为/opt/salt/development)创建新文件夹,新文件夹的名字即为state的名称(这里创建了user文件夹,此state的名称即为user)。在新创建的user文件夹下创建init.sls文件,此文件是state的定义文件。
- 也可以直接在salt定义的环境文件夹下创建一个sls文件,此文件的名称即为state的名称(在state非常简单只有一个文件时可以这样使用)。
- sls文件的第一行为资源的名称,应该在此minion上的整个state名称空间上唯一,可以通过此名称引用该资源。
- sls文件的第二行为内置的state模块名。这里模块为user,函数为present。
- 在state中可以通过如下方式引用pillar的数据:1{{ pillar[<first_key>][<second_key>]... }}
注意在引用中pillar数据时,pillar的文件夹名(这里是/opt/salt/pillar/development/user)并没有使用到。而是通过在文件中找到的第一个yaml键值开始的(这里是dev_user),后面跟着第二个键值。另外需要注意的是,在一个minion的同一环境中,第一个键值必须唯一(就是说如果创建了另外一个pillar定义文件,该文件中的第一个key不能是dev_user了)。
还有另外一种引用pillar数据的方式:
这里使用salt关键字代替了pillar关键字,表示使用salt的pillar.get函数。然后来看括号中的部分:要使用的pillar文件中某个key可以写为
另外,一个pillar文件中可以通过
include
关键字包含另外一个pillar文件中的所有数据。也可以在salt命令行中通过pillar关键字设置pillar数据的内容:
salt ‘*’ state.sls user saltenv=development \
pillar=’{“qa_user”: “qa-deploy-user”}’
下面通过命令验证一下这个名为user的state的内容:
将states应用到minion上
可以通过如下命令将state应用到minions上:
上面的salt命令的一般格式为:
salt minions的目标(这里是minion) 模块名.函数名(这里是state.sls) state名(这里是user) \
saltenv=环境名(这里是development)
如果没有加saltenv命令行选项,默认的环境为base(也可以在/etc/salt/minion中配置为其它环境)。
本篇探索了salt的对于不同环境提供不同的配置文件的方式,定义了pillar数据文件和state文件,并将state应用到某个特定的minion上。下篇研究一下应用state到minions上的另外一种方式,使用top文件。