@


所谓Salt

Saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统.

Salt有多强大!



    系统管理元日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等,如果主机数量庞大, 单靠人工维护是在让人难以忍受.



    早期的运维人员会根据生产环境编写特定的脚本来完成大量的重复性工作,这些脚本复杂且难以维护,系统管理员面临的问题主要是系统配置管理、远程执行命令。因此而诞生了很多开源软件,系统维护方面的有fabricpuppetchefansibleSaltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行.



    Salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署,Salt的设计构造适用于任意数量的服务器,从少量本地网络系统到跨越整个数据中心,扩扑架构都是C/S模型,配置简单.



    不管是几台、几百台、几千台服务器,都可以使用Salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令.



    Salt是使用Python语言编写的,支持用户通过Python自定义功能模块,也提供了大量的Python API接口,用户可以根据需要进行简单快速的扩展.



Saltstack运行方式

  • Local本地运行,交付管理
  • Master/Minion 常用管理
  • Salt SSH 不需要客户端

Saltstack部署基本架构



在开始搭建之前,先理解Salt结构中各个角色:

主要区分salt-mastersalt-minion,前者是中心控制系统,后者是被管理的客户端.



在远程执行系统中,Salt用Python通过函数调用完成任务.


开始搭建

搭建环境

  • 192.168.43.43 master
  • 192.168.43.100 slave01
  • 192.168.43.200 slave02

安装Saltstack



Salt软件包需要epel源的支持,那么下载:

(EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。)

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all #清空缓存
yum makecache #生成yum缓存

搞定后,开始在对应的服务器上安装对象的包:

yum -y install salt-master  # 中心控制系统
yum -y install salt-minion # 被管理的客户端

Salt端口



安装好Salt后开始配置,其中salt-master默认监听两个端口:

  • publish_port 4505 提供远程命令发送功能
  • ret_port 4506 提供认证,文件服务,结果收集等功能

Salt配置文件



配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面.

salt-master的配置文件为/etc/salt/master.

salt-minion的配置文件为/etc/salt/minion.



salt-master

# ⚠️冒号":"后面必须留一个空格

# 绑定到本地的0.0.0.0地址
interface: 0.0.0.0 # 运行salt程序的用户,影响到salt的执行权限
user: root # salt的运行线程,开的线程越多一般处理的速度越快,但一般不要超过CPU的个数
worker_threads: 10 # master的管理端口
publish_port: 4505 # master跟minion的通讯端口,用于文件服务,认证,接收返回结果等
ret_port: 4506 # 如果这个master运行的salt-syndic连接到了一个更层级别的master
# 那么这个参数需要配置成连接到这个高层级别的master的监听端口
syndic_master_port: 4506 # 指定pid文件位置
pidfile: /var/run/salt/master.pid

salt-minion

# minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
id: slave01
# 这里展示的slave01主机的配置文件,slave02主机的id为slave02 # salt运行的用户权限
user: root # master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
master : master # master通信端口
master_port: 4506 # 备份模式,minion是本地备份,当进行文件管理时的文件备份模式
backup_mode: minion # 执行salt-call时候的输出方式
output: nested # minion等待master接受认证的时间
acceptance_wait_time: 10 # 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试
acceptance_wait_time_max: 0 # 重新认证延迟时间,可以避免因为master的key改变导致minion需要重新认证的syn风暴
random_reauth_delay: 60 # 日志文件位置
log_file: /var/logs/salt/minion.log

配置文件写好之后,还需要指明主机名与其ip的对应关系,可通过在/etc/hosts文件添加主机信息:

192.168.1.100 slave01
192.168.1.200 slave02
# 这里展示的master的hosts文件,slave服务器的hosts文件请添加上对应的主机与IP

修改后,在对应的服务器上启动对应的服务:

systemctl start salt-master
systemctl start salt-minion

配置接受密钥

salt-key的参数



在接受密钥之前,我们先来看看它有那些参数:

  • -L 查看KEY状态
  • -A 认证所有密钥
  • -D删除所有密钥
  • -a认证指定的key
  • -d删除指定的key
  • -r注销掉指定的key(该状态为未被认证)

开始接受密钥


启动minion后,minion会自动去寻找连接master,并请求master为其签发证书.

待证书签发完成后,master便会信任minion,此时便可通信,它们之间的通信是加密的.



salt-key命令用于管理minion密钥,在master执行:





在master上查看minion的密钥信息:

# '*'代表所有salve主机
[root@fedora ~]# salt-key -f '*' # 还可以指定某一个主机
[root@fedora ~]# salt-key -f slave01</font>

在minion上查看master的密钥信息:

[root@slave01 ~]# salt-call --local key.finger

确认密钥匹配后,在master上接受密钥:

# -A:将允许所有的salve
[root@fedora ~]# salt-key -A -y # -a:将允许指定的salve
[root@fedora ~]# salt-key -a slave01



此时已经成功接受了密钥.





我们再来看看密钥信息:


salt命令

日常命令参数



首先要知道master和minion都安装了那些文件,然后才知道怎么操作.



