当前位置: 代码迷 >> 综合 >> Saltstack--部署keepalived、Job管理、salt-ssh 、salt-syndic、salt-api
  详细解决方案

Saltstack--部署keepalived、Job管理、salt-ssh 、salt-syndic、salt-api

热度:9   发布时间:2023-12-24 23:10:34.0

目录

  • 一、自动部署keepalived
  • 二、Job管理
    • 把Job存储到数据库
  • 三、salt-ssh
  • 四、salt-syndic
  • 五、salt-api配置

一、自动部署keepalived

实验环境:server1给server2/3部署keepalived,使得server2为keepalived的master,server3为keepalived的backup。
在salt目录下建立keepalived目录
请添加图片描述
将sever2的keepalived配置文件传给server1
请添加图片描述
此时可以看到server1上的keepalived服务端口已经开启
请添加图片描述
修改keepalived配置文件如下,vip为172.25.36.100;
#需要注释到,keepalived自带火墙策略,不注释就会404访问不了;
考虑到,master和backup的配置文件中的参数不同,所以同时推的时候需要借助变量,就要用到pillar
请添加图片描述
编写init.sls文件

  • template: jinja:添加jinja模板
  • context:
    STATE: { { pillar[‘state’] }}:变量state赋予STATE
    VRID: { { pillar[‘vrid’ ]}}:变量vrid赋予VRID
    PRI: { { pillar[‘pri’] }}:变量pri赋予PRI
    请添加图片描述
    在/srv/pillar/top.sls文件中,需要添加kp模块;
    将pkg.sls文件改名为kp.sls
    请添加图片描述
    编写kp.sls文件,如果主机名是server2,状态为master,vrid为36,优先级为100;如果主机名是server3,状态为backup,vrid为36,优先级为50
    请添加图片描述
    salt ‘’ state.sls keepalived 推送
    请添加图片描述
    查看minion端的日志,server2是master,server3是backup
    请添加图片描述
    请添加图片描述
    此时vip在server2上
    请添加图片描述
    修改base下的top.sls文件,角色为apache的主机(server3)匹配后,执行keepalived模块;角色为nginx的主机(server2)匹配后,执行keepalived模块。
    请添加图片描述
    将之前设定的lib.sls文件的http_port改为80
    请添加图片描述
    设置完毕,salt ‘
    ’ state.highstate 高推,curl成功
    请添加图片描述
    此时若是把server2的keepalived停掉,测试高可用
    请添加图片描述
    会发现vip飘到了server3上
    请添加图片描述
    真机测试
    请添加图片描述
    此时重新推送一下
    请添加图片描述
    会发现server2的keepalived又重新恢复为master,vip飘到了server2上了!
    请添加图片描述

二、Job管理

1、Job简介:
master在下发指令任务时,会附带上产生的jid。
minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。
指令执行完毕将结果传送给master后,删除该临时文件。
2、Job缓存默认保存24小时:
vim /etc/salt/master中keep_jobs: 24h默认值
master端Job缓存目录:/var/cache/salt/master/jobs
请添加图片描述

把Job存储到数据库

方式一:minion端存入数据库:minion端在返回数据给master时,也会给数据库一份
在这里插入图片描述

首先在server1中安装并开启mariadb-service;
安全初始化mysql_secure_installation,进入数据库请添加图片描述
将真机的test.sql文件传给sever1,在数据库中需要执行创建库和三个表(在test.sql文件中可以看到)
请添加图片描述
CREATE DATABASE ‘salt’:创建库;
CREATE TABLE ‘jids’:创建jid表;
请添加图片描述
CREATE TABLE ‘salt_returns’:创建salt_returns表;
CREATE TABLE ‘salt_events’:创建salt_events表
请添加图片描述
mysql -pwestos < jobs.sql将测试文件导入mysql数据库;
请添加图片描述
进入数据库,查看一下数据库的表和库:
请添加图片描述
修改server2的配置文件/etc/slat/minion,重启minion端
请添加图片描述
请添加图片描述
在server1上添加用户认证,授权salt用户远程操作salt.*表的所有操作
请添加图片描述
server2安装MySQL-python.x86_64 0:1.2.5-1.el7(写入的语句是python语言,谁写入数据库谁就需要安装MySQL-pytho)
请添加图片描述
进行测试
请添加图片描述
返回server1看数据库中是否存在刚才的测试信息,如下,配置成功
请添加图片描述
方式二:minion端正常返回数据给master端,master端发给数据库;
优点:无需到每个minion端修改策略,只需要在master端设置即可;
在这里插入图片描述
修改配置文件/etc/salt/master,在文件最后添加如下内容,重启salt-master
请添加图片描述
进入数据库,授权本地用户执行salt.表的所有操作
请添加图片描述
安装MySQL-python,salt ‘
’ test.ping进行测试
请添加图片描述
在mysql里面查看记录
请添加图片描述
成功存入数据库
请添加图片描述

三、salt-ssh

简介:
salt-ssh可以独立运行的,不需要minion端。它用的是sshpass进行密码交互的,以串行模式工作,性能下降
假如有些主机无法安装minion端,比如server3关掉minion端,就可以使用salt-ssh的方式
请添加图片描述
server1安装salt-ssh
请添加图片描述
修改配置文件/etc/salt/roster;
master端连接,就可以找到配置文件中写的server3
请添加图片描述

四、salt-syndic

