七天学会SALTSTACK自动化运维 (3)

七天学会SALTSTACK自动化运维 (3)

  • 导读
  • SLS
  • TOP.SLS
  • MINION选择器
  • SLS文件的编译
  • 总结
  • 参考链接

导读


SLS

SLS (aka SaLt State file) 是 salkstack 中非常基础和重要的一种配置文件. 重要程度仅次于minion和 master 的主配置文件(或者说是一种数据结构,使用yaml编写), 因为 SLS 配置文件决定了我们所定义的命令的执行路径,比如 target到的很多minion, target完成之后就要开始执行命令了,或是真的执行一组命令,或是同步一堆配置文件,都是要确定哪个target ,执行哪个命令或者操作的,寻找对应的环境是sls文件的功能之一,也是第一步要学会的关于SLS的知识,关于环境配置,大多数都写在 top.sls 中, 每个环境都有自己的top.sls,方便多环境配置,其他的sls多用于控制配置文件同步或者执行命令之类的工作。


TOP.SLS

我的 file_roots

/etc/master
file_roots:base:- /srv/salt/basedev:- /srv/salt/devtest:- /srv/salt/test

我的 top.sl

/srv/salt/base/top.sls
base:'*':- salt.minion- base/srv/salt/dev/top.sls
dev:'dev*':- development_config- dev_db/srv/salt/test/top/sls
test:'env:test':- match: grain- test_config- test_db

我的配置文件中有3个环境,不同的环境对应不同的环境配置目录,目录在 master 的file_roots中配置,意思就是说,每个minion可以读取base的配置文件, dev的可以读取dev的环境, test的可以读取test的环境,这样就可以避免把 settings.py, nginx.conf, my.cnf等等都放到同一个目录中.

现在我的/srv/salt/base/中只放一些通用配置,当执行state.highstate的时候就会执行base.sls中的所有操作到我的minion上,下面参见我的base.sls.

minion_config:file.managed:- name: /etc/base/minion.config- source: salt://minion.configapache:pkg.installed:- watch:- file: minion_config

非常简单,且saltstack自动处理的非常好,只需要告诉minion应该保存文件的位置就可以,source则完全不用配置,因为salt自己知道当前minion对应的哪个环境目录,自动去寻找minion.config文件并且同步到自己的/etc/base/minion.config下,这样就实现了不同环境的分离,不过有一个地方需要注意的是,如果/etc/base目录不存在会同步失败,所以要事先确定目录是否存在
_________________________________

MINION选择器

官方文档中的关于top.sls的一节有完整的使用方法,不过既然要写自己的理解,就一定写最简单最常用的.

其实就把这个东西当做是jquery的选择器来使用就好了,jquery的选择器的出现是因为dom节点非常多,需要通过一中好用的手段去选取自己要控制的节点,而saltstack的选择器也是出于同样的理由而被设计出来,那就是不同minion节点的选择,因为你可能要管理梦幻西游的服务器,梦幻西游的服务器少说也有好几千台吧,有了saltstack选择起来很容易了.

Saltstack的选择器根据文档来看大致分为2种,一中是基于 Compound Matcher,另一种是基于 Node groups的, 其实按笔者的角度来看,其实只有一种,那就是前者,后者只不过是按照前者提供的方法,分了一下组而已,把不同功能的minion分到不同的组,这样就不用每次用很长的正则去匹配 id或者grains了.

compound:

Letter    Match Type        Example
G         Grains glob       G@os:Ubuntu
E         PCRE Minion ID    E@web\d+\.(dev|qa|prod)\.loc
P         Grains PCRE       P@os:(RedHat|Fedora|CentOS)
L         List of minions   L@minion1.example.com,minion3.domain.com or bl*.domain.com
I         Pillar glob       I@pdata:foobar
S         Subnet/IP address S@192.168.1.0/24 or S@192.168.1.100
R         Range cluster     R@%foo.bar

上方的表格出自官方文档,有了第一次的使用经验( sudo salt -G 'env:test' test.ping) 理解起来就很容易了,而且这么多匹配方式还支持混用,也支持 and not or 之类的逻辑运算,就像nginx的配置文件一样灵活。

    sudo salt -C 'G@env:dev and G@cpu_nums:8 and E@tokyo* and P@os:(CentOS)'

上面的复杂表达式虽然很长,但是一眼就可以看懂,无需多说,只是对于正则的使用是一个难关.

Node groups:

这个分组配置在 master 的配置文件里,具体的写法可以参考 这里, 简单配置之后就可以使用,没有太多需要注意的地方.


SLS文件的编译

这个结果也是读官方文档之后得出的,而且有一个ISSUE,这里并不解释如何使用jinja2模板引擎来编译sls文件,而是要说明sls文件的定义顺序对环境变量的影响,在前面的配置中已经看到了,在每个环境的目录下都可以配置top.sls文件来定义自己的配置,而且每个环境的top.sls只定义了自己的配置,也就是说base/top.sls只配置了base,没有配置其他的,而当base目录下没有top.sls的时候(或者是没有base的section),那么就按照字母表的顺序去查找其他的其中含有base section的top.sls, 这是一种容错策略,也是加强配置灵活性的方法,这个例子可以见文档,笔者这里只说自己的理解,尽量避免复制代码.

