关于saltstack核心模块state详解(代码片段)

author author     2023-02-06     785

关键词:

一、问题背景:

 学习使用自动运维工具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.

二、前期准备:

 state模块是saltstack最核心的模块之一,通过预先定制好的SLS文件对被控主机进行状态管理。可支持包括程序包(pkg),文件(file)、网络配置(network)、系统服务(service)、系统用户(user)
 更多状态模块的用法可以参考官网:
https://docs.saltstack.com/en/latest/ref/states/all/index.htm

关于YAML

 SLS文件的默认渲染器是YAML渲染器。YAML是一种具有强大功能的标记语言。而saltstack就是使用一部分YAML来映射非常常用的数据结构,例如列表和字典。YAML渲染器的工作就是采用YAML数据结构将其编译为Python数据结构供saltstack使用。
关于YAML标记语言只需记住三个基本规则:
规则一、缩进:
 YAML使用固定缩进来表示数据层之间的关系,要求每个级别的缩进刚好两个空格。
规则二、冒号:
 字典键在YAML中表示由冒号分割的字符串。值有冒号后面的字符串表示,由空格分割。
规则三、破折号:
 为了表示项目列表,使用单个短划线后跟空格。多个项目是同一个列表的一部分,具有同级别的缩进。

通过几个示例帮助大家了解一下:

1、YAML:
my_key : my_value
在Python中,上面的映射到:
‘my_key’:’my_value’
2、YAML:
first_level_dict_key:
  second_leve_dict_key : file_dict_key
在Python中,上面相当于字典的嵌套:
‘first_level_dict_key’ :‘second_leve_dict_key’ : ‘ file_dict_key’
3、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文件编写和理解有很多帮助。

三、环境说明:

由于硬件资源有限,测试环境采用两台服务器进行部署,两台服务器扮演不同的角色:

IP 角色 系统环境
193.192.128.5 Master Centos7.5
192.168.128.6 Minion Centos7.5

 具体搭建过程不详细讲解,今天重点主要是state模块,如果对搭建部署有疑问的可以到我之前写过的一篇文章查看:
http://blog.51cto.com/mbb97/2084530
 部署搭建之后,需要对master机器上的master配置文件修改,我将Salt文件服务器的目录设置到了/opt/base/下。并且设置top.sls为管理配置的入口文件。top.sls 默认从 base 标签开始解析执行,下一级是操作的目标,可以通过正则grain模块,或分组名,来进行匹配,再下一级是要执行的state文件,不包含扩展名。
技术分享图片

四、实战训练

统一安装部署Httpd服务

 因为我的系统是Centos系统,所以安装httpd,不同的系统安装apache时,软件包名字都不一样,选择与你系统相对应的软件名。

定义top.sls文件

对httpd创建/opt/base/top.sls文件,可以分别通过正则、分组名、grain模式几种方式进行主机匹配:

base:
  "*":
    - init.httpd_init.httpd
#通过正则匹配

定义state

 创建/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服务

 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‘

执行结果
技术分享图片
技术分享图片

技术分享图片

五、总结:

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

saltstack执行state.sls耗时长的坑(代码片段)

   一直用的jenkins+saltstack自动化构建发布项目,一共也就不超过20台服务器,奈何运行时间越来越慢,并且负载越来越高(这里大部分都是使用state模块),但是不用state模块效率挺高的,所以初步锁定坑应该在state配... 查看详情

[自动化]saltstack服务配置详解(代码片段)

Saltstack简介Saltstack是一个服务器基础设施管理工具,它具有配置管理、远程执行、监控等功能。Saltstack由Python语言编写,基于C/S架构,即服务端master和客户端minions,Master和Minion之间是通过Zeromq(消息队列)进行通信的;适合大规模... 查看详情

saltstack配置管理(代码片段)

状态模块:https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#module-salt.states.file[[email protected]~]#grep-v‘^$‘/etc/salt/master|grep-v‘#‘client_acl:luo:-test.ping-network.*f 查看详情

自动化运维之saltstack(代码片段)

这次主要介绍saltstack的配置管理,这一部分在企业应用中比较重要,也经常用到。states是saltstack系统中的配置语言,在日常运维中需要编写大量的states文件,例如:创建用户、安装软件、配置软件、服务运行等。需要编写一些&qu... 查看详情

saltstack学习系列之state常用模块

