「django开发」CMDB实验————8、使用python获取虚拟机中文件(自用)

一、一键启动容器

         由于podman不支持一次性启动所有容器,所以采用shell脚本循环启动每个容器,使用.service文件开机自动执行该shell脚本的形式(也尝试过开机自启,但是总有部分容器启动后自动退出,故暂时不使用开机自启)。

vim /sbin/start_all_containers.sh
#!/bin/bash

# 获取所有已经创建的容器
containers=$(podman ps -a --format "{{.Names}}")

# 循环遍历容器列表
for container in $containers; do
  # 检查容器是否正在运行
  if [[ $(podman inspect -f '{{.State.Running}}' "$container") != "true" ]]; then
    # 启动容器
    podman start "$container"
  fi
done
chmod +x /sbin/start_all_containers.sh

shell脚本

验证脚本。

[root@group1 ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND               CREATED     STATUS                     PORTS       NAMES
139a489c7506  docker.io/library/centos:latest  /bin/bash             4 days ago  Up 4 minutes                           virLinux
19a6e6ab1a5e  docker.io/library/nginx:latest   nginx -g daemon o...  4 days ago  Up 4 minutes                           nginx
a325c3c7e8fb  docker.io/library/ubuntu:latest  /bin/bash             4 days ago  Up 6 minutes                           ubuntu
b39188d602f7  docker.io/library/mysql:latest   mysqld                4 days ago  Exited (1) 58 seconds ago              mysql
94b9e2ec21d4  docker.io/library/redis:latest   redis-server          4 days ago  Up 4 minutes                           redis

 发现此时mysql容器状态为Exited,即启动后立刻停止

[root@group1 ~]# podman logs mysql
2024-03-10 03:02:11+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.3.0-1.el8 started.
2024-03-10 03:02:11+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2024-03-10 03:02:11+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.3.0-1.el8 started.
2024-03-10 03:02:11+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following as an environment variable:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

 发现未进行初始化

查看使用的镜像

删除原有镜像

podman run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/library/mysql:latest

 进行初始化

可以正常启动。

二、连通linux虚拟机与windows主机。

将虚拟机设为桥接模式。

ifconfig

 

查询ip。

在windows本机中测试连通。

三、文件传输

                ​​​​​​​        ​​​​​​​        

在django项目的web app下创建一个clientData的文件夹存放状态文件。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

在web/tools中创建一个getClientData.py文件,用于获取虚拟机中的文件。

# 用于获取linux集群中的客户机的信息
import paramiko

# SSH连接参数
hostname = '192.168.3.58'
port = 22
username = 'root'
password = '123456'


def saveFile(remote_file_path, local_file_path):
    """
    将remote_file_path保存到local_file_path
    :param remote_file_path:
    :param local_file_path:
    :return:
    """
    scp.get(remote_file_path, local_file_path)


# 创建SSH客户端
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
    # 连接SSH服务器
    client.connect(hostname, port, username, password)

    # 创建SCP客户端
    scp = client.open_sftp()

    # 下载文件
    saveFile('/output/dockerStatus.txt', '../clientData/dockerStatus.txt')
    saveFile('/output/allServicesStatus', '../clientData/allServicesStatus.txt')

    print('文件下载完成!')

finally:
    # 关闭连接
    scp.close()
    client.close()

这个脚本暂时单独运行,后续会在项目其他页面使用该脚本 

四、前端页面输出内容

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CMDB管理</title>
    <link rel="stylesheet" href="{% static 'css/home.css' %}">
</head>
<body>
    <p>{{ dockerStatus }}</p>
    {% for line in servicesStatus %}
        <p>{{ line }}</p>
    {% endfor %}
</body>
</html>

页面。

def home(request):
    """
    :param request:
    :return: 首页
    """

    # 获取文件内容

    # 获取'web/clientData/dockerStatus.txt'内容,并进行过滤操作。
    dockerStatus = []
    try:
        with open('web/clientData/dockerStatus.txt', 'r') as file:
            # 将文件中内容转化成列表
            for line in file:
                data = ast.literal_eval(line)
                dockerStatus.append(data)
            # 删除每个子列表的第一个元素
            for sublist in dockerStatus:
                del sublist[0]
    except FileNotFoundError:
        print('文件 web/clientData/dockerStatus.txt 不存在!')

    # 获取'web/clientData/allDockerStatus.txt'内容
    servicesStatus = ''
    try:
        with open('web/clientData/allServicesStatus.txt', 'r') as file:
            content= file.readlines()
            servicesStatus = [line.replace('\n', '') for line in content] # 去除\n
    except FileNotFoundError:
        print('文件 web/clientData/allDockerStatus.txt 不存在!')
    print(servicesStatus)
    return render(request, 'home.html', {'dockerStatus': dockerStatus, 'servicesStatus': servicesStatus})

views.py代码(有一些代码粘过去会报错,可能是因为没有引入对应包,需要自己引入一下)。 

最终输出效果。

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值