ITPub博客

首页 > 数据库 > 数据库开发技术 > 干货篇 | 自动化运维工具-saltstack(中)

干货篇 | 自动化运维工具-saltstack(中)

原创 数据库开发技术 作者:咸鱼运维杂谈 时间:2022-07-23 17:15:00 0 删除 编辑

在上一篇文章《干货篇 |  自动化运维工具-saltstack(上)》中,向大家介绍了saltstack是什么,它与ansible的区别以及部署了一台master和两台minion


那么今天我将继续为大家介绍saltstack


话不多说,开始进入正题



基础命令


  • salt


用来执行salt命令,通常在master端运行。

salt [option] '<target>' <function> [arguments]例如:salt 'minion1' cmd.run '192.168.244.128''minion1' 是指在那些minion上操作;cmd是一个执行模块;test是模块下的函数;'192.168.244.128'是test函数的参数,有的函数需要参数,有的不需要
#查看帮助文档salt -dsalt '*' sys.docsalt 'x' sys.doc test
#查看service相关模块命令salt -d | grep service
#获取主机所有服务salt '*' service.get_all
#重载sshd服务salt '*' service.reload sshd
#显示软件包版本列表salt '*' pkg.list_pkgs
#显示软件包版本信息salt '*' pkg.version python
#安装软件包salt '*' pkg.install httpd
#查看mysql服务状态salt 'node1.com' service.status mysql
#启动mysql服务salt 'node1.com' service.start mysql
#与上面一样查看服务salt 'node1.com' cmd.run 'service mysql status'
#模块列表salt '*' sys.list_modules
#把salt-master端相应的文件,分发文件到minion端salt '*' cp.get_file salt://ceshi/b /tmp/test
#把salt-master端相应的目录,分发文件到minion端salt '*' cp.get_dir salt://zabbix /tmp
#把salt-master端对应文件拷贝到minion端相应目录下salt '*' file.copy /tmp/zabbix.sls /tmp/sls
#远程命令执行测试salt '*' cmd.run 'uptime'
#查看grains分类salt '*' grains.ls
#查看grains所有信息salt '*' grains.items
#查看grains某个信息salt '*' grains.item osrelease


  • salt-run


saltstack提供了Runners的功能,使用salt-run来运行,可以非常方便地在Master端执行相关的模块,获取minion端状态。salt-run下的很多模块我们用不到,多数我们可以通过salt命令就已经完成工作需要


常用的runner有manage


#查看存活的minionsalt-run manage.up
#查看死掉的minionsalt-run manage.down
#查看down掉的minion,并将其删除salt-run manage.down removekeys=True
#查看minion的相关状态salt-run manage.status
#查看slat的所有master和minion的版本信息salt-run manage.versions


  • salt-key


用于密钥管理,来决定master与minion之间的通信,通常在master端执行



  • salt-call


在minion执行,minion执行自己可以执行的模块,而不是通过master下发job


salt-call [options] <function> [arguments]##自己执行test.ping命令salt-call test.ping
##自己执行cmd.run函数salt-call cmd.run 'ifconfig'


  • salt-cp


通过salt-cp可以将master上的文件下发到minion上


salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
#把master上的index.html分发到test minion上salt-cp 'test*' index.html /tmp/a.html
#把master上的hosts文件分发到所有主机salt-cp '*' /etc/hosts /etc/hosts



分组管理


在生产环境中我们可能要管理上百台服务器,有些服务器用来做数据库,有些服务器用来实现web服务,有些做负载均衡......


我们如果想对web服务器做批量操作的话,而web服务器又有几十台,我们是不可能将这几十台服务器的ip地址全都敲进命令里的,这样会大大降低运维效率


我们可以对这些服务器做分组,用来做负载均衡的分成一组、做web服务的分成一组,那么我们操作时只需要指定组名就可以了


在saltstack里我们一般用nodegroups来实现分组管理


Nodegroups


我们通过创建nodegroups配置文件来实现分组管理,配置文件的路径为


 /etc/salt/master.d/nodegroups.conf



对目标服务器分组有以下七种方式,这七种方式的标示符分别为


