七天学会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/base
dev:
- /srv/salt/dev
test:
- /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.config
apache:
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开发/
七天学会SALTSTACK自动化运维 (3)的更多相关文章
- 七天学会SALTSTACK自动化运维 (2)
七天学会SALTSTACK自动化运维 (2) 导读 Grains Pillar 总结 参考链接 导读 上一篇主要介绍了安装和基本的使用方法,但是我认为如果理解了相关概念的话,使用会更加顺手,因为毕竟每 ...
- saltstack自动化运维系列11基于etcd的saltstack的自动化扩容
saltstack自动化运维系列11基于etcd的saltstack的自动化扩容 自动化运维-基于etcd加saltstack的自动化扩容# tar -xf etcd-v2.2.1-linux-amd ...
- saltstack自动化运维系列⑩SaltStack二次开发初探
saltstack自动化运维系列⑩SaltStack二次开发初探 1.当salt运行在公网或者网络环境较差的条件下,需要配置timeout时间vim /etc/salt/master timeout: ...
- saltstack自动化运维系列⑧SaltStack实践配置管理安装nginx-1.10.3
saltstack自动化运维系列⑧SaltStack实践配置管理安装nginx-1.10.3 安装nginx-1.10.3.tar.gz # mkdir -p /srv/salt/prod/pkg / ...
- saltstack自动化运维系列⑦SaltStack实践配置管理安装zabbix
saltstack自动化运维系列⑥SaltStack实践配置管理安装zabbix 1.添加管理zabbix的sls文件# vim /srv/salt/base/init/zabbix_agent.sl ...
- saltstack自动化运维系列⑥SaltStack实践安装配置HAproxy的Keepalived
saltstack自动化运维系列⑥SaltStack实践安装配置HAproxy的Keepalived 安装配置Keepalived 1.编写功能模块 #创建keepalived目录# mkdir -p ...
- saltstack自动化运维系列⑥SaltStack实践安装配置HAproxy
saltstack自动化运维系列⑥SaltStack实践安装配置HAproxy 下载haproxy1.6.2.tar.gz下载地址:http://www.haproxy.org/download/1. ...
- saltstack自动化运维快速入门
saltstack自动化运维快速入门 关于saltstack 这个软件是干啥的 我这里就不介绍了 只是简单的说下是干啥的 网上的说法是 它是func的强化版本+ puppet的精简版 关于puppet ...
- saltstack 自动化运维
salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会进行大量的重复性操作,例如安装软 ...
随机推荐
- 将证书写到jre中
第一步: 取得要导入的证书. 第二步: 开启CMD,进入Java/jre6/lib/security 目录下. 第三步: 执行以下命令: keytool -import -alias cacerts ...
- OPC客户端的进程安全初始化
现场OPC客户端无法获取远程OPC Server列表,也无法连接OPC Server,经查调用CoCreateInstanceEx()创建IID_IOPCServerList接口正常,但调用IOPCS ...
- UBUNTU 札记(53条经验)
adobe_pdf 菜单栏 /etc/profile 是一个global config file,会影响系统全局用户,如果你只想对single user生效的话,可以修改vi ~/.bash_prof ...
- python小程序——购物
流程图 代码程序 saving = int(input('请输入你的工资:'))shopping = [['iphone',5800],['mx6',2000],['pythonbook',80], ...
- Python3.x爬虫教程:爬网页、爬图片、自己主动登录
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文将使用Python3.4爬网页.爬图片.自己主动登录.并对HTTP协议做了一个简单 ...
- 基于XMPP实现的Openfire的配置安装+Android客户端的实现
最近在整理一些这方面的资料,闲话少说,咱还是直奔主题吧 :) 一.基于xmpp实现的openfire的配置安装 1. 下载最新的openfire安装文件 官方下载站点: http://www.igni ...
- 自定义的插件如何加载到Qt Designer中(详细)
要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...
- eslint error
暂时不想解决 报错: 3:16 error Component should be written as a pure function react/prefer-stateless-function ...
- Bginfo软件在域的部署和应用
在企业的IT管理中,很多用户都不知道怎么去查看自己计算机的IP地址.登陆帐户.而对于网络管理人员来说,他们可能需要知道用户在域中登录的一些信息,如那些用户登录过,在什么时间登录,IP和MAC地址是多少 ...
- jQuery失去焦点的时候注册验证
//注册验证$('form :input').blur(function () { if ($("#txtName").val() == "") { $(&qu ...