base/top.sls文件比较特殊(其实并不特殊),因为一般情况下base的目标是所有的minion,而且在base/top.sls中也是可以配置其他环境的section的,这里有一点就是说,当在base/top.sls 发现dev的section之后,那么这个环境就会使用base/top.sls中的dev的配置,而不管dev/top.sls中是否有自己的配置,换一种方法说就是base.sls是在第一时间被解析编译的,可以通过读代码去验证,不过这是学会使用之后的事情了.(其实在ISSUE存在的情况下,上面的一段话是错误的,具体可以hack代码)

对于除base/top.sls之外的其他环境的top.sls, 也遵循与base/top.sls相同的策略,自己的top.sls不存在自己section的,按照字母表顺序去查找其他包含自己section的top.sls,找到之后就使用这个section作为自己的环境.

最后关于ISSUE,该ISSUE目前还没有关闭,表明该bug目前仍然存在,不过这里会说一个安全方法,不过安全方法也是有安全前提的,因为安全方法不一定符合你的使用需求.

作者的意思是,他的 base , qa ,dev, master 环境,每一个环境都有自己的一个top.sls,而且这个top.sls是同一个文件,但是这个top.sls的内容不是相同的,为什么呢?因为top.sls是在git中的不同版本,所以是同一个文件,但是内容不同,由于含有重复的配置,所以最后一个配置,覆盖了前面所有的配置,最后一个就是qa, 其实作者还有几句含糊的话让我看不明白,不过大致就是这样,避免的方法就是按照我说的,每个top.sls只做自己分内的事情,不要包含其他的section.

如果谁知道作者为什么使用不同版本的top.sls放在不同的目录中,请联系我


总结

完全基于自己的理解,基本上对SLS说明的比较清楚了,下一步可能会去debug该软件,或者按照实践去研究,不过我认为别人不一定能完全懂得我的意思,痛点几乎都找到了,下面就是看实践了,可能会开发一套基于saltstack的运维组件,毕竟是提供了api的.


参考链接

http://salt.readthedocs.org/en/latest/topics/tutorials/starting_states.html

http://salt.readthedocs.org/en/latest/ref/states/top.html#other-ways-of-targeting-minions

https://github.com/saltstack/salt/issues/12483#issuecomment-64181598

http://www.shencan.net/index.php/2013/08/21/saltstack-ui%E5%BC%80%E5%8F%91/

转载于:https://www.cnblogs.com/youngershen/p/4320766.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt-embedded-linux-opensource-src-4.5.3移植到s3c6410

首先要有配置好的环境,本文使用的编译环境如下: 主机系统:Ubuntu 9.10 主机编译器:gcc 版本 4.4.1 交叉编译器:arm-linux-gcc-4.0.1 软件资源:qt-embedded-linux-opensource-src-4.5.3.tar.gz qt-x11-opens…

C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法

<p style"line-height: 19px; margin: 10px auto; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;">有些成员变量的数据类型比较特别&#xff0c;它们的初始化方式也和普通数据类型的成员变量有所不同…

【Intellij Idea】设置JDK

1&#xff0c;File-->Project Structure 说明&#xff1a;可以设置整个工程的JDK&#xff0c;也设置每个modules的JDK,但是一般整个工程的JDK. 2&#xff0c;或者通过快捷键&#xff1a;ctrlaltshifts 转载于:https://www.cnblogs.com/august-shi/p/6655469.html

c#操作html dom元素,C#获取与修改HTML DOM元素信息

用C#和JavaScript交互首先要解决C#读取HTML DOM元素的问题。 在System.Windows.Browser命名空间下&#xff0c;有一个HtmlDocument、HtmlPage、HtmlElement等类&#xff0c;可以用来读取HTML DOM元素。其读取方法和JavaScript如出一辙。引用内容&#xff1a; //初始化一个docum…

Hibernate之工具类HibernateUtil

原创文章&#xff0c;转载请注明&#xff1a;Hibernate之工具类HibernateUtil By Lucio.Yang 1.最简单的工具类&#xff0c;实现SessionFactory的单例共享&#xff0c;session的管理 package com.cc.hibernate;import org.hibernate.Session; import org.hibernate.SessionFac…

c++读取文件–结束条件的判断

转载&#xff1a;http://blog.sina.com.cn/s/blog_623e3c050100neei.html 在使用C/C读文件的时候&#xff0c;一定都使用过eof&#xff08;&#xff09;这个函数来判断文件是否为空或者是否读到文件结尾了&#xff0c;也会在使用这个函数的过程中遇到一些问题&#xff0c;如不…

绘图用计算机配置要求,绘图笔记本电脑基本配置要求 绘图笔记本推荐

现在很多工业图、工程图都需要用电脑来话&#xff0c;比如CAD、PS、三维画图这些软件对电脑的配置要求还是比较高的&#xff0c;还有一些对色彩要求高的动画软件&#xff0c;那就更加需要配置了&#xff0c;下面小编就来简单说说绘图笔记本电脑最基本的配置要求以及绘图笔记本推…