G -- 针对 Grains 做单个匹配,例如:G@os:Ubuntu
E -- 针对 minion 针对正则表达式做匹配,例如:E@web\d+.(dev|qa|prod).loc
P -- 针对 Grains 做正则表达式匹配,例如:P@os:(RedHat|Fedora|CentOS)
L -- 针对 minion 做列表匹配,例如:L@minion1.example.com,minion3.domain.com orbl*.domain.com 使用 L 列表的方式,必须把 minion 列出来,或者是列出几台后,在后面接 or 或者 and 表达式, or 或者 and 后面接的表达式后面可以使用正则表达式。
I -- 针对 Pillar 做单个匹配,例如:I@pdata:foobar
S -- 针对子网或是 IP 做匹配,例如:S@192.168.1.0/24 or S@192.168.1.100
R -- 针对客户端范围做匹配,例如:R@%foo.bar
N -- 针对 nodegroup 做匹配


如果说我有多个分组,可以按照下列格式进行配置


[root@master ~]#vim /etc/salt/master.d/nodegroups.confnodegroups:group1: 'L@192.168.244.128,192.168.244.130'group2: 'L@192.168.244.100'group3: 'S@192.168.64.0/24'group4: 'E@192.168.64.12[2-3]'
[root@master ~]#salt -N group1 test.ping


案例:

[root@master ~]# vim  /etc/salt/master.d/nodegroup.confnodegroups:  web: 'L@192.168.244.128,192.168.244.129'  [root@master ~]# salt -N web test.ping192.168.244.129:    True192.168.244.128:    True


或者通过E匹配模式来做分组管理


[root@master ~]# vim  /etc/salt/master.d/nodegroup.confnodegroups:  group1: 'E@192.168.244.12[8-9]'
[root@master ~]# salt -N group1 test.ping192.168.244.129: True192.168.244.128: True



SLS


SLS(Salt State文件)是Salt State系统的核心。SLS描述了系统的目标状态,SLS文件由格式简单的数据构成,经常被称作配置管理


SLS文件以“.sls”后缀结尾,但在调用时不需要写后缀


1.YAML


SLS配置文件采用YAML的格式编写


下面是YAML格式的一些要求


  1. .在YAML中不要使用Tab键来作为缩进
  2. .YAML推荐缩进为2个空格,’ : ’ , ’ - ’后面缩进1个空格再写
  3. 数字会解析成数字。如mode: 0644会解析成mode: 644,可用单引号括起来防止mode: ’0644ʹ此情况
  4. .YAML不允许双简写
  5. 下划线将会被删除。有出现下划线要用 " " 括起来

基本格式例子

http-install:  pkg:    - installed
#第一行被称为标签定义,在这里被定义为安装包的名#第二行被称为状态定义,在这里定义使用module#第三行被称为函数定义,在这里定义使用调用函数

[root@master ~]#vim /srv/salt/apache.slshttp-install: # ID声明 也是软件包名称 自定义  pkg.installed: # 模块以及函数声明    - pkgs:            - httpd   # 参数声明
指定主机执行:[root@master ~]#salt server5 state.sls apache 文件后缀不用添加

SLS配置文件在master上,默认路径是在/srv/salt/下面,使用子目录来管理是个很好的选择,init.sls在一个子目录里面表示引导文件,也就表示子目录本身,所 以 apache/init.sls 就是表示 apache

例如文件树如下所示:

[root@master ~]#tree /srv/salt/apache| --install.sls||--_modules

#第一种写法[root@master ~]# salt “*” state.sls apache/install
#第二种写法[root@master ~]# mv install.sls init.sls[root@master ~]# salt “*” state.sls apache
#同时存在apache/apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache/srv/salt/apache| --install.sls|| --apache.slssalt “*” state.sls apache #优先读取apache.sls此文件

2.常用模块

用户管理

  • 创建用户

useradd:  user.present:    -name: admin    - shell: /bin/bash    - home: /home/admin    - uid: 888

  • 删除用户

userdel:  user.absent:    - name: admin    - purge: True   #purge类似userdel -r    - force: True   #force为用户在线也强制删除


文件管理


  • 上传文件


