Salt State 组件
为什么要引入 State
Remote execution is a big time saver, but it has some shortcomings. Most tasks you perform are a combination of many commands, tests, and operations, each with their own nuances and points-of-failure. Often an attempt is made to combine all of these steps into a central shell script, but these quickly get unwieldy and introduce their own headaches. To solve this, SaltStack configuration management lets you create a re-usable configuration template, called a state, that describes everything required to put a system component or application into a known configuration.
State 使用 YAML ,所以易读
States are described using YAML, and are simple to create and read.
YAML 简介
YAML 是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。它是类似于标准通用标记语言的子集 XML 的数据描述语言, 语法比 XML 简单很多。
Salt uses a simple language, called YAML, to describe configurations. This is what you need to know: YAML uses a fixed indentation scheme to represent relationships between data layers. Salt requires that the indentation for each level consists of exactly two spaces. Do not use tabs. A dash represents an item in a list. Key value pairs are represented by key: value
以上说了 YAML 的语法,有 3 个规则:
- 缩进(代表数据层级关系,2 个空格,并且不能使用 TAB 键,整个 SaltStack 里面都不能用 TAB 键)
- 冒号 :
- 跟缩进一起代表一个数据层级(以冒号结尾不用空格);
- 分隔键值对 [key: value] ,支持嵌套,冒号后面必须有一个空格
- 短横线 -(表示一个列表中的一个项目,- 后面必须有空格)
Salt 的配置文件是 YAML 语法。
编写 STATE 状态文件
1. 配置 Master file_roots
Salt 运行了一个使用 zeromq 编写的轻量级文件服务器,用于分发文件到 minions。这个文件服务器内建到 master 进程,它不需要一个专用的端口。
这个文件服务器工作在传递给 master 的环境上,每个环境可以有多个根目录。 一个 base 环境是必需的,里面放置 top file.
例子:
# Example:
# file_roots: # 配置项
# base: # 配置 base 环境
# - /srv/salt/ # 可以写多个,是一个列表,base 环境的根路径
# dev:
# - /srv/salt/dev/services
# - /srv/salt/dev/states
# prod:
# - /srv/salt/prod/services
# - /srv/salt/prod/states
file_roots:
base:
- /srv/salt
# 配置完成 master 的 file_roots 后,要重启 master
systemctl restart salt-master
2. 编写一个 STATE 状态文件
# 创建 base 环境的目录
mkdir /srv/salt -p
cd /srv/salt
mkdir web
cd web
# 编写一个描述 apache 状态的状态文件
cat >> apache.sls << EOF
apache-install: # 状态声明 ID,每一个 ID 就是一个配置项
pkg.installed: # 这里面的模块可以是内置的状态模块,也可以是自定义的状态模块
- names:
- httpd
- httpd-devel
apache-service:
service.running:
- name: httpd
- enable: True
EOF
# 一个 Salt 状态可以使用单个的 SLS 文件(一个 SLS 文件就定义了一个状态),或者使用一个目录。后者更加灵活方便。
# 上面例子中 apache-install 是定义的状态声明 ID,pkg 是一个状态模块,模块分为执行模块和状态模块,
installed 是模块中定义的函数方法
# Salt 有很多的模块,它们都放在 /usr/lib/python2.7/site-packages/salt/modules 下,
而 pkg.py 是放在 /usr/lib/python2.7/site-packages/salt/states 目录下的,所以说它是一个状态模块
3. 执行状态模块
salt ‘*’ state.sls web.apache
state 是一个模块(/usr/lib/python2.7/site-packages/salt/modules/state.py),sls 是它的一个方法,它的作用就是 Execute the states in one or more SLS files,这些状态文件是放在环境下的,并且这些状态文件里面会调用 state 的状态模块(/usr/lib/python2.7/site-packages/salt/states)。
/var/cache/salt/minion 是一个很重要的目录,一般 master 把文件发给 minion 并放在这个目录下, minion从上往下加载
4. 通过 top.sls 来有选择的执行状态文件
top 文件也是 sls 结尾,也是 YAML 格式。它放在 base 环境下。
```bash
The state system uses a “top” file to tell the minions what environment to
use and what modules to use. The state_top file is defined relative to the
root of the base environment as defined in “File Server settings” below.
state_top: top.sls
top file 的实质就是告知状态应用到哪些 minion 上(告诉 minion 使用什么环境和什么模块)。
cat > top.sls «EOF base: ‘linux-node1.example.com’: - web.apache ‘linux-node2.example.com’: - web.apache EOF
执行高级状态 highstate
salt ‘*’ state.highstate
生产中不建议用 * ,然后要先在测试模式运行,salt ‘*’ state.highstate test=True