常用模块:cron,cmd,file,mount,ntp,pkg,service,user,groupcmd模块参数:name:要执行的命令unless:用于检查的命令,只有unless指向的命令返回False时才执行name那行的命令cwd:执行命令时的目录,默认为rootuser:以指定用户身份运行命令group:以指定用户组... 查看详情

二saltstack常用模块和jinja模版(代码片段)

1配置管理-状态模块pkgfileserverhttps://www.unixhot.com/docs/saltstack/ref/states/highstate.html状态模块的特点:状态是不可以回滚的。写好的状态模块要支持多次执行。[[email protected]~]#cat/srv/salt/web/apache.slsapache-install:#名称声明(id声明)高 查看详情

(转)saltstack系列(代码片段)

Saltstack系列1:安装配置Saltstack系列2:Saltstack远程执行命令Saltstack系列3:Saltstack常用模块及APISaltstack系列4:Saltstack之Grains组件Saltstack系列5:Saltstack之pillar组件Saltstack系列6:Saltstack之state原文:http://www.cnblogs.com/MacoLee/c 查看详情

saltstack详解+部署apache服务(代码片段)

saltstack介绍1、saltstack是使用python语言开发的;2、轻量级的管理工具,批量执行命令;3、常用模块:pkg(包)、file(文件)、cmd(执行命令或脚本)、user、service、cron4、saltstack数据系统Grains(静态数据)pillar(动态数据)saltsta... 查看详情

saltstack之远程执行其它常用模块

练习内容远程执行其他模块官方模块有很多超过300+1.cmd.run2.network3.service4.state演示cmd.run模块可以执行系统命令,超级模块有安全隐患,也可以更模块源代码限制危险命令执行比如(rmreboot等),二次开发一般不用此模块[[email ... 查看详情

vue各文件详解——store.js

参考技术A状态管理有5个核心,分别是state、mutation、getter、action、module(1)state简单的理解,可以把state想象成组件中的data,专门用来存储数据的。如果在组件中,想要访问store中的数据,只能通过```this.$store.state.xxx来访问(2)... 查看详情

saltstack常用的模块(代码片段)

SaltStack常用的模块文章目录SaltStack常用的模块SaltStack模块介绍SaltStack常用模块SaltStack常用模块之networknetwork.active_tcpnetwork.calc_netnetwork.connectnetwork.default_routenetwork.get_fqdnnetwork.get_hostnamenetwork.get_rou 查看详情

saltstack常用的模块(代码片段)

SaltStack常用的模块文章目录SaltStack常用的模块SaltStack模块介绍SaltStack常用模块SaltStack常用模块之networknetwork.active_tcpnetwork.calc_netnetwork.connectnetwork.default_routenetwork.get_fqdnnetwork.get_hostnamenetwork.get_rou 查看详情

搭建saltstack运维工具(代码片段)

...字符串state模块定义主机状态Salt采集静态信息之GrainsSalt@(Saltstack)***所谓SaltSaltstack是由thomasHatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统.Salt有多强大!????系统管理元日常会进行大量的重复性操... 查看详情

spring之ioc核心模块详解(代码片段)

...制反转,也有一种说法叫DI(依赖注入)。IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开。什么是控制反转呢?简单的说,控制反转就是把我们要做的事情交给别人来做,就像是招了个小弟专门为我们做事情,... 查看详情

iptables详解:iptables扩展模块之state扩展

为了防止恶意攻击主动连接到你的主机我们需要通过iptables的扩展模块判断报文是为了回应我们之前发出的报文还是主动向我们发送的报文state模块可以让iptables实现连接追踪机制  NEW ESTABLISHEDRELATEDINVALIDUNTRACKED  查看详情

saltstack常用的模块续(代码片段)

SaltStack常用的模块续文章目录SaltStack常用的模块续SaltStack常用模块之filefile.accessfile.appendfile.basenamefile.dirnamefile.check_hashfile.chattrfile.chownfile.copyfile.ditectory_existsfile.diskusagefile.file_existsfile. 查看详情

saltstack常用模块介绍-service-pkg-file

 salt‘*‘sys.state_docservicesalt-minion:----------service:Startingorrestartingofservicesanddaemons==============================================Servicesaredefinedassystemdaemonstypicallystartedwi 查看详情

自动化运维saltstack系列之states配置管理和jinja模板的使用

States配置管理States是Saltstack中的配置语言,在日常进行配置管理时需要编写大量的StatesSLS文件,而编写这些SLS文件的一般步骤也就是我们平时手动配置一台服务器的步骤:首先安装源码包,然后管理一个配置文件,最后再保证这... 查看详情