saltstack是一个配置管理系统,能够维护预定义状态的远程节点
saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据
saltstack是运维人员提高工作效率、规范业务配置与操作的利器
Salt的核心功能:
使命令发送到远程系统是并行的而不是串行的
使用安全加密的协议
使用最小最快的网络载荷
提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性
SaltStack通信机制:
SaltStack采用C/S模式,由master和minion构成,master是服务器端,表示一台服务器;minion是客户端,表示有多台主机,在master上发送命令给符合条件的minion,minion就会执行相应的命令;minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口;Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口(SaltStack的master端监听4505和4506端口,4505为master和minion认证通信端口,4506为master用来发送命令或接收minion的命令执行返回信息的端口)
当客户端启动后,会主动连接master端注册,然后一直保持该TCP连接,而master通过这条TCP连接对客户端进行控制;如果断开连接,master对客户端将不能进行控制,但是,当客户端检查到连接断开后,会定期向master端请求注册连接
官网:
Support for SaltStackhttps://www.vmware.com/support/acquisitions/saltstack.html
阿里云saltstack镜像地址:
saltstack镜像-saltstack下载地址-saltstack安装教程-阿里巴巴开源镜像站阿里巴巴开源镜像站为您提供免费的saltstack下载地址及saltstack安装教程,saltstack镜像简介:saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。阿里巴巴开源镜像站https://developer.aliyun.com/mirror/saltstack?spm=a2c6h.13651102.0.0.52191b11U0d8jO配置salt官方软件仓库
此时安装salt-master时提示需要python3.6
配置CentOS镜像解决python3.6依赖
配置完成后即可成功安装
实验环境:
server51主机为salt-master IP=172.25.100.51
server52主机为salt-minion IP=172.25.100.52
server53主机为salt-minion IP=172.25.100.53
salt-master和salt-minion均需要python3.6
首先在minion端配置自己的master并启动salt-minion服务
在salt-master端查看并允许minion连接
测试:
master端和minion端的密钥认证关系:
1、远程执行shell命令
Salt命令由三个主要部分构成:
salt '
target ##指定哪些minion, 默认的规则是使用glob匹配minion id(salt '*' test.ping)target也可以使用正则表达式(salt -E 'server[1-3]' test.ping);也可以指定列表(salt -L 'server2,server3' test.ping)
funcation ##模块提供的功能,Salt内置了大量有效的functions(salt '*' cmd.run 'uname -a')
arguments ##通过空格来界定参数(salt 'server2' sys.doc pkg | salt 'server2' pkg.install httpd | salt 'server2' pkg.remove httpd)
salt内置的执行模块列表:
Full list of builtin execution moduleshttp://docs.saltstack.cn/ref/modules/all/index.html
2、配置管理
Salt状态系统的核心是SLS,或者叫SaLt State 文件
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理
sls文件命名:
sls文件以 .sls 后缀结尾,但在调用时不用写此后缀
使用子目录来做组织是个很好的选择
init.sls在一个子目录里面表示引导文件,也就表示子目录本身,所以``apache/init.sls`` 就是表示``apache``
如果同时存在apache.sls和apache/init.sls,则apache/init.sls被忽略,apache.sls将被用来表示 apache
##创建apache.sls文件;httpd==ID声明,pkg==状态声明,installed==函数声明
##指定server52主机执行
##创建top.sls文件
##使用top.sls文件批量执行apache.sls文件中的命令
关于top.sls文件:
在Salt中,包含网络上的计算机组之间的映射以及应该应用于它们的配置角色的文件称为top file
顶级文件默认命名为top.sls,它们之所以如此命名,因为它们始终存在于包含状态文件的目录层次结构的“top”,该目录层次结构称为state tree
上图为其文件格式,由三个部分组成:
环境:包含一组用于配置系统的状态文件的状态树目录
目标:一组机器,它们将应用一组状态
状态文件:要应用于目标的状态文件列表;每个状态文件都描述了要在目标计算机上配置和强制执行的一个或多个状态
这三个组件之间的关系嵌套:环境包含目标,目标包含状态文件
##/srv/salt目录下同时存在apache.sls和apache/init.sls
##apache/init.sls文件被忽略,执行当前目录下的apache.sls文件
##minion端的状态文件缓存位置
3、编写远程执行模块
##创建模块目录并编写模块文件
##同步模块
##运行模块
关于YAML语法规则
【1】缩进:Salt需要每个缩进级别由两个空格组成,不使用tab
【2】冒号:字典的keys在YAML中的表现形式是一个以冒号结尾的字符串(my_key: my_value)
【3】短横杠:想要表示列表项,使用一个短横杠加一个空格(- list_value_one)
1、grains简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端;当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新;由于Grains是静态数据,因此不推荐经常去修改它
应用场景:信息查询,可用作CMDB;在target中使用,匹配minion;在state系统中使用,配置管理模块
2、信息查询
用于查询minion端的IP、FQDN等信息,默认可用的grains可以通过 salt
查看每一项的值:salt
查看单项的值:salt
3、自定义grains
在minion端配置文件中自定义grains.roles的值,重启salt-minion服务
在master端取值
在minion端配置目录下建立grains文件自定义grains.roles的值,不用重启salt-minion服务
在master端同步minion端数据后取值
在master端创建文件自定义grains
同步数据至minion端并取值
在target中匹配minion
1、pillar简介
pillar和grains一样也是一个数据系统,但是应用场景不同;pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息;pillar更加适合在配置管理中运用
2、声明pillar
在master端定义pillar基础目录,此路径是master配置文件中的默认指定路径
3、自定义pillar
在master端自定义pillar,查看pillar项的键值
刷新pillar数据,测试pillar数据匹配
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作,通过jinja模板可以为不同服务器定义各自的变量;两种分隔符:{% ... %} 和 {{ ... }},前者用于执行诸如for循环或赋值的语句,后者把表达式的结果打印到模板上
##Jinja最基本的用法是使用控制结构包装条件
##测试
##jinja模板在sls文件中的使用(-1表示ipv4值中的倒数第一个元素,-2为倒数第二个元素,0=正数第一个,1=正数第二个,以此规律类推),watch表示监控下方文件,有变化后会重启service.running模块下对应的服务
##测试
##为server52、server53定义不同的pillar变量
##在state文件中引用grains和pillar变量
##测试
以上配置apache的state文件可以优化为以下格式
1、Job简介
master在下发指令任务时,会附带上产生的jid,minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生以该jid命名的文件,用于在执行过程中master查看当前任务的执行情况,minion端指令执行完毕将结果传送给master后,会删除该临时文件
Job缓存默认保存24小时: # vim /etc/salt/master keep_jobs: 24
master端Job缓存目录:/var/cache/salt/master/jobs
2、把Job存储到数据库
##在minion端配置返回数据库端的基本信息,重启salt-minion
##在master端安装数据库并启动
##往数据库导入数据,创建库和表(salt.sql文件内容见:salt.returners.mysql)
##创建数据库用户salt并授权
##在minion端搭建pip源(pip是python的包管理器,此工具允许用户安装和管理不属于标准库的其他库软件和依赖)
##安装所需依赖包
##pip3安装mysql和mysqlclient
##重启salt-minion端服务后,在master端测试
##查看master端上述测试的job缓存,发现job中的数据成功返回至数据库中
##在master端配置将自身的job缓存也返回至数据库中
##测试返回成功,此处因为未配置server53主机的mysql客户端,因此少一份master端关于server53主机的状态回执数据
关于mysql数据库接口:
MySQL-python又叫MySQLdb,是 Python连接MySQL最流行的一个驱动,很多框架都也是基于此库进行开发,遗憾的是它只支持Python2.x,不支持Python3;Python-MySQL资格最老,核心由C语言打造,接口精炼,性能最棒,缺点是环境依赖较多,安装复杂,近两年已停止更新
由于MySQL-python年久失修,后来出现了它的Fork版本mysqlclient,完全兼容MySQLdb,同时支持Python3.x
故以上实验中需要配置pip源安装mysqlclient
1、salt-ssh
salt-ssh可以独立运行,不需要minion端;使用sshpass进行密码交互,其以串行模式工作,性能下降
##在salt-ssh的配置文件中指定主机及用户和密码
##停掉对应主机的salt-minion服务进行测试
##可在roster文件中只指定主机和用户,在运行salt-ssh是添加-i参数手动输入密码执行
2、salt-syndic
syndic其实就是个代理,隔离master与minion;Syndic必须要运行在master上,再连接到另一个Topmaster上,Topmaster下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster;topmaster并不知道有多少个minion;syndic与topmaster的file_roots和pillar_roots的目录要保持一致
环境搭建:
server54主机作为topmaster端 IP=172.25.100.54
server51主机作为下级master IP=172.25.100.51
server52主机未salt-minion端 IP=172.25.100.52
server53主机为salt-minion端 IP=172.25.100.53
##topmaster端配置
##syndic-master端配置
##在topmaster端列出的节点是下级master,但操作远程执行是则是minion端返回的回执
##也可以指定minion远程执行
##topmaster和syndic-master的配置文件/etc/salt/master中此部分设定需要保持一致,上述实验中此部分内容均未做更改且其未注释语句,则不用考虑此问题
1、salt-api简介
SaltStack官方提供有REST API格式的salt-api项目,将使Salt与第三方系统集成变得尤为简单
官方提供了三种api模块:rest_cherrypy | rest_tornado | rest_wsgi
官方链接:
netapi moduleshttps://docs.saltproject.io/en/latest/ref/netapi/all/index.html2、salt-api配置
##安装salt-api
##生成证书
##生成用户认证文件;激活rest_cherrypy模块;重启salt-master,salt-api
3、salt-api使用
##获取认证token
##推送任务测试(token为上图命令获取到的值)
python脚本调用saltapi
调用输出: