学习使用自动运维工具saltstack的过程当中,其中state模块是帮助管理员控制minion达到一个预想的状态。换句话来讲,我想让minion可以远程执行命令,自动配置环境文件,软件安装、服务启动、关闭,信息收集等自动化操做,都能经过saltstack的state模块实现。
而且最重要的一个好处就是简单、简洁、方便。引用一段官方文档的话:
Simplicity, Simplicity, Simplicity
Many of the most powerful and useful engineering solutions are founded on simple principles. Salt States strive to do just that: K.I.S.S. (Keep It Stupidly Simple)
The core of the Salt State system is the SLS, or SaLt State file. The SLS is a representation of the state in which a system should be in, and is set up to contain this data in a simple format. This is often called configuration management.html
state模块是saltstack最核心的模块之一,经过预先定制好的SLS文件对被控主机进行状态管理。可支持包括程序包(pkg),文件(file)、网络配置(network)、系统服务(service)、系统用户(user)。
更多状态模块的用法能够参考官网:
https://docs.saltstack.com/en/latest/ref/states/all/index.htmweb
SLS文件的默认渲染器是YAML渲染器。YAML是一种具备强大功能的标记语言。而saltstack就是使用一部分YAML来映射很是经常使用的数据结构,例如列表和字典。YAML渲染器的工做就是采用YAML数据结构将其编译为Python数据结构供saltstack使用。
关于YAML标记语言只需记住三个基本规则:
规则1、缩进:
YAML使用固定缩进来表示数据层之间的关系,要求每一个级别的缩进恰好两个空格。
规则2、冒号:
字典键在YAML中表示由冒号分割的字符串。值有冒号后面的字符串表示,由空格分割。
规则3、破折号:
为了表示项目列表,使用单个短划线后跟空格。多个项目是同一个列表的一部分,具备同级别的缩进。shell
一、YAML: my_key : my_value 在Python中,上面的映射到: {‘my_key’:’my_value’} 二、YAML: first_level_dict_key: second_leve_dict_key : file_dict_key 在Python中,上面至关于字典的嵌套: {‘first_level_dict_key’ :{‘second_leve_dict_key’ : ‘ file_dict_key’}} 三、YAML: first_dict: - first_file_dict - second_file_dict - third_file_dict 在Python,上面映射到: {‘first_dict’:[first_file_dict’,’second_file_dic’,’third_file_dict’]}
有时候当咱们写完sls文件时,想看下写的格式或者渲染到Python数据结构是否正确,能够经过在线YAML解析来查看Python的输出:
http://yaml-online-parser.appspot.com/
对于YAML就不在详解了,有兴趣的能够多了解下。在这里只须要记住这几个规则,对于接下来的sls文件编写和理解有不少帮助。apache
因为硬件资源有限,测试环境采用两台服务器进行部署,两台服务器扮演不一样的角色:json
IP 角色 系统环境 193.192.128.5 Master Centos7.5 192.168.128.6 Minion Centos7.5 具体搭建过程不详细讲解,今天重点主要是state模块,若是对搭建部署有疑问的能够到我以前写过的一篇文章查看:
http://www.javashuo.com/article/p-puknrnlk-cq.html
部署搭建以后,须要对master机器上的master配置文件修改,我将Salt文件服务器的目录设置到了/opt/base/下。而且设置top.sls为管理配置的入口文件。top.sls 默认从 base 标签开始解析执行,下一级是操做的目标,能够经过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件,不包含扩展名。bash
由于个人系统是Centos系统,因此安装httpd,不一样的系统安装apache时,软件包名字都不同,选择与你系统相对应的软件名。服务器
定义top.sls文件网络
对httpd建立/opt/base/top.sls文件,能够分别经过正则、分组名、grain模式几种方式进行主机匹配:数据结构
base: "*": - init.httpd_init.httpd #经过正则匹配
定义state app
建立/opt/base/init/httpd_init/init/httpd.sls文件,上面的top.sls中匹配到minion主机,都将会执行httpd.sls文件中的内容。而后对httpd.sls文件中写入内容:
httpd: pkg.installed: - name: httpd service.running: - name: httpd - require: - pkg: httpd
sls文件详解:上述代码检查httpd服务是否已安装,若是未安装则将经过yum方式安装,检查httpd服务进程是否启动运行。下面对各行进行说明:
第一行用于定义state名称,不惟一,也可去其余相关名称
第二行和第四行表示state声明开始,使用了pkg和service模块,分别管理软件包状态,管理服务状态。pkg.installed确保软件包已安装,若是没有安装进行安装;service.running确保服务处于运行状态。
第三行和第五行是分别传递给pkg.installed和service.running模块的参数。
第六行require指的是本state执行时须要先执行哪些state。
执行state
salt ‘mbb-6’ state.highstate
执行结果
由于以前minion主机安装过httpd服务,因此它显示已经安装,并启动了
OpenFalcon是一款由小米运维团队从互联网公司的需求出发, 根据多年的运维经验,结合市面上使用的一些运维监控系统的使用经验和反馈,开发的一套企业级、高可用、可扩展的开源监控解决方案。
其中agent是用于采集机器负载监控指标,好比cpu.idle、load.1min、disk.io.util。因此agent须要部署到所要监控的机器上,而且设置为开机自启动。
以前在mbb-5虚拟机上搭建了一套openfalcon系统,如今只须要将已经配置好的agent组件放在/opt/base/packages目录下。
agent修改过的配置文件(agent/config/cfg.json):
经过start.sh,stop.sh控制启动和中止agent(用于自启动服务)
建立openfalcon_init目录:
建立agent.sls文件用于同步已经配置agent组件目录,而且将自启agent服务添加到rc.local文件。webuser_create用于建立web用户。
agent.sls:
# 部署Openfalcon的agent组件到被监控的机器上 # 经过salt命令:salt 主机 'state.sls' init.openfalcon.agent include: - init.openfalcon_init.webuser_create openfalcon-dir: file.recurse: - name: /home/work/open-falcon - source: salt://packages/minion - user: web - group: web - dir_mode: 755 - file_mode: 755 - makedirs: True cmd.run: - name: runuser -l web -c "sh /home/work/open-falcon/start.sh" - unless: ps -ef | grep falcon-agent | grep -v grep openfalcon-start: file.append: - name: /etc/rc.d/rc.local - text: 'runuser -l web -c "sh /home/work/open-falcon/start.sh"' cmd.run: - name: chmod 755 /etc/rc.d/rc.local
sls文件详解:代码具体结构的含义就不详讲了,值得讲下就是file和cmd模块;分别用于管理文件状态和执行命令。
file.append将指定内容添加到指定文件。file.recurse经过主服务器的子目录进行递归,并将所属子目录复制到指定的路径。
- name:用于设置递归的目录;
- source:源目录,该目录位于salt主文件服务器上,并使用salt://协议,就是在以前设置过的/opt/base目录下;
- user:所属用户;group:所属组;
- dir_mode、file_mode:目录、文件权限设置。
cmd.run若是知足某些条件,则运行命令;- name:要执行的命令;
- unless:做为检查命令。当在系统进程中没有发现falcon-agent进程时,则会执行启动命令。
最开始使用 include 能够包含现有state文件而没必要从新写,因此将建立web用户的sls文件包含起来。
webuser_create.sls
web: group.present: - name: web - gid: 8888 - system: True user.present: - fullname: web - shell: /bin/bash - home: /home/web - uid: 8888 - gid: 8888 - groups: - web
sls文件详解:group和user模块分别管理用户组和用户。group.present中的参数name:要建立组的名称,gid:分配指定组的组ID,system:命名组是否为系统组。user.present也相似,就不在详说。
执行state
salt 'mbb-6' 'state.sls' 'init.openfalcon_init.agent'
执行结果
5、总结:
saltstack是自动化运维必备的工具,以前对saltstck接触的也不深,都只是单纯的经过saltstack远程执行命令等,到最近业务中须要经过批量部署Openfalcon的agent组件,才了解到saltstack这个state核心的模块。固然在这里所涉及到的可能只是state模块一小部分功能,他的功能还远不止这么简单,有兴趣能够多看看saltstack的官网,里面详解了许多自动化的功能,固然这须要结合业务去完成这些事情,否则这些将变得没有任何意义。
而从这里能够看出对于本身运维工做,其实还有许多方面能够拓展,不能只知足于一点,从本质上看问题,才能看到全貌。
如下是我参考的一些网站,博客,有兴趣的能够了解一下:
Saltstack自动化(五)sls文件使用
http://www.361way.com/salt-states/5350.html
saltstack(五) saltstack的state状态管理
https://www.cnblogs.com/phennry/p/5416859.html