master端

[root@fedora ~]# rpm -ql salt-master
/etc/salt/master # salt master主配置文件
/usr/bin/salt # salt master核心操作命令
/usr/bin/salt-cp # salt文件传输命令
/usr/bin/salt-key # salt证书管理
/usr/bin/salt-master # salt master服务命令
/usr/bin/salt-run # salt master runner命令

slave端

[root@slave01 ~]# rpm -ql salt-minion
/etc/salt/minion # minion配置文件
/usr/bin/salt-call # 拉取命令
/usr/bin/salt-minion # minion服务命令
/usr/lib/systemd/system/salt-minion.service # minion启动脚本

开始你的salt命令


test.ping

# 检测目标主机是否存活
[root@fedora ~]# salt '*' test.ping
slave01:
True
slave02:
True
# '*'表示所有主机,将返回所有主机是否存活,也可以指定某一个主机.
# test.ping是salt远程执行的一个模块下面的方法.

test.ping是条很简单的探测minion主机收否存活的命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活.



test.echo

[root@fedora ~]# salt slave01 test.echo 'is ok'
slave01:
is ok

test.fib

[root@fedora ~]# salt slave02 test.fib 8
slave02:
|_
- 0
- 1
- 1
- 2
- 3
- 5
- 2.86102294922e-06

test.fib可生成斐波那契数列.

斐波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和.


test模块实际上还有许多其它的函数,可通过salt '*' sys.list_functions test查看.

salt命令组成结构

  • 在命令行输入的命令都是 执行模块.
  • 等到命令写入到文件中 就叫做状态模块.

完整的五部分命令:

# --summary参数显示salt命令的概要
[root@fedora ~]# salt --summary '*' cmd.run > 'hostname'
slave02:
slave02
slave01:
slave01 -------------------------------------------
Summary
-------------------------------------------
# of Minions Targeted: 2
# of Minions Returned: 2
# of Minions Did Not Return: 0
-------------------------------------------

sys模块用于与系统交互,下面的命令将列出所有salt的sys模块:

[root@fedora ~]# salt '*' sys.list_modules

远程执行命令模块


cmd

一个超级模块,所有shell命令都能执行:

[root@fedora ~]# salt 'slave01' cmd.run hostname
slave01:
slave01 # 还可以使用cmd.run_all返回更详细的信息:
[root@fedora ~]# salt 'slave01' cmd.run_all hostname

pkg

用于安装软件,其底层调用的是yum工具:

# 在slave01上安装nginx
[root@fedora ~]# salt 'slave01' pkg.install "nginx"
# 卸载slave01上的nginx
[root@fedora ~]# salt 'slave01' pkg.remove "nginx"
# 检查pkg包的版本
[root@fedora ~]# salt 'slave01' pkg.version "nginx"

server

用于管理服务:

[root@fedora ~]$salt 'slave' service.start "nginx"
slave:
True
[root@fedora ~]$salt 'slave' service.status "nginx"
slave:
True
[root@fedora ~]$salt 'slave' service.stop "nginx"
slave:
True

关于 --out=json 与--out=yaml


--out=json

# 返回的数据是Json类型,如下
[root@fedora ~]# salt --out=json 'slave01' cmd.run 'hostname'
{
"slave01": "slave01"
}

--out=json

[root@fedora ~]# salt --out=yaml 'slave01' cmd.run 'hostname'
slave01: slave01


YAML详解

在学习Saltstack过程中,第一要点就是States编写技巧,简称SLS文件,这个文件遵循YAML语法.

json、xml、yaml都是数据序列化格式,yaml容易被解析,应用于配置文件.

Salt的配置文件就是yaml格式,不能使用tab键.

还有saltstackk8sansible都用的yaml格式配置文件.

YAML语法规则

  • 大小写敏感
  • 使用缩进表示层级关系,缩进不可用tab键
  • 缩进的空格数不重要,相同层级的元素左侧对其即可
  • "#"号表示注释行

YAML是YAML Ain't Markup Language的首字母缩写,YAML的语法简单:

结构体通过空格展示

项目使用 - 代表

键值对通过 : 分割

YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,不可使用tab键.

YAML与JSON格式对比


YAML

first_key:
second_key:second_value

JSON

{
'first_key':{
'second_key':'second_value',
}
}

短横杠


YAML语法表示列表,使用一个横杠加一个空格,多个项使用同样的缩进级别作为同一个列表的部分,如下图:





列表可以作为一个键值对的value,例如一次性要安装多个软件:


目标定位字符串

之前的salt命令我们都是使用salt '*'控制所有minion,并且我们只有两台minion,但是生产环境的服务器很可能是成千上百的minion,因此需要灵活地定位所需的服务器并且执行远程命令.

全局匹配

[root@fedora ~]# salt '*' test.ping
slave01:
True
slave02:
True

Linux通配符

  • * 代表任意字符,或空字符串
  • ? 代表任意一个字符,不可以为空
  • [a-z] 任何一个小写字母
  • [0-9] 任何一个数字

