diff --git a/.gitignore b/.gitignore index a99aef6d..ba443955 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,48 @@ venv/ .DS_Store infrastructure/.DS_Store ./playbook/.DS_Storevenv/ + +# Python virtual environments +.venv/ +venv/ +ENV/ +env/ + +# Python bytecode +__pycache__/ +*.py[cod] +*.pyo + +# Pulumi +Pulumi.* +*.bak +.pulumi/ +.pulumi-history/ + +# VSCode +.vscode/ + +# macOS metadata +.DS_Store + +# Logs and local debug +*.log + +# Coverage +htmlcov/ +coverage.xml +*.cover +.cache/ + +# Terraform +.terraform/ +*.tfstate +*.tfstate.* + +# Ansible +*.retry + +# Installer artifacts +offline-iac/ +offline-setup-*.tar.gz + diff --git a/iac_modules/pulumi/Pulumi.yaml b/iac_modules/pulumi/Pulumi.yaml new file mode 100644 index 00000000..afe9ce22 --- /dev/null +++ b/iac_modules/pulumi/Pulumi.yaml @@ -0,0 +1,3 @@ +name: multi-cloud-iaas +runtime: python +description: Multi-Cloud IaaS Infrastructure with Pulumi (AWS, Azure, GCP, Alibaba) diff --git a/iac_modules/pulumi/requirements.txt b/iac_modules/pulumi/requirements.txt deleted file mode 100644 index 2d212c01..00000000 --- a/iac_modules/pulumi/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -pulumi -pulumi-aws -PyYAML diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..b60a3a3f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +pulumi +pulumi-aws +pulumi-gcp +pulumi-azure-native +pulumi-alicloud +PyYAML diff --git a/scripts/run.sh b/scripts/run.sh index 4cbe28db..846514be 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -1,13 +1,19 @@ #!/bin/bash set -e -# 项目根目录(从任意位置运行都有效) -cd "$(dirname "$0")/.." +PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$PROJECT_ROOT" + +# ========== 默认参数 ========== +DEFAULT_ENV="sit" +DEFAULT_CONFIG="${PROJECT_ROOT}/config" + +# ========== 模块路径 ========== +PULUMI_DIR="${PROJECT_ROOT}/iac_modules/pulumi" +TERRAFORM_DIR="${PROJECT_ROOT}/iac_modules/terraform" +ANSIBLE_DIR="${PROJECT_ROOT}/ansible" # ========== 参数解析 ========== -DEFAULT_ENV="dev" -DEFAULT_CONFIG="config" - if [[ -n "$1" && "$1" != up && "$1" != down && "$1" != delete && "$1" != export && "$1" != import && "$1" != init && "$1" != ansible && "$1" != help ]]; then STACK_ENV="$1" ACTION="${2:-up}" @@ -17,12 +23,13 @@ else fi STACK_NAME="${STACK_NAME:-$STACK_ENV}" -CONFIG_PATH="${CONFIG_PATH:-config/$STACK_ENV}" +CONFIG_PATH="${CONFIG_PATH:-${DEFAULT_CONFIG}/${STACK_ENV}}" -# ========== 模块目录 ========== -PULUMI_DIR="iac_modules/pulumi" -TERRAFORM_DIR="iac_modules/terraform" -ANSIBLE_DIR="ansible" +# ========== 配置目录检查 ========== +if [ ! -d "$CONFIG_PATH" ] || [ -z "$(find "$CONFIG_PATH" -maxdepth 1 -name '*.yml' -o -name '*.yaml')" ]; then + echo "⚠️ 配置目录为空:$CONFIG_PATH,跳过部署" + exit 0 +fi # ========== 帮助信息 ========== print_help() { @@ -118,9 +125,14 @@ init_env() { ensure_pulumi # 2️⃣ 安装 Python 依赖 - if [ -f "$PULUMI_DIR/requirements.txt" ]; then + if [ -f "requirements.txt" ]; then echo "📦 安装 Python 依赖..." - pip3 install -r "$PULUMI_DIR/requirements.txt" + # 1. 创建虚拟环境 + python3 -m venv .venv + # 2. 激活虚拟环境(zsh/bash) + source .venv/bin/activate + # 3. 安装依赖 + python3 -m pip install -r requirements.txt fi # 3️⃣ 检查 Ansible @@ -134,8 +146,8 @@ init_env() { # 5️⃣ 初始化 Pulumi Stack cd "$PULUMI_DIR" pulumi login --local > /dev/null + if ! pulumi stack ls | grep -q "$STACK_NAME"; then - echo "📂 创建 Pulumi Stack: $STACK_NAME" pulumi stack init "$STACK_NAME" else echo "✅ Stack 已存在:$STACK_NAME" @@ -147,12 +159,31 @@ init_env() { # ========== 执行 Pulumi ========== pulumi_run() { cd "$PULUMI_DIR" + + # 设置 Python 虚拟环境路径 + VENV_DIR="${PULUMI_DIR}/.venv" + + # 如果没有虚拟环境就创建并安装依赖 + if [ ! -d "$VENV_DIR" ]; then + echo "📦 创建 Python 虚拟环境: $VENV_DIR" + python3 -m venv "$VENV_DIR" + source "$VENV_DIR/bin/activate" + python3 -m pip install -r requirements.txt + else + echo "✅ 虚拟环境已存在,直接激活" + source "$VENV_DIR/bin/activate" + fi + + # ✅ 明确选择 stack,若不存在则创建,避免交互式提示 + pulumi stack select "$STACK_NAME" 2>/dev/null || pulumi stack init "$STACK_NAME" + + if [ ! -d "$CONFIG_PATH" ] || [ -z "$(find "$CONFIG_PATH" -maxdepth 1 -name '*.yml' -o -name '*.yaml')" ]; then + echo "⚠️ 配置目录为空:$CONFIG_PATH,跳过部署" + exit 0 + fi + case "$ACTION" in up) - if [ ! -d "$CONFIG_PATH" ] || [ -z "$(ls -A $CONFIG_PATH/*.yaml 2>/dev/null)" ]; then - echo "⚠️ 配置目录为空:$CONFIG_PATH,跳过部署" - exit 0 - fi echo "🚀 正在部署 stack: $STACK_NAME" pulumi up --yes ;;