Python自动化运维——打包部署Java项目为docker镜像

设计要求

  1. 从gitee.com下载项目
  2. 将下载的项目打包上传到服务器
  3. 将项目做成docker镜像,运行项目

设计过程

  1. 环境部署:
    2 准备一台或多台服务器、虚拟机
    2)在虚拟机上安装dockers(yum install docker)
    3)本地安装maven,传送门
    4)本地安装git,传送门
    5)在gitee.com中注册账户,创建仓库
    6)将本地仓库中的代码上传到远程仓库

  2. 代码功能:
    1)远程登录
    2)判断是否需要安装docker
    3)克隆码云项目,打包上传服务器
    4)制作dockerfile
    5)构建镜像、启动容器
    6)判断是否启动成功


代码:

import paramiko
import time
import os
import logging
import requests

class contnet_shell:

    """
        构造函数:创建对象时执行
        hostname:IP地址
        username:用户名
        password:密码
    """
    def __init__(self,hostname,username,password,port=22):
        self.hostname = hostname
        self.username = username
        self.password = password
        self.port = port 
        self._ssh_fd = paramiko.SSHClient()
        self._ssh_fd.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        logging.info("正在连接linux服务器")
        self._ssh_fd.connect(hostname,username=username,password=password,port=port)
        
        self._transport = paramiko.Transport((hostname, port))
        self._transport.connect(username=username, password=password)
     # 创建sftp客户端
        self.sftp = paramiko.SFTPClient.from_transport(self._transport)
        logging.info("连接Linux成功")
	

    def close_cont(self):
        self._ssh_fd.close()
        self.sftp.close()
        print('关闭连接')

   
    """
    上传文件到Linux远程服务器
    local_src: 本地文件路径 
    remote_src: 服务器上保存文件的路径 
    """
    def copy_file(self, local_src, remote_src):
        logging.info("正在上传文件,请等待........")
        self.sftp.put(local_src, remote_src)
        logging.info("文件上传成功...............")

    """
    执行Linux命令
    cmd: Linux命令 例: ls /
    """
    def exec_cmd(self, cmd):
        stdin, stdout, stderr = self._ssh_fd.exec_command(cmd)
        res = ''
        if stdout.channel.recv_exit_status() != 0:
            for line in stderr.readlines():
                logging.info(line)
                res += line
            return False, res
        else:
            for line in stdout.readlines():
                logging.info(line)
                res += line
            return True, res
    def yum(self, cmd):
        cmd = cmd + '\n' # 加一个回车键
        invoke = self._ssh_fd.invoke_shell()
        invoke.send(cmd)
        res_str = ''

        while True:
            time.sleep(0.5)
            res = invoke.recv(65535).decode("utf-8")
            logging.info(res)
            res_str += res
            lines = res.split('\n')
            last_line = lines[len(lines) - 1]

            if last_line.strip().count('[y/d/N]') > 0 or last_line.strip().count(r'[y/N]'):
                invoke.send('y' + '\n')
            elif last_line.count('[' + self.username + '@') > 0:
                break
        return res_str

ip='192.168.31.114'
user='root'
pwd='1qaz'

# 远程登录
logging.basicConfig(level=logging.INFO)
shell = contnet_shell(ip,user,pwd)

# 若服务器没有docker 安装docker
is_exists,res = shell.exec_cmd('docker -v')
if not is_exists:
	shell.yum('yum install -y docker')
shell.exec_cmd('systemctl stop firewalld')	# 关闭防火墙

# 克隆项目到本地,然后打包上传至服务器 
if not os.path.exists('./java_demo'):
	os.system('git clone https://gitee.com/aurora_f/java_demo')
os.chdir(os.getcwd()+ '\\java_demo\\')
os.system('git pull')	# 拉取最新的代码到本地
os.system('mvn install')
shell.copy_file('./target/myDemo.jar','/opt/myDemo.jar')

# 制作dockerfile
shell.exec_cmd('touch /opt/Dockerfile')
shell.exec_cmd('echo from java:8 > /opt/Dockerfile')
shell.exec_cmd('echo maintainer frank >> /opt/Dockerfile')
shell.exec_cmd('echo add ./myDemo.jar /root >> /opt/Dockerfile')
shell.exec_cmd('echo EXPOSE 8080 >> /opt/Dockerfile')
shell.exec_cmd("echo 'ENTRYPOINT java -jar /root/myDemo.jar' >> /opt/Dockerfile")

# 构建docker镜像
shell.exec_cmd('cd /opt/ && docker build -t spring_boot:1.0 .')

shell.exec_cmd('docker rm -f demo1')
shell.exec_cmd('docker run --name demo1 -d -p 80:8080 spring_boot:1.0')

# 向地址发送请求,通过状态码判断是否成功
time.sleep(5)
res = ""
try:
	res = requests.get('http://'+ip+'/hello')
except Exception as e:
	raise e
if (res.status_code == 200):
	print('成功!!!\n')
else:
	print('容器启动不成功\n')
shell.close_cont()

你可能感兴趣的:(笔记,python,自动化运维,docker,git,paramiko)