原文: http://106.13.73.98/__/108/
@(Saltstack)
***
所谓Salt
Saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统
.
Salt有多强大!
系统管理元日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等,如果主机数量庞大, 单靠人工维护是在让人难以忍受.
早期的运维人员会根据生产环境编写特定的脚本来完成大量的重复性工作,这些脚本复杂且难以维护,系统管理员面临的问题主要是系统配置管理、远程执行命令。因此而诞生了很多开源软件,系统维护方面的有fabric
、puppet
、chef
、ansible
、Saltstack
等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行.
Salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署,Salt的设计构造适用于任意数量的服务器,从少量本地网络系统到跨越整个数据中心,扩扑架构都是C/S模型,配置简单.
不管是几台、几百台、几千台服务器,都可以使用Salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令.
Salt是使用Python语言编写的
,支持用户通过Python自定义功能模块,也提供了大量的Python API接口,用户可以根据需要进行简单快速的扩展.
Saltstack运行方式
- Local本地运行,交付管理
- Master/Minion 常用管理
- Salt SSH 不需要客户端
Saltstack部署基本架构
在开始搭建之前,先理解Salt结构中各个角色:
主要区分salt-master
和salt-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-06test.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键.
还有saltstack
、k8s
、ansible
都用的yaml格式配置文件.
YAML语法规则
- 大小写敏感
- 使用缩进表示层级关系,缩进不可用tab键
- 缩进的空格数不重要,相同层级的元素左侧对其即可
- "#"号表示注释行
YAML是YAML Ain't Markup Language的首字母缩写,YAML的语法简单:
结构体通过空格展示
项目使用-
代表
键值对通过:
分割
YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,不可使用tab键.
YAML与JSON格式对比
***
YAMLfirst_key: second_key:second_valueJSON
{ '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
待
其他
- MongoDB Linux下载: http://dl.mongodb.org/dl/linux/x86_64