Salt Basic
importance
date
May 22, 2024
slug
Salt Basic
status
Published
tags
salt
jinja
summary
Salt的基本概念和使用方法
type
Post
1. what is Salt
The Salt system is a Python-based, open-source remote execution framework for configuration management, automation, provisioning, and orchestration.
可以理解salt是一个自动化的框架,可以对多台远程的主机进行操作,让这些机器执行预定的命令。
A basic Salt implementation consists of a Salt master managing one or more Salt minions.
salt采用的master/slave 的架构,分为master机器和其他minions机器。可以这样的架构非常简单。
salt官网放的架构,重要点就是一台master管理了多台的minion,minion可以有多个系统。
2. salt grains
Salt comes with an interface to derive information about the underlying system. This is called the grains interface, because it presents Salt with grains of information. Grains are collected for the operating system, domain name, IP address, kernel, OS type, memory, and many other system properties.
当salt启动的时候,其有一个grains机制,能够自动收集当前机器的底层信息,包括OS类型、域名、IP地址、内核、内存以及其他信息。
我跟倾向于认为grain就是一种Label,通过Label可以对minion进行过滤。
Salt通过grain,对OS类型为CentOS的机器发送test.version命令。
Salt同时也支持自定义grain,类似于自定义label。
grain只需要匹配上一个就行,这里minion01的roles有web app1 dev,因为app1能够匹配,所以minion01会被执行test.ping命令。
grains的优先级
- Default salt defined core grains.
- Custom grains in
/etc/salt/grains
on the minion.
- Custom grains in
/etc/salt/minion
on the minion.
- Custom grain modules in
_grains
directory on the master and synced to the minion.
3. Salt State
Salt states are used to deploy and manage infrastructure and to allow automation of recursive and predictable tasks.
我的理解Slat States 就是多个普通命令的组合,以在所有minion上达到相同的“状态“,例如都安装nignx。
Salt Master将State告知minion,minion通过渲染与编译之后,执行命令并最终呈现出一致的”状态“
3.1 SLS中的State structure
状态由以下几个组件定义:
- Identifier is the identifier declaration for the state section.标识符是状态部分的标识符声明。
- State is the name of the
state
module containing the function, such aspkg
.状态是包含函数的state
模块的名称,例如pkg
。
- Function is the function to call in the named module, such as
installed
.函数是要在命名模块中调用的函数,例如installed
。
- Name is the name of the state call, which is usually the name of the file to be managed or the name of the package to be installed.名称是状态调用的名称,通常是要管理的文件的名称或要安装的软件包的名称。
- Arguments are the arguments that the state function will accept.参数是状态函数将接受的参数。
一个典型的state可以简单描述为:
例如安装命令:
一个遗留的问题,如何使用这些salt module与function?或者说module和function是需要手动编写代码?
3.2 highstate
Salt State可以通过dict tree的组织形式,以合理组织workflow,例如:
一个salt项目可以有多个sls,表示执行不同的事件。随着state文件增多,不可能每次都对minion手动指定运行哪些state file。因此Salt使用
top.sls
与highstate
来对所有state 文件进行管理。top.sls
文件用于指定哪些minion执行何种state,通常与grain相结合:通过
highstate
来执行top.sls
4. jinja
关于jinja,我看到了一个非常优秀的博客,基本上解决了我对于jinja的困惑。
5. Pillar
Pillar与Grain其实很类似,它们都可以在jinja中当做变量,当时pillar是master告知minion的,而grain是minion回报给master的。
sls文件是jinja模版,但是渲染编译都是在minion侧,如果模版渲染时候需要一些secret,就需要master通过pillar告知minion。
pillar是在
top.sls
被定义,当时这个top.sls
与之前的state中的top.sls
位于不同的目录中,一个位于/srv/state/
一个位于/srv/pillar
中。定义pillar很简单,在yml文件中写键值对就行了。
使用pillar和grain一致。
6. Map files
在salt stack Formulas项目,state文件目录下通常有一个map.jinja,map.jinja可以认为是不加密的pillar,同时将数据data与state分离。
一个常见的map.jinja 文件,用于定义mysql配置。
salt['grains.filter_by']()
是salt的内置函数,根据grains进行过滤。merge=salt['pillar.get']('mysql:lookup')) %}
用于将当前的配置与pillar进行合并。可以在state的sls文件中,通过import使用。
如果minion是gentoo系统,就会使用gentoo的配置。
总结
Salt是一个自动化的同步工具,通过特定的语义为不同的机器达成相同的”状态“。gains是minion自己定义或者采集的数据,pillar是master下发给minion的数据,它们都可以在jinja中作为变量使用。
目前对salt的内置函数、module还是不熟悉,搭配着
Salt Stack Formulas
项目边学边看了。