一、一键启动容器
由于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代码(有一些代码粘过去会报错,可能是因为没有引入对应包,需要自己引入一下)。
最终输出效果。