简介:
1、syndic其实就是个代理,隔离master与minion,Syndic必须要运行在master上,再连接到另一个topmaster上;
2、Topmaster 下发的状态需要通过syndic来传递给下级master,minion 传递给master的数据也是由syndic传递给topmaster;
3、topmaster并不知道有多少个minion。 syndic与topmaster的file_roots和pillar_roots的目录要保持一致。
在这里插入图片描述
server1还是master,现在新建一个server4来做顶级master;
同样的server4需要配置yum源,安装salt-master
请添加图片描述
请添加图片描述
server4修改配置文件/etc/salt/master;
重启salt-master,现在server4就是topmaster了
请添加图片描述
server1安装salt-syndic.noarch,修改配置文件,设定server4是它的topmaster
请添加图片描述
重启salt-master.service,开启salt-syndic.service
请添加图片描述
此时server4使用salt-key -L查看;
salt-key -A添加,获得密钥
topmaster成功捕捉到master(server1),看不到minion端
请添加图片描述
注意:上个ssh实验关掉了server3的minion,现在要开启,否则server3不成功
请添加图片描述
salt ‘*’ test.ping,测试成功
请添加图片描述
server4 作为topmaster 执行任务,会派发给下级 master(server1)执行
请添加图片描述

五、salt-api配置

简介:
SaltStack 官方提供有REST API格式的 salt-api 项目,将使Salt与第三方系统集成变得尤为简单;
官方提供了三种api模块: rest_cherrypy、rest_tornado、rest_wsgi ;
官方链接: https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all- netapi-modules
Server1 安装salt-api
请添加图片描述
创建密钥openssl genrsa 1024 ,输出重定向到文件 localhost.key中
请添加图片描述
生成证书make testcert
请添加图片描述
激活rest_cherrypy模块: /etc/salt/master.d/api.conf(创建api配置文件)
请添加图片描述
文件路径如下
请添加图片描述
创建/etc/salt/master.d/auth.conf认证文件,使用pam策略,对saltapi用户的权限全开;
创建用户、设定密码;
重启服务后,成功看到api的8000端口
请添加图片描述
获取认证token
请添加图片描述
然后test测试(推送任务),连接成功
请添加图片描述
结合python脚本直接推送任务,将真机的saltapi.py传给server1
请添加图片描述
请添加图片描述
文件内容如下:

# -*- coding: utf-8 -*-import urllib2,urllib
import time
import sslssl._create_default_https_context = ssl._create_unverified_contexttry:import json
except ImportError:import simplejson as jsonclass SaltAPI(object):__token_id = ''def __init__(self,url,username,password):self.__url = url.rstrip('/')self.__user = usernameself.__password = passworddef token_id(self):''' user login and get token id '''params = {
    'eauth': 'pam', 'username': self.__user, 'password': self.__password}encode = urllib.urlencode(params)obj = urllib.unquote(encode)content = self.postRequest(obj,prefix='/login')try:self.__token_id = content['return'][0]['token']except KeyError:raise KeyErrordef postRequest(self,obj,prefix='/'):url = self.__url + prefixheaders = {
    'X-Auth-Token'   : self.__token_id}req = urllib2.Request(url, obj, headers)opener = urllib2.urlopen(req)content = json.loads(opener.read())return contentdef list_all_key(self):params = {
    'client': 'wheel', 'fun': 'key.list_all'}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)minions = content['return'][0]['data']['return']['minions']minions_pre = content['return'][0]['data']['return']['minions_pre']return minions,minions_predef delete_key(self,node_name):params = {
    'client': 'wheel', 'fun': 'key.delete', 'match': node_name}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)ret = content['return'][0]['data']['success']return retdef accept_key(self,node_name):params = {
    'client': 'wheel', 'fun': 'key.accept', 'match': node_name}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)ret = content['return'][0]['data']['success']return retdef remote_noarg_execution(self,tgt,fun):''' Execute commands without parameters '''params = {
    'client': 'local', 'tgt': tgt, 'fun': fun}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)ret = content['return'][0][tgt]return retdef remote_execution(self,tgt,fun,arg):''' Command execution with parameters '''        params = {
    'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)ret = content['return'][0][tgt]return retdef target_remote_execution(self,tgt,fun,arg):''' Use targeting for remote execution '''params = {
    'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': 'nodegroup'}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)jid = content['return'][0]['jid']return jiddef deploy(self,tgt,arg):''' Module deployment '''params = {
    'client': 'local', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)return contentdef async_deploy(self,tgt,arg):''' Asynchronously send a command to connected minions '''params = {
    'client': 'local_async', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)jid = content['return'][0]['jid']return jiddef target_deploy(self,tgt,arg):''' Based on the node group forms deployment '''params = {
    'client': 'local_async', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg, 'expr_form': 'nodegroup'}obj = urllib.urlencode(params)self.token_id()content = self.postRequest(obj)jid = content['return'][0]['jid']return jiddef main():sapi = SaltAPI(url='https://172.25.36.1:8000',username='saltapi',password='westos')sapi.token_id()print sapi.list_all_key()#sapi.delete_key('test-01')#sapi.accept_key('test-01')sapi.deploy('server2','apache')#print sapi.remote_noarg_execution('test-01','grains.items')if __name__ == '__main__':main()

修改以下部分:
print sapi.list_all_key() 打开会输出推送的提示,注释起来直接推送服务没有提示;
请添加图片描述
首先停止之前server2上的nginx服务(避免部署httpd服务时端口冲突)
请添加图片描述
在server1推送一下脚本
请添加图片描述
在server2上查看进程;
可以看到httpd服务开启了
请添加图片描述

  相关解决方案