关于dllimport的使用

最近做一个动态加载插件的项目&#xff0c;插件中的dll 主要是各厂商各型号的读卡器的通用类库&#xff0c;stdapi.dll&#xff0c;WltRS.dll&#xff0c;有的还有进一步封装的dll&#xff0c;主要是为了简化通用类库的操作。 这些类库都是用C语言&#xff0c;或者C来编写的&am…

如何在MVCsheet表单页面的后台取到页面自定义字段的值?

问题&#xff1a;<asp:HiddenField id"test" runat"server"/> 在前台加了这样一个隐藏元素&#xff0c;mvcsheet表单页面&#xff0c;如何在后台获取到值&#xff0c;直接使用 test.value一直是空的。 前台经过一系列判断处理写入该值&#xff0c;需…

BigDecimal.setScale 处理java小数点

BigDecimal.setScale()方法用于格式化小数点 setScale(1)表示保留一位小数&#xff0c;默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位&#xff0c;如2.35会变成2.3 setScale(1,BigDecimal.ROUND_UP)进位处理&#xff0c;2.35变成2.4 setScale(1,B…

C++的字符串分割函数

转载&#xff1a;http://blog.csdn.net/shanzhizi/article/details/17189267 C的字符串没有分割函数&#xff0c;因此需要自己写方便使用。而受到开发工具的影响&#xff0c;有很多用起来比较麻烦啦&#xff0c;下面这个比较不错奥。 用STL进行字符串的分割 涉及到string类的…

计算机无法正常更新,无法完成更新正在撤销更改请不要关闭你的计算机如何修复...

我们电脑开机的时候可能会遇到各种问题&#xff0c;比如就有用户发现电脑开机的时候&#xff0c;一直提示无法完成更新正在撤销更改请不要关闭你的计算机&#xff0c;等待了很长时间也进不去系统&#xff0c;遇到这样的问题该怎么办呢&#xff1f;不用担心小编给大家支招&#…

水一篇

发件人标题发送时间处理系统通知您的博客申请已批准2013-10-15 13:58删除系统通知博客园博客申请通知2013-10-15 12:55删除系统通知您的博客申请未通过审批2013-10-13 11:21删除系统通知博客园博客申请通知2013-10-13 11:07删除系统通知您的博客申请未通过审批2013-10-13 11:06…

如何去掉jQWidgets中TreeGrid和Grid右下角的链接

关于如何去掉这个水印&#xff0c;这是官方的说法。 更新了jQWidgets版本&#xff0c;发现在使用过程中发现每次渲染完TreeGrid和Grid后会在表格右下角出现一个www.jqwidgets.com的span标签。 在相关的脚本中搜索www.jqwidgets.com相关的关键字都没有对应结果。于是准备从其父容…

华为2015年实习生招聘考试试题

第一题&#xff1a; 描述: 目描述&#xff1a; 编写一个函数&#xff0c;将字符串中的大写的字母(A~Z)挑出来&#xff0c;同时保留原字符串中的空格&#xff0c;将挑出的大写字母和空格按原始位置组成新的字符串。 例如&#xff1a; 1&#xff09;输入&#xff1a;AUStralia&…

【NOIP2011 Day 2】观光公交

【问题描述】 小城Y市&#xff0c;拥有n个景点。由于慕名而来的游客越来越多&#xff0c;Y市特意安排了一辆观光公交车&#xff0c;为游客提供更便捷的交通服务。观光公交车在第0分钟出现在1号景点&#xff0c;随后依次前往2、3、4……n号景点。从第i号景点开到第i1号景点需要D…

基本数据类型的自动装箱

这里以Integer类型举例&#xff1a; Integer a 1; a 2; 编译后.calss文件是这样的 Integer a Integer.valueOf(1); 自动装箱 a Integer.valueOf(a.intValue() 2); 自动拆箱&#xff0c;再自动装箱 转载于:https://www.cnblogs.com/feiZhou/p/9344494.html

自媒体和计算机相关吗,做自媒体,台式电脑跟笔记本电脑用哪个好呢?

四阿哥fly回答数&#xff1a;143 | 被采纳数&#xff1a;162019-06-29 12:16:21作为去年折腾了一年自媒体&#xff0c;各种情况遇到过&#xff0c;分享下台式电脑和笔记本到底哪个好&#xff1f;好在哪里&#xff1f;如果真的要选择&#xff0c;个人还是推荐用台式比较好。工…

JS脚本显示当前日期+星期几[转]

以下的代码提供了显示当前日期和星期几的实现方法&#xff1a; function writeDateInfo() { var day""; var month""; var ampm""; var ampmhour""; var myweekday""; var…

openCV中waitKey函数介绍

#include <opencv2/opencv.hpp> #include < iostream > #include <window.h> using namespace cv; using namespace std;int main() {Mat im;double duration;im imread("1.jpg");// 测试没有namedWindow时的waitKey执行时间duration static_cas…