在上一篇文章《干货篇 | 自动化运维工具-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 DESTsalt-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:UbuntuE -- 针对 minion 针对正则表达式做匹配,例如:E@web\d+.(dev|qa|prod).locP -- 针对 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:foobarS -- 针对子网或是 IP 做匹配,例如:S@192.168.1.0/24 or S@192.168.1.100R -- 针对客户端范围做匹配,例如:R@%foo.barN -- 针对 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(Salt State文件)是Salt State系统的核心。SLS描述了系统的目标状态,SLS文件由格式简单的数据构成,经常被称作配置管理
SLS文件以“.sls”后缀结尾,但在调用时不需要写后缀
1.YAML
SLS配置文件采用YAML的格式编写
下面是YAML格式的一些要求
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 文件后缀不用添加
[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此文件
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
base:group1:- match: nodegroup- web
base:'os:Fedora':- match: grain- web
init.sls
init.sls在一个子目录里面表示引导文件,我们可以在init.sls里面通过include模块来决定sls文件执行顺序
include:- tengine.make- tengine.install
文件树如下
[]| --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.maketengine_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.gzextract_tengine:cmd.run:- cwd: /tmp- names:- tar zxf tengine-2.3.1.tar.gz- unless:- test -d tengine-2.3.1- require:- file: tengine_sourcetengine_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

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