fileup:  file.managed:    - source: salt://nginx/nginx-xxx.xxx.tar.gz    - user: root    - group:root    - mode: 755    - backup:minion    - template:jinja
  • 追加文件


fileadd:  file.append:    - text:      - "exportJAVA_HOME=/usr/local/jdk1.6.0_13"      - "exportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH"      - "exportCLASSPATH=$JAVA_HOME/lib/:$JAVA_HOME/jre/lib:$CLASSPATH"


目录管理


  • 目录覆盖


dircover:  file.recurse:    -source: salt://nginx/conf    -user: root    -group: root    -file_mode: 644    -dir_mode: 755


  • 目录创建


diradd:  file.directory:    - name: /tmp/dir    - user: web    - group: web    - file_mode:644    - dir_mode:755    - makedirs:True    - include_empty: True    - template:jinja    - backup:minion


包管理


  • yum安装

installpkgs:  pkg.installed:    - pkgs:      - httpd      - telnet


3.逻辑关系


  • 继承(include)


include:  - web.apache


  • 依赖(require)


- require:  - pkg: nginx-install



  • 监控(watch)


在某个state变化时运行此模块,文中的配置,相关文件变化后,立即执行相应操作

- watch:  - file: /etc/nginx/nginx.conf  - file: /etc/nginx/fastcgi.conf  - pkg: nginx


  • 顺序(order)


优先级比require和watch低,有order指定的state比没有order指定的优先级高,假如一个state模块内 安装多个服务,或者其他依赖关系,可以使用。如果想让某个state最后执行,可以使用last。

nginx:  pkg.installed:    - order:1



4.SLS文件执行顺序


  • top.sls


top.sls 是配置管理的入口文件,一切都是从这里开始,在master主机上默认路径为/srv/salt/目录


top.sls 默认从 base 标签开始解析执行,下一级是操作的目标,可以通过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件,不包换扩展名


一般对minion进行初始化操作时用top.sls比较多


通过正则进行匹配的示例

[root@master ~]# vim /srv/salt/top.slsbase:  '*':    - tengine    [root@master ~]# salt '192.168.244.128' state.highstate


通过分组名进行匹配的示例(必须要有 - match: nodegroup)

base:  group1:    - match: nodegroup        - web


通过grain模块匹配的示例(必须要有- match: grain)


base:  'os:Fedora':    - match: grain    - web


  • init.sls


init.sls在一个子目录里面表示引导文件,我们可以在init.sls里面通过include模块来决定sls文件执行顺序


include:  - tengine.make  - tengine.install



案例



文件树如下

[root@master ~]# tree /srv/salt/tengine| --top.sls| --init.sls| --install.sls| --make.sls| --files     | --tengine-2.3.1.tar.gz


top.sls

base:  '*':    - tengine


init.sls

include:  - tengine.make  - tengine.install


make.sls

pkg-init:  pkg.installed:    - pkgs:    - automake    - gcc-c++    - zlib-devel    - openssl-devel    - pcre-devel


install.sls

include:  - tengine.make
tengine_source: file.managed: - name: /tmp/tengine-2.3.1.tar.gz - unless: test -e /tmp/tengine-2.3.1.tar.gz - source: salt://tengine/files/tengine-2.3.1.tar.gz
extract_tengine: cmd.run: - cwd: /tmp - names: - tar zxf tengine-2.3.1.tar.gz - unless: - test -d tengine-2.3.1 - require: - file: tengine_source
tengine_compile: cmd.run: - cwd: /tmp/tengine-2.3.1 - names: - ./configure --prefix=/usr/local/tengine && make && make install - require: - cmd: extract_tengine - unless: test -d /usr/local/tengine


执行命令

salt '192.168.244.128' state.highstate



总结


今天向大家介绍了saltstack的一些基础命令,如何实现分组管理以及SLS相关内容


下一篇我将为大家介绍saltstack中的Grains和Pillar




扫码
关注

原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
最新的技术文章首先发布在微信公众号:咸鱼运维杂谈 擅长Linux系统维护、开源软件维护、自动化运维等领域,博客主要偏向于学习笔记及经历分享

注册时间:2021-05-29

  • 博文量
    193
  • 访问量
    84240