示例:

[root@fedora ~]# salt 'slave0[1-2]' test.ping
[root@fedora ~]# salt 'slave0?' test.ping
# 以上两条都可以匹配到slave01和slave02主机

state模块定义主机状态

之前执行的远程命令,都是一个过程式的,类似一段shell或者python脚本执行,执行一次触发一次相同的功能.

那么大量的minion上运行远程命令就必须使用salt提供的“状态管理”了,状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态.

下面我们将通过state模块来部署nginx


打开master的配置文件/etc/salt/master,加入如下配置:

# 必须严格遵循语法,空格,不可用tab键
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
test:
- /srv/salt/test
prod:
- /srv/salt/prod
# 修改master配置文件后重启服务

创建文件夹(此步骤master与minion都要执行):

# 在master和minion上都要创建:
mkdir -p /srv/salt/{base,dev,test,prod}

/srv/salt/base下创建nginx.sls文件,其文件内容如下(此步骤master与minion都要执行):

nginx-install:
pkg.installed:
- name: nginx nginx-service:
service.running:
- name: nginx
- enable: True

此时用state模块部署nginx软件,通过我们编写的nginx.sls描述性配置文件,命令行调用state模块的sls函数:

# 启动命令,执行后nginx将被安装且激活,可进行状态管理
[root@fedora ~]# salt 'slave01' state.sls nginx

解释下nginx.sls描述文件:

sls配置文件都遵循YAML语言描述

第一条命令使用了pkg.install安装命令,相对于运行了yum install,而此时state模块会判断nginx是否安装了,如果没有安装就进行安装,安装了就什么都不做.

状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一就会执行此功能,这种性质叫做幂等性.


Salt采集静态信息之GrainsSalt

【搭建Saltstack运维工具】的更多相关文章

  1. Linux基础—saltstack运维工具学习

    一.saltstack简介 1.saltstack是什么 系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等,如果主机数量庞大,单靠人工维护实在让人难以忍受. ...

  2. saltstack运维工具

    salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会进行大量的重复性操作,例如安装软 ...

  3. saltStack运维工具的部署及master迁移实现的过程详解

    服务器端:192.168.3.87 客户端:192.168.3.86.192.168.3.108 1.salt服务器端安装 192.168.3.87 rpm -Uvh http://mirrors.y ...

  4. 自动化运维工具 SaltStack 搭建

    原文地址:https://www.ibm.com/developerworks/cn/opensource/os-devops-saltstack-in-cloud/index.html#N10072 ...

  5. linux自动化运维工具Ansible saltstack Puppet、Chef、Fabric之间的对比

    发现分布式是一个发展的趋势,无论是大型网站的负载均衡架构还是大数据框架部署,以及云存储计算系统搭建都离不开多台服务器的连续部署和环境搭建. 当我们的基础架构是分散式或者基于云的,并且我们经常需要处理在 ...

  6. 自动化运维工具SaltStack详细部署

    ==========================================================================================一.基础介绍==== ...

  7. 自动化运维工具SaltStack详细部署【转】

    ==========================================================================================一.基础介绍==== ...

  8. 企业级自动化运维工具应用实战-ansible

    背景 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运 ...

  9. CheungSSH国产自动化运维工具开源Web界面

    CheungSSH web2.0 发布文档 CheungSSH 简介 CheungSSH是一款国人自主研发的Linux运维自动化管理服务器软件,秉着为企业降低运营成本,解放管理员双手和自动化生产的理念 ...

随机推荐

  1. Java的TreeMap,C++的lower_bound,合并间隔

    https://leetcode.com/problems/data-stream-as-disjoint-intervals/?tab=Description 这道题目是合并间隔的经典题目. htt ...

  2. quick-cocos2d-x游戏开发【2】——项目结构分析、创建新场景

    创建完一个新项目之后,我们能够简单的看一看这个项目的文件组成,有这么一个文件层次结构 几个proj.*目录就不用说了,是相应的平台的解决方式,res专门存放我们的游戏资源.scripts存放我们的lu ...

  3. 用DOM动态控制表格

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. Connect to MongoDB

    https://docs.mongodb.com/getting-started/csharp/client/ MongoDB C# Driver is the officially supporte ...

  5. xss  多分类 优选 贝叶斯、逻辑回归、决策树

    import re import numpy as np from sklearn import cross_validation from sklearn import datasets from ...

  6. spark groupByKey 也是可以filter的

    >>> v=sc.parallelize(["one", "two", "two", "three", ...

  7. HDFS的配额

  8. 利用js与java交互

    为了方便网页和应用的交互,安卓系统WebView提供JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法即可映射一个Java对象到JavaSc ...

  9. RMAN备份脚本--DataGuard primary

    单机环境全备   export ORACLE_BASE=/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACL ...

  10. SSD-tensorflow-2 evaluation

    测试就是用voc2007的test set来测试已经训练好的checkpoint的mAP,github上提供了三个已经训练好的model的checkpoint checkpoint 里面已有的300_ ...