一,YAML语法

  首先先了解一下YAML,默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性语言。Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。

  YAML语法有三个注意事项,具体如下:

  1,使用空白字符为文件缩排表示结构,不过不能使用TAB

  2,注释用#号

  3,字符串平常不使用引号,如果有需要,可以使用单引号或双引号。使用双引号表示字符串时,特殊字符可以通过倒斜线(\)来进行定义

具体用法

 1,列表:短杠(-)+ 空白字符
- henry
- sina
等价于:['henry','sina']
,字典:key和value通过冒号(:)+空白字符隔开
name: henry
site: http://www.saltstack.cn/
等价于:{'name':'henry','site':'http://www.saltstack.cn/'}
,多层结构:通过缩进来表示层级
- henry:
- sites:
- blog: http://www.saltstack.cn/
等价于:[{'henry':[{'sites':[{'blog':'http://www.saltstack.cn/'}]}]}]

官网地址:http://docs.saltstack.cn/topics/yaml/index.html

二,jinja

  Salt默认使用Jinja2模板系统来生成YAML,是python语言开发的一个模板引擎,类似于Djingo模板系统

jinja模块的用法:

 变量:{{ foo }},变量如果是字典的话可以使用{{foo.bar}}或{{foo['bar']}}
注释:{# comment #}
for:                          ##可以使用for循环取值
{% for eachitem in items %}
{{ eachitem }}
{% endfor %}
if:                           ##可以做if条件判断
{% if GFW %}
welcome to China!
{% elif not Internet %}
welcome to North korea!
{% else %}
Freedom
{% endif %}

三,State Tree

  Top file:配置管理入口文件,和pillar类似,指定minions需要完成那些配置管理,默认为top.sls
  注:在定义top.sls时,会先找apache/init.sls,如果没有的话,会找apache.sls
  base:
    '*':
      - apache
  sls模块使用点(.)来分割,如apache.install等于salt://apache/install.sls或salt://apache/install/init.sls
  Include/Extend:sls文件间可以通过include及extend来引用和扩展
  sls中ID必须唯一,且在该ID下的同一类的状态管理模块只能有一个,所谓的slsID 就是定义sls文件时最开始定义在开头的名字。
  0.17.0 salt增加了state_auto_order参数(默认值为True),使state在没有Requisites的情况下按照从上而下的顺序进行执行

四,Requisites(相当于sls流程控制,那个先执行,那个后执行等) 

  require:本state执行时需要先执行那些state
  require_in:与require位置相反
  watch:除了require外,也会监测依赖的state的状态,如果状态发生变化,做出反应(例如监控文件变化,发生变化后立即重启服务)
  watch_in: 与watch位置相反
  prereq:0.16.0 新增的功能,会通过test=True接口检查所依赖的state的状态,如果状态发生变化,执行
  prereq_in:相反

五,下面介绍三个模块的用法,更多模块用法请参考官网

 官网地址:https://docs.saltstack.com/en/latest/ref/states/all/

 软件包状态管理模块
 模块名:pkg
 功能:管理软件包状态,会根据操作系统不同,选择对应安装方式
 基本操作:

pkg.installed:     #确保软件包已安装,如果没有安装进行安装
pkg.latest: #确保软件包是最新版本,如果不是,进行升级
pkg.remove: #确保软件包已卸载,如果之前已安装,进行卸载
pkg.purge: #除remove外,也会删除其配置文件

 文件状态管理模块:
  模块名:file
  功能:管理文件状态
  基本用法:

file.managed:     #保证文件存在并且为对应的状态
file.recurse:    #保证目录存在并且为对应的状态
file.absent:    #确保文件不存在,如果存在则进行删除操作

  服务状态管理模块:
  模块名:service
  功能: 管理服务状态
  基本用法:

service.running        #确保服务处于运行状态
service.enabled #确保服务会开机自动启动
service.disabled #确保服务不会开机自启动
service.dead #确保服务当前没有运行

六,实例操作

(一)、安装apache

top.sls
base:
'*':
- apache
init.sls apache:                    ##slsID
pkg.installed: ##安装httpd
- name: httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf ##拷贝/srv/salt/apache/httpd.conf到minion的/etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
- require:       ##检查apache有没有安装成功
- pkg: apache
service.running:
- enable: True
- name: httpd
- watch:        ##watch检测配置文件,如果发生变化会重启服务
- pkg: apache
- file: apache

运行配置管理:salt '*' state.sls apache
salt '*' salt.highstate test=True #test=True用于测试语法

   (二)、apache需要监控8080端口,代码如下:

首先修改apache的主配置文件,修改配置文件为 listen {{ port }},修改完成后可以直接在sls文件里定义
apache:
pkg.installed:
- name: httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
- require:
- pkg: apache
- template: jinja ##调用jinja模板渲染
- context:   ##这里可以是context或default效果一样
port:
service.running:
- enable: True
- name: httpd
- watch:
- pkg: apache
- file: apache
如果多台主机监听的端口不一样,具体修改如下:
apache:
pkg.installed:
- name: httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
- require:
- pkg: apache
- template: jinja
- defaults:
{% if grains.id == "10.13.41.80" %}
port:
{% elif grais.id == "10.13.41.81" %}
port:
{% else %}
port:
{% endif %}
service.running:
- enable: True
- name: httpd
- watch:
- pkg: apache
- file: apache

为了让sls文件不参杂业务数据,业务数据应该独立存放,到了该pillar登台的时候了。

/srv/pillar/apache/init.sls
apache:
{% if grains.id == "test" %}
port:
{% elif grains.id == "test1" %}
port:
{% else %}
port:
{% endif %}
/srv/pillar/top.sls
base:
'*':
- apache salt '*' saltutil.regresh_pillar ##刷新pillar
salt '*' pillar.get apache:port ##取minion的pillar信息 /srv/salt/apache/deploy.sls
- template: jinja
- defaults:
port:{{salt['pillar.get']('apaceh:port',)}}

saltstack的状态管理state就介绍到这里。

saltstack(五) saltstack的state状态管理的更多相关文章

  1. Spark Streaming揭秘 Day14 State状态管理

    Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming ...

  2. 开启 J2EE(五)— Servlet之状态管理

    HTTP无状态协议 首先我们要知道: HTTP协议是无状态协议. 我们知道HTTP协议就是server通过Request从浏览器接收和Response向浏览器输出的这么一个过程(浏览器和server的 ...

  3. 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app

    为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

  5. vuex状态管理,state,getters,mutations,actons的简单使用(一)

    之前的文章中讲过,组件之间的通讯我们可以用$children.$parent.$refs.props.data... 但问题来了,假如项目特别大,组件之间的通讯可能会变得十分复杂... 这个时候了我们 ...

  6. react初探(一)之JSX、状态(state)管理、条件渲染、事件处理

    前言: 最近收到组长通知我们项目组后面新开的项目准备统一技术栈为react,目前我的情况是三大框架只会angular和Vue.在实际项目中只使用过一次angular5,其余项目都是使用Vue写的.写篇 ...

  7. State management(状态管理)

    State management https://en.wikipedia.org/wiki/State_management UI控件的状态管理, 例如按钮的灰化.只读.显示隐藏等. 特殊地一个控件 ...

  8. 五、vue状态管理模式vuex

    一.vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 即data中属性同时有一 ...

  9. 组件之间的通讯:vuex状态管理,state,getters,mutations,actons的简单使用(一)

    之前的文章中讲过,组件之间的通讯我们可以用$children.$parent.$refs.props.data... 但问题来了,假如项目特别大,组件之间的通讯可能会变得十分复杂... 这个时候了我们 ...

随机推荐

  1. .NET 导入导出Excel

    第一种方式:OleDb 需要安装office,且读数据慢,而且有数据格式的Cell读出数据不正确等问题.放弃. 第二种方式:NPOI开源库 使用NPOI导入导出Excel应该是.NET开发很常用的手段 ...

  2. 4. extjs中form中的frame:true表示什么

    转自:https://blog.csdn.net/qiu512300471/article/details/23737217 设置为true时可以为panel添加背景色.圆角边框等,如下图 下面的是f ...

  3. 2-4 Vue中的属性绑定和双向数据绑定

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Linux常用命令分类

    目录:相对路径和绝对路径. 绝对路径:路径的写法[一定由根目录 / 写起],例如: /usr/share/doc 这个目录. 相对路径:路径的写法[不是由 / 写起],例如由 /usr/share/d ...

  5. AutoCAD VBA添加菜单

    # 给cad添加自定义菜单 Private Sub AddBar() Dim NewMenuItem As AcadPopupMenuItem Dim TheMacro As String Dim M ...

  6. FJOI2019退役记

    day1 不意外地一点都不紧张,早就感觉没有机会了吧 进场非常从容地读完了三道题,开始写t1暴力,接着就开始自闭,不知道该开t2还是t3,最后先开了t3,想了想这不是选两条不相交的链吗,这个暴力不是林 ...

  7. WIN2012的桌面和开始菜单跑到什么地方去了

    传统开始菜单取消了,你把鼠标指针移动到左下角的边缘,会有一个小浮窗,就是开始,再点开始就能进到一个全屏的层里面,跟手机界面,那个玩意就是新一代的开始菜单,程序菜单,你在开始菜单上,鼠标右键点一下,下面 ...

  8. 初窥Android Studio

    Android Studio 是一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于 ...

  9. 简单的win7-cmd命令提示符

    在win7打开cmd窗口 有两个路径:(1)开始 -->所有程序 --> 附件 --> 命令提示 (2)开始 -->在搜索框输入 “cmd”   指令 作用 对文件夹的操作   ...

  10. MSSQLServer知识点总结:DDL(create,alter,drop,declare)-未完整

    一.开发环境 Window10 二.开发工具 SQLServer2012 三.数据库的操作 1.创建 (1)方式一:使用默认的配置信息 create database T_mydb2 (2)方式二:自 ...