SLS编写规范


规范要点说明

首先,状态的执行不可回滚,执行完了就是执行完了,并不会中断回滚,其次,状态的执行,可以反复执行,也就是说一个状态文件,可以多次来进行调用。

在编写状态文件过程中,有以下几点需要注意的:

  • 在一个sls状态文件中,任务ID必须要唯一,也许在一个sls状态文件中,有多个任务,但是要保证每个任务的ID必须是唯一的,最好的是能做到整个状态文件执行的时候,是唯一的;因为在进行状态间关系判断的时候,都是基于模块+任务ID的方式进行判断的,并不会判断到该模块下的方法;
  • 在同一个任务ID下,一个模块,只能调用一次,不允许出现多次,虽然一个模块下有多个方法,但是也只能调用一次该模块,进而就是说只能使用该模块的一种方法;
  • 严格按照YAML的格式,编写状态文件;
  • 尽量将一个多功能的整体模块,拆分成多个专用专用功能的单独模块,保证每个状态文件,只是单一的实现某一个功能,在其他的时候能够进行相互调用;
  • 按照应用程序和功能不同,层次化的组织功能状态文件和模块。

下面就说一下在状态文件中的几个部分。

程序安装pkg

[root@master /srv/salt/base/web/apache]# cat apache.sls
apache-installed:
pkg.installed:
- names:
- httpd
- httpd-devel

这是一个简单的apache安装的状态模块,其中:

  • apache-installed:就是这个状态文件的一个任务ID,唯一代表这个任务的,自定义随便编写,只是要能代表这个任务就行,没有什么特殊的含义。
  • pkg.installed:是指调用pkg模块下的installed方法,这个和python中的模块调用方式一样的,使用.来进行选择。
  • 第三行开始,是一个字典的值,-names表示安装的参数,属性值,和后面组成的一个列表,name是键,列表是值,值是httpd和httpd-devel。

其实在状态文件的编写过程中,可以直接将names里面的字段就直接写成任务ID,由于上面的是一下安装两个软件,所以就可以写成两段。如下所示:

httpd:
pkg.installed
httpd:
pkg.installed

这个看上去就很简单,两个任务,组成一个状态文件,每个任务都是调用的pkg模块的installed方法。任务ID+模块,形成一个字典,而在模块里面,可以是列表,可以是字典,也可以直接就是值。

常用的模块有三个,pkg、file和service模块。一般在部署的时候都会用到这三个模块,分别对应的是软件安装、配置文件管理、状态服务管理,提供的功能都是单独的,所以在编写的时候,尽量将三个模块分开来写。

文件管理file

文件管理模块,在软件配置管理中很有用,通常就是将一些通用性的文件,放在master上,然后直接分发到所有相关的minion上,比普通的cp高效的多,salt-cp可以直接将master上的指定文件(不能是文件目录)拷贝到minion上,file文件管理,也只能对文件进行操作,不能对目录进行操作,对目录的操作,还是用scp等相关命令来操作吧。

对于httpd服务,最关键的文件,就是/etc/httpd/conf/httpd.conf文件,一个基本的file文件管理模块,就是在master上的存放一个httpd.conf文件,然后制定给其他minion。

apache-file:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/web/apache/httpd.conf
- backup: minion
- user: root
- group: root
- mode: 644

上面就是编写的一个apache配置文件管理的状态文件:

  • apache-file:是该状态模块的任务ID
  • file.managed:是指调用file模块中的managed方法,下面的都是该方法需要用到的参数,以字典的形式传参进去
  • name:表示的是该文件要存放在minion的路径,可以和任务ID通用,可以直接将name后面的值作为任务ID
  • source:表示的该文件,在master上存放的位置,其中salt://是固定格式,代指的是该状态文件所处的环境env,也就是base或者是prod对应的file_root目录,这里是base环境,所以使用的目录是/srv/base,后面的路径就是在该目录下的路径
  • root和group:表示该文件的属主和属组,权限的定义
  • mode:是指该文件的权限,644是一般文件的普通权限
  • backup:表示的是在minion上,对更新前的文件进行备份,备份的路径在/var/cache/salt/minion下

