Files
xiaoxia-saas/scripts/install_cmd_agent.py
T
CI Bot c973c2abfa
Check New Server Env / check (push) Successful in 3s
Install CMD Agent on New Server / install (push) Failing after 18s
Downgrade New Runners to v0.2.6 / downgrade (push) Failing after 18s
ops: install cmd agent + cleanup offline runners
2026-07-13 18:29:18 +08:00

114 lines
3.6 KiB
Python
Executable File

#!/usr/bin/env python3
"""在新服务器安装CMD Agent"""
import subprocess
import os
import base64
NEW_SERVER = "172.30.18.199"
KEY_CONTENT = """-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACD6GquAk5vBEfbtaJCTSfnQEhjzC8e5GF60hSbPP0BJbAAAAJiQxGNokMRj
aAAAAAtzc2gtZWQyNTUxOQAAACD6GquAk5vBEfbtaJCTSfnQEhjzC8e5GF60hSbPP0BJbA
AAAED2muzuU4BAiCqbg0ayGxgiDvfS/xI1SFvb32oLzTnn8/oaq4CTm8ER9u1okJNJ+dAS
GPMLx7kYXrSFJs8/QElsAAAAFHJ1bm5lci1hZG1pbkB4aWFveGlhAQ==
-----END OPENSSH PRIVATE KEY-----
"""
key_path = "/tmp/new_server_ed25519"
with open(key_path, "w") as f:
f.write(KEY_CONTENT)
os.chmod(key_path, 0o600)
def ssh(cmd):
r = subprocess.run(
f'ssh -i {key_path} -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@{NEW_SERVER} "{cmd}"',
shell=True, capture_output=True, text=True
)
return r.returncode, r.stdout.strip(), r.stderr.strip()
print("=== 步骤1: 检查环境 ===")
rc, out, err = ssh("python3 --version && pip3 --version 2>&1")
print(f"Python: {out[:200]}")
print("\n=== 步骤2: 安装flask ===")
rc, out, err = ssh("pip3 install flask 2>&1 | tail -5")
print(f"{out[:300]}")
if err:
print(f"ERR: {err[:200]}")
print("\n=== 步骤3: 写入CMD Agent ===")
agent_code = """#!/usr/bin/env python3
import subprocess
from flask import Flask, request, jsonify
app = Flask(__name__)
API_KEY = "xiaoxia-cmd-agent-2026"
@app.before_request
def verify_key():
key = request.headers.get("X-API-Key", "")
if key != API_KEY:
return jsonify({"error": "unauthorized"}), 401
@app.route("/cmd", methods=["POST"])
def run_cmd():
data = request.get_json()
cmd = data.get("cmd", "")
timeout = data.get("timeout", 60)
if not cmd:
return jsonify({"error": "no cmd"}), 400
try:
r = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=timeout)
return jsonify({
"returncode": r.returncode,
"stdout": r.stdout[:50000],
"stderr": r.stderr[:50000]
})
except subprocess.TimeoutExpired:
return jsonify({"error": "timeout"}), 504
@app.route("/health", methods=["GET"])
def health():
return jsonify({"status": "ok", "service": "cmd-agent"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5927, debug=False)
"""
code_b64 = base64.b64encode(agent_code.encode()).decode()
rc, out, err = ssh(f'mkdir -p /opt/cmd-agent && echo "{code_b64}" | base64 -d > /opt/cmd-agent/server.py && chmod +x /opt/cmd-agent/server.py && echo "written"')
print(f"写入: {'成功' if rc==0 else '失败'} - {out[:100]}")
print("\n=== 步骤4: 创建systemd服务 ===")
svc = """[Unit]
Description=CMD Agent
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/cmd-agent
ExecStart=/usr/bin/python3 /opt/cmd-agent/server.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
"""
svc_b64 = base64.b64encode(svc.encode()).decode()
rc, out, err = ssh(f'echo "{svc_b64}" | base64 -d > /etc/systemd/system/cmd-agent.service && systemctl daemon-reload && systemctl enable cmd-agent.service && systemctl start cmd-agent.service && sleep 2 && systemctl is-active cmd-agent.service')
print(f"服务状态: {out[:200] if rc==0 else '失败'}")
if err and rc != 0:
print(f"ERR: {err[:300]}")
print("\n=== 步骤5: 健康检查 ===")
rc, out, err = ssh("curl -s -H 'X-API-Key: xiaoxia-cmd-agent-2026' http://127.0.0.1:5927/health")
print(f"健康检查: {out[:200]}")
print("\n=== 步骤6: Docker镜像检查 ===")
rc, out, err = ssh("docker images 2>&1 | head -15")
print(f"镜像列表:\n{out[:400]}")
print("\n=== 完成 ===")