136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			YAML
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			YAML
		
	
	
	
name: Ansible Deploy
 | 
						|
on:
 | 
						|
  workflow_dispatch:
 | 
						|
    inputs:
 | 
						|
      environment:
 | 
						|
        description: '部署环境'
 | 
						|
        required: true
 | 
						|
        default: 'dev'
 | 
						|
        type: choice
 | 
						|
        options:
 | 
						|
          - dev
 | 
						|
          - staging
 | 
						|
          - production
 | 
						|
      provider:
 | 
						|
        description: '云服务商'
 | 
						|
        required: true
 | 
						|
        default: 'oracle-cloud'
 | 
						|
        type: choice
 | 
						|
        options:
 | 
						|
          - oracle-cloud
 | 
						|
          - huawei-cloud
 | 
						|
          - google-cloud
 | 
						|
          - digitalocean
 | 
						|
          - aws
 | 
						|
      playbook:
 | 
						|
        description: 'Playbook 类型'
 | 
						|
        required: true
 | 
						|
        default: 'bootstrap'
 | 
						|
        type: choice
 | 
						|
        options:
 | 
						|
          - bootstrap
 | 
						|
          - security
 | 
						|
          - applications
 | 
						|
          - monitoring
 | 
						|
          - maintenance
 | 
						|
 | 
						|
env:
 | 
						|
  ANSIBLE_VERSION: "8.0.0"
 | 
						|
 | 
						|
jobs:
 | 
						|
  deploy:
 | 
						|
    runs-on: ubuntu-latest
 | 
						|
    environment: ${{ github.event.inputs.environment }}
 | 
						|
    
 | 
						|
    steps:
 | 
						|
      - name: Checkout code
 | 
						|
        uses: actions/checkout@v4
 | 
						|
        
 | 
						|
      - name: Setup Python
 | 
						|
        uses: actions/setup-python@v4
 | 
						|
        with:
 | 
						|
          python-version: '3.11'
 | 
						|
          
 | 
						|
      - name: Install Ansible
 | 
						|
        run: |
 | 
						|
          pip install ansible==${{ env.ANSIBLE_VERSION }}
 | 
						|
          pip install ansible-core
 | 
						|
          ansible-galaxy collection install community.general
 | 
						|
          ansible-galaxy collection install ansible.posix
 | 
						|
                    
 | 
						|
      - name: Setup SSH key
 | 
						|
        run: |
 | 
						|
          mkdir -p ~/.ssh
 | 
						|
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
 | 
						|
          chmod 600 ~/.ssh/id_rsa
 | 
						|
          ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
 | 
						|
                    
 | 
						|
      - name: Create dynamic inventory
 | 
						|
        run: |
 | 
						|
          ENV="${{ github.event.inputs.environment }}"
 | 
						|
          PROVIDER="${{ github.event.inputs.provider }}"
 | 
						|
          
 | 
						|
          # 从 OpenTofu 输出创建动态清单
 | 
						|
          if [ -f "configuration/inventories/$ENV/$PROVIDER-inventory.json" ]; then
 | 
						|
            echo "Using existing inventory from OpenTofu output"
 | 
						|
            cp configuration/inventories/$ENV/$PROVIDER-inventory.json /tmp/inventory.json
 | 
						|
          else
 | 
						|
            echo "Creating static inventory"
 | 
						|
            cat > /tmp/inventory.ini << EOF
 | 
						|
          [$ENV]
 | 
						|
          ${{ secrets.TARGET_HOST }} ansible_host=${{ secrets.TARGET_HOST }} ansible_user=${{ secrets.SSH_USER }} ansible_become=yes ansible_become_pass=${{ secrets.SUDO_PASSWORD }}
 | 
						|
          
 | 
						|
          [all:vars]
 | 
						|
          ansible_ssh_common_args='-o StrictHostKeyChecking=no'
 | 
						|
          EOF
 | 
						|
          fi
 | 
						|
                    
 | 
						|
      - name: Run Ansible Playbook
 | 
						|
        run: |
 | 
						|
          ENV="${{ github.event.inputs.environment }}"
 | 
						|
          PLAYBOOK="${{ github.event.inputs.playbook }}"
 | 
						|
          
 | 
						|
          cd configuration
 | 
						|
          
 | 
						|
          # 选择正确的清单文件
 | 
						|
          if [ -f "/tmp/inventory.json" ]; then
 | 
						|
            INVENTORY="/tmp/inventory.json"
 | 
						|
          else
 | 
						|
            INVENTORY="/tmp/inventory.ini"
 | 
						|
          fi
 | 
						|
          
 | 
						|
          # 运行对应的 playbook
 | 
						|
          case "$PLAYBOOK" in
 | 
						|
            "bootstrap")
 | 
						|
              ansible-playbook -i $INVENTORY playbooks/bootstrap/main.yml -e "environment=$ENV"
 | 
						|
              ;;
 | 
						|
            "security")
 | 
						|
              ansible-playbook -i $INVENTORY playbooks/security/main.yml -e "environment=$ENV"
 | 
						|
              ;;
 | 
						|
            "applications")
 | 
						|
              ansible-playbook -i $INVENTORY playbooks/applications/main.yml -e "environment=$ENV"
 | 
						|
              ;;
 | 
						|
            "monitoring")
 | 
						|
              ansible-playbook -i $INVENTORY playbooks/monitoring/main.yml -e "environment=$ENV"
 | 
						|
              ;;
 | 
						|
            "maintenance")
 | 
						|
              ansible-playbook -i $INVENTORY playbooks/maintenance/main.yml -e "environment=$ENV"
 | 
						|
              ;;
 | 
						|
          esac
 | 
						|
                    
 | 
						|
      - name: Generate deployment report
 | 
						|
        run: |
 | 
						|
          echo "## 部署报告" > deployment-report.md
 | 
						|
          echo "" >> deployment-report.md
 | 
						|
          echo "**环境**: ${{ github.event.inputs.environment }}" >> deployment-report.md
 | 
						|
          echo "**云服务商**: ${{ github.event.inputs.provider }}" >> deployment-report.md
 | 
						|
          echo "**Playbook**: ${{ github.event.inputs.playbook }}" >> deployment-report.md
 | 
						|
          echo "**时间**: $(date)" >> deployment-report.md
 | 
						|
          echo "**状态**: ✅ 部署成功" >> deployment-report.md
 | 
						|
                    
 | 
						|
      - name: Upload deployment report
 | 
						|
        uses: actions/upload-artifact@v4
 | 
						|
        with:
 | 
						|
          name: deployment-report-${{ github.event.inputs.environment }}-${{ github.event.inputs.provider }}
 | 
						|
          path: deployment-report.md
 | 
						|
          retention-days: 30 |