以上就是一个简单的文件管理的模块,使用该模块,就能将master上的文件,传递到指定的minion上。

服务管理service

在有了程序安装和配置文件管理之后,剩下的就是对程序的运行进行定义了,无非就是开机是否启动,现在是否运行等相关的配置。

apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
  • apche-service:表示的是该任务的任务ID
  • service.running:表示的是调用service模块,running 方法,下面的都是该方法需要的参数
  • name:表示该服务的名称,是在/etc/init.d/下的软连接名称,也就是service名称,意思是启动该服务
  • enable:表示该服务开机启动
  • reload:当出现要求时,reload该服务,如果不定义该字段,要求是重启该服务,restart

状态间关系

在之前定义的那些状态模块之间,有些状态模块,是要依赖于其他状态模块的执行,或者根据其他状态模块的变更,影响本模块的执行。模块状态之间的关系,主要有以下的几种:

  • Require:本模块的执行,需要其他状态模块已经执行完成,比如服务状态模块的运行,需要先有程序安装状态
  • require_in:本模块的执行,被其他状态模块执行所依赖,和require是一个相反的关系
  • watch:监控,本模块的执行,监控其他状态模块是否执行,如果其他状态模块出现变更,对应的要按照本状态模块定义的方式,执行本状态模块
  • watch_in:被模块的执行,被其他状态模块所监控,本状态模块的执行,会影响其他状态模块
  • include:包含,在本状态模块中,包含了其他的状态模块,按照顺序,执行其他的状态模块,新更新的saltstack中不再按照状态模块的编写顺序来执行,只要有,就可以
  • unless:除非,只有当条件状态模块不成立时,才会执行本状态模块,比如软件安装,当软件已经安装时,就不执行软件安装模块,当软件未安装时,才会执行该状态模块
  • only:只有当后面的状态成立时,才会执行本状态模块

因为有以上的几种状态间关系,按照状态模块编写的规范,将一个apache的安装、配置和服务管理,分别拆分成三个状态模块,然后用一个状态模块include这三个状态模块,在执行的时候,只要执行这一个状态模块就可以了。

所以,一个apache的安装、配置和启动过程,可以编写成如下的状态文件。

[root@master ~]# cd /srv/salt/base/
[root@master /srv/salt/base]# ls
files web
[root@master /srv/salt/base]# cd web/
[root@master /srv/salt/base/web]# ls
apache-configuration-file.sls apache-install.sls apache_new.sls apache-service.sls apache.sls
[root@master /srv/salt/base/web]# cat apache-install.sls
apache-install:
pkg.installed:
- names:
- httpd
- httpd-devel
[root@master /srv/salt/base/web]# cat apache-configuration-file.sls
apache-configuration-file:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://files/web/apache/httpd.conf
- backup: minion
- user: root
- group: root
- mode: 644
[root@master /srv/salt/base/web]# cat apache-service.sls
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- pkg: apache-install
- file: /etc/httpd/conf/httpd.conf
- watch:
- file: /etc/httpd/conf/httpd.conf

include文件如下。最后要执行的状态文件,也就是这个web.apache,因为是要和base路径相比,所以写全路径。:

[root@master /srv/salt/base/web]# cat apache.sls
include:
- web.apache-install
- web.apache-configuration-file
- web.apache-service

开始直接调用该状态模块。

