Saltstack--部署keepalived、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 ssl

ssl._create_default_https_context = ssl._create_unverified_context

try:
    import json
except ImportError:
    import simplejson as json

class SaltAPI(object):
    __token_id = ''
    def __init__(self,url,username,password):
        self.__url = url.rstrip('/')
        self.__user = username
        self.__password = password

    def 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 KeyError

    def postRequest(self,obj,prefix='/'):
        url = self.__url + prefix
        headers = {'X-Auth-Token'   : self.__token_id}
        req = urllib2.Request(url, obj, headers)
        opener = urllib2.urlopen(req)
        content = json.loads(opener.read())
        return content

    def 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_pre

    def 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 ret

    def 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 ret

    def 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 ret

    def 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 ret

    def 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 jid

    def 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 content

    def 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 jid

    def 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 jid

def 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服务开启了
请添加图片描述

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值