SaltStack States 状态特点
- 状态不能回滚
- 状态可以多次执行
SaltStack 状态文件
- SaltStack 的状态使用状态文件 SLS(SaLt State)来描述
- SLS 默认文件格式 YAML
- SLS 文件解析模式是从上往下
- Salt 最终执行的时候,将 SLS 解析成一个字典的格式
SLS 文件说明
SLS 文件包含名称 ID 声明、状态 State 声明、选项(或属性)声明。
其中名称 ID 声明默认作为 State 的 name 声明(没有指定 name 声明时)。
例子:
apache-install: # ID 声明
service.running: # State 声明
- name: httpd # 选项(或属性)声明
- enable: True
一个 ID 声明下面,状态模块不能重复,比如不能出现 2 个 file.managed 状态模块。
salt:// 指当前环境根目录。配置文件中指定如下:
file_roots:
base:
- /srv/salt
LAMP 架构 SLS 文件编写实例
分析 LAMP 架构部署配置所需状态模块:
- 安装软件包 pkg
- 修改配置文件 file
- 启动服务 service
pkg 状态模块常用方法
- pkg.installed 安装软件包 (pkgs 同时安装多个包)
- pkg.group_installed 安装软件包组
- pkg.latest 确认软件包为最新版本
- pkg.removed 卸载软件包
- pkg.purge 卸载并删除配置文件(会把软件包和配置文件都删除掉)
file 状态模块常用方法
- file.managed
service 状态模块常用方法
- service.running
LAMP 架构部署配置状态 SLS 文件编写
LAMP 架构部署配置 pkg file service 状态 SLS 编写过程如下:
cd /srv/salt/
mkdir lamp
cd lamp
cat > lamp.sls <<EOF
lamp-pkg:
pkg.installed:
- pkgs:
- httpd
- php
- mariadb
- mariadb-server
- php-cli
- php-mbstring
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://lamp/files/httpd.conf
- user: root
- group: root
- mode: 644
php-config:
file.managed:
- name: /etc/php.ini
- source: salt://lamp/files/php.ini
- user: root
- group: root
- mode: 644
mysql-config:
file.managed:
- name: /etc/my.cnf
- source: salt://lamp/files/my.cnf
- user: root
- group: root
- mode: 644
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
mysql-service:
service.running:
- name: mariadb
- enable: True
- reload: True
cd /srv/salt/lamp
mkdir files
cd files
cp /etc/httpd/conf/httpd.conf .
cp /etc/php.ini .
cp /etc/my.cnf .
salt 'linux-node2*' test.ping
salt 'linux-node2*' state.sls lamp.lamp
SLS 文件中状态之间的关系
状态之间有如下关系:
- 我依赖谁 require
- 我被谁依赖 require_in
- 我监控谁 watch(watch 包含 require)
- 我被监控谁 watch_in
- 我引用谁 include
- 我扩展谁
举例:
# require 例子
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- pkg: lamp-pkg
- file: apache-config
# require_in 例子
mysql-config:
file-managed:
- name: /etc/my.cnf
- source: salt://lamp/files/my.cnf
- user: root
- group: root
- mode: 644
- require_in:
- service: mysql-service
# watch 例子 (只要状态发生变化就做相应的操作)
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- pkg: lamp-pkg
- watch:
- file: apache-config
# 如果 apche-config 这个 ID 的状态发生变化就 reload,如果不加 reload=True 的话就 restart
使用了状态关系配置后,lamp.sls 文件内容如下:
lamp-pkg:
pkg.installed:
- pkgs:
- httpd
- php
- mariadb
- mariadb-server
- php-cli
- php-mbstring
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://lamp/files/httpd.conf
- user: root
- group: root
- mode: 644
php-config:
file.managed:
- name: /etc/php.ini
- source: salt://lamp/files/php.ini
- user: root
- group: root
- mode: 644
mysql-config:
file.managed:
- name: /etc/my.cnf
- source: salt://lamp/files/my.cnf
- user: root
- group: root
- mode: 644
- require_in:
- service: mysql-service
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- pkg: lamp-pkg
- watch:
- file: apache-config
mysql-service:
service.running:
- name: mariadb
- enable: True
- reload: True
编写 SLS 技巧
- 按状态分类,如果单独使用,很清晰
- 服务分类,可以被其他的 SLS include。例如 LNMP include mysql 的服务。
使用 include 改写 lamp.sls
cd /srv/salt/lamp/
# 分别将 pkg/config/service相关状态写到独立的文件中
[root@linux-node1 lamp]# cat pkg.sls
lamp-pkg:
pkg.installed:
- pkgs:
- httpd
- php
- mariadb
- mariadb-server
- php-cli
- php-mbstring
[root@linux-node1 lamp]# cat config.sls
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://lamp/files/httpd.conf
- user: root
- group: root
- mode: 644
php-config:
file.managed:
- name: /etc/php.ini
- source: salt://lamp/files/php.ini
- user: root
- group: root
- mode: 644
mysql-config:
file.managed:
- name: /etc/my.cnf
- source: salt://lamp/files/my.cnf
- user: root
- group: root
- mode: 644
- require_in:
- service: mysql-service
[root@linux-node1 lamp]# cat service.sls
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- pkg: lamp-pkg
- watch:
- file: apache-config
mysql-service:
service.running:
- name: mariadb
- enable: True
- reload: True
# 使用 include 包含以上 sls
cat > init.sls << EOF
include:
- lamp.pkg
- lamp.config
- lamp.service
EOF
salt 'linux-node2*' state.sls lamp.init