[root@master /srv/salt/base/web]# salt '192.168.64.151' state.sls web.apache test=True
192.168.64.151:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: None
Comment: The following packages would be installed/updated: httpd
Started: 17:36:45.757830
Duration: 1100.791 ms
Changes:
----------
ID: apache-install
Function: pkg.installed
Name: httpd-devel
Result: None
Comment: The following packages would be installed/updated: httpd-devel
Started: 17:36:46.858907
Duration: 36.992 ms
Changes:
----------
ID: apache-configuration-file
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: None
Comment: The file /etc/httpd/conf/httpd.conf is set to be changed
Started: 17:36:46.903774
Duration: 53.369 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: None
Comment: Service httpd not present; if created in this state run, it would have been started
Started: 17:36:46.962406
Duration: 23.148 ms
Changes: Summary for 192.168.64.151
------------
Succeeded: 4 (unchanged=4)
Failed: 0
------------
Total states run: 4
Total run time: 1.214 s
[root@master /srv/salt/base/web]#

直接运行

[root@master /srv/salt/base/web]# salt '192.168.64.151' state.sls web.apache
192.168.64.151:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 18:23:04.089367
Duration: 4671.199 ms
Changes:
----------
httpd:
----------
new:
2.4.6-88.el7.centos
old:
----------
ID: apache-install
Function: pkg.installed
Name: httpd-devel
Result: True
Comment: The following packages were installed/updated: httpd-devel
Started: 18:23:08.838010
Duration: 4121.905 ms
Changes:
----------
httpd-devel:
----------
new:
2.4.6-88.el7.centos
old:
----------
ID: apache-configuration-file
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: True
Comment: File /etc/httpd/conf/httpd.conf updated
Started: 18:23:12.968319
Duration: 128.822 ms
Changes:
----------
diff:
---
+++
@@ -39,7 +39,7 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 80
+Listen 8080 #
# Dynamic Shared Object (DSO) Support
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: Service httpd has been enabled, and is running
Started: 18:23:14.481901
Duration: 275.229 ms
Changes:
----------
httpd:
True Summary for 192.168.64.151
------------
Succeeded: 4 (changed=4)
Failed: 0
------------
Total states run: 4
Total run time: 9.197 s

在minion上能够查看到master的文件信息,已经本地备份的配置文件信息。

[root@Cobbler-client minion]# tree
.
├── accumulator
├── extmods
├── file_backup
│   └── etc
│   └── httpd
│   └── conf
│   ├── httpd.conf_Mon_Apr_22_10:38:47_860981_2019
│   ├── httpd.conf_Mon_Apr_22_10:44:09_456547_2019
│   ├── httpd.conf_Mon_Apr_22_10:44:29_386093_2019
│   └── httpd.conf_Sun_May_05_18:23:13_095365_2019
├── files
│   └── base
│   ├── files
│   │   └── web
│   │   └── apache
│   │   └── httpd.conf
│   └── web
│   ├── apache-configuration-file.sls
│   ├── apache-install.sls
│   ├── apache_new.sls
│   ├── apache-service.sls
│   └── apache.sls
├── highstate.cache.p
├── proc
└── sls.p 13 directories, 12 files [root@Cobbler-client minion]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6743/sshd
tcp6 0 0 :::8080 :::* LISTEN 8504/httpd
tcp6 0 0 :::22 :::* LISTEN 6743/sshd
[root@Cobbler-client minion]#

可以尝试将配置文件修改,然后重新执行该状态。观察日志输出,可以看到minion上面的状态变化。

[root@master /srv/salt/base/web]# salt '192.168.64.151' state.sls web.apache
192.168.64.151:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 18:33:05.818647
Duration: 938.056 ms
Changes:
----------
ID: apache-install
Function: pkg.installed
Name: httpd-devel
Result: True
Comment: All specified packages are already installed
Started: 18:33:06.756942
Duration: 22.211 ms
Changes:
----------
ID: apache-configuration-file
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: True
Comment: File /etc/httpd/conf/httpd.conf updated
Started: 18:33:06.782167
Duration: 61.853 ms
Changes:
----------
diff:
---
+++
@@ -39,7 +39,7 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 8080
+Listen 80 #
# Dynamic Shared Object (DSO) Support
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: Service reloaded
Started: 18:33:06.895152
Duration: 79.117 ms
Changes:
----------
httpd:
True Summary for 192.168.64.151
------------
Succeeded: 4 (changed=2)
Failed: 0
------------
Total states run: 4
Total run time: 1.101 s
[root@master /srv/salt/base/web]#

可以看到,minion上的httpd服务是执行的reload。然后在minion上就可以查看到该服务现在监听的端口,已经发生了变化。

[root@Cobbler-client minion]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6743/sshd
tcp6 0 0 :::80 :::* LISTEN 8504/httpd
tcp6 0 0 :::22 :::* LISTEN 6743/sshd
[root@Cobbler-client minion]#

SLS编写规范的更多相关文章

  1. Java学习---Java代码编写规范

    编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...

  2. java编写规范

    编码规范 转载于:https://www.cnblogs.com/ftl1012/p/javaCode.html 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的 ...

  3. Java代码编写规范(转载)

    编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...

  4. 20151009 C# 第一篇 程序编写规范

    20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...

  5. .NET代码编写规范 整理

    .NET代码编写规范 整理 .NET代码编写规范 - [ASP.NET] 2009-02-26 | Tag: 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://lensp ...

  6. MarkDown编写规范指南

    Markdown 编写规范指南 简介: Markdown的目标是实现「易读易写」,成为一种适用于网络的「书写语言」. 一份使用Markdown格式撰写的文件可以直接以纯文本发布,它的最大灵感来源其实是 ...

  7. 代码编写规范说明书(c#.net与asp.net)

    代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...

  8. Markdown 编写规范

    说明及目的 作为一个在博客园混迹了俩三年的人,一直在这里看别人的博客,现在准备开始写自己的博客,目的呢,就是一下几点吧: 项目过程中的历史经验教训积累记载,吃一堑长一智,不想在同一个坑掉进去好几次 学 ...

  9. Python代码编写规范

    Python代码编写规范 编码: a)     如无特殊情况,文件一律使用UTF-8编码 b)     如无需特殊情况,文件头部必须加入#-*-coding:utf-8-*- 缩进 a)     统一 ...

随机推荐

  1. Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/j..........

    如果你在执行 docker images 出现这样的问题 注意:把你的用户切到root下

  2. 北醒激光模块TFmini——STM32驱动程序(STM32F103C8T6)

    背景:该激光模块属于精度比较高的激光测距模块,使用方便. 代码地址:https://github.com/W-yt/YuTian_Pro/tree/master/TFMini_Driver 平台: 硬 ...

  3. Java实现 洛谷 采药

    题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:" ...

  4. Java实现 LeetCode 690 员工的重要性(简易递归)

    690. 员工的重要性 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度为15, 10, 5.那 ...

  5. Java实现 LeetCode 532 数组中的K-diff数对(双指针,滑动窗口)

    532. 数组中的K-diff数对 给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数 ...

  6. Java实现 LeetCode 239 滑动窗口最大值

    239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最 ...

  7. Java实现 蓝桥杯VIP 算法提高 士兵排队问题

    算法提高 士兵排队问题 时间限制:1.0s 内存限制:256.0MB 试题 有N个士兵(1≤N≤26),编号依次为A,B,C,-,队列训练时,指挥官要把一些士兵从高到矮一次排成一行,但现在指挥官不能直 ...

  8. Java实现 LeetCode 41 缺失的第一个正数

    41. 缺失的第一个正数 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: ...

  9. Java实现蓝桥杯二项式的系数规律

    二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学家杨辉1261年所著的<详解九章算法>一书里就出现了. 其排列规律: 1 1 1 2 1 3 3 1 4 6 4 ...

  10. java实现最大五个数

    ** 最大5个数** [12,127,85,66,27,34,15,344,156,344,29,47,....] 这是某设备测量到的工程数据. 因工程要求,需要找出最大的5个值. 一般的想法是对它排 ...