221 lines
6 KiB
Bash
Executable file
221 lines
6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Ansible Vault Setup Script
|
|
# This script helps you set up encrypted secrets for the Ansible infrastructure
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ANSIBLE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
VAULT_FILE="$ANSIBLE_DIR/inventory/group_vars/all/vault.yaml"
|
|
VAULT_PASS_FILE="$ANSIBLE_DIR/.vault_pass"
|
|
|
|
echo "========================================"
|
|
echo "Ansible Vault Setup"
|
|
echo "========================================"
|
|
echo ""
|
|
|
|
# Check if ansible-vault is available
|
|
if ! command -v ansible-vault &> /dev/null; then
|
|
echo "❌ Error: ansible-vault command not found"
|
|
echo " Please install Ansible first: pip install ansible"
|
|
exit 1
|
|
fi
|
|
|
|
# Function to generate secrets
|
|
generate_secrets() {
|
|
echo "Generating new Forgejo secrets..."
|
|
echo ""
|
|
echo "SECRET_KEY (64 chars hex):"
|
|
openssl rand -hex 32
|
|
echo ""
|
|
echo "JWT_SECRET (base64):"
|
|
openssl rand -base64 32
|
|
echo ""
|
|
echo "LFS_JWT_SECRET (base64):"
|
|
openssl rand -base64 32
|
|
echo ""
|
|
echo "Copy these values to your vault.yaml file"
|
|
echo ""
|
|
}
|
|
|
|
# Function to create vault password file
|
|
create_vault_password() {
|
|
if [ -f "$VAULT_PASS_FILE" ]; then
|
|
echo "⚠️ Vault password file already exists: $VAULT_PASS_FILE"
|
|
read -p "Overwrite? (y/N): " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "Skipping vault password creation"
|
|
return
|
|
fi
|
|
fi
|
|
|
|
echo "Creating vault password file..."
|
|
read -sp "Enter vault password: " password
|
|
echo ""
|
|
read -sp "Confirm password: " password2
|
|
echo ""
|
|
|
|
if [ "$password" != "$password2" ]; then
|
|
echo "❌ Passwords don't match"
|
|
exit 1
|
|
fi
|
|
|
|
echo "$password" > "$VAULT_PASS_FILE"
|
|
chmod 600 "$VAULT_PASS_FILE"
|
|
echo "✅ Vault password saved to: $VAULT_PASS_FILE"
|
|
echo " (This file is git-ignored)"
|
|
echo ""
|
|
}
|
|
|
|
# Function to encrypt vault
|
|
encrypt_vault() {
|
|
if [ ! -f "$VAULT_FILE" ]; then
|
|
echo "❌ Vault file not found: $VAULT_FILE"
|
|
echo " Please create it first from the template"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if already encrypted
|
|
if head -n1 "$VAULT_FILE" | grep -q "ANSIBLE_VAULT"; then
|
|
echo "⚠️ Vault file is already encrypted"
|
|
return
|
|
fi
|
|
|
|
if [ ! -f "$VAULT_PASS_FILE" ]; then
|
|
echo "❌ Vault password file not found: $VAULT_PASS_FILE"
|
|
echo " Run: $0 create-password"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Encrypting vault file..."
|
|
ansible-vault encrypt "$VAULT_FILE" --vault-password-file="$VAULT_PASS_FILE" --encrypt-vault-id default
|
|
echo "✅ Vault encrypted successfully"
|
|
echo ""
|
|
}
|
|
|
|
# Function to decrypt vault
|
|
decrypt_vault() {
|
|
if [ ! -f "$VAULT_FILE" ]; then
|
|
echo "❌ Vault file not found: $VAULT_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if encrypted
|
|
if ! head -n1 "$VAULT_FILE" | grep -q "ANSIBLE_VAULT"; then
|
|
echo "⚠️ Vault file is not encrypted"
|
|
return
|
|
fi
|
|
|
|
if [ ! -f "$VAULT_PASS_FILE" ]; then
|
|
echo "❌ Vault password file not found: $VAULT_PASS_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Decrypting vault file..."
|
|
ansible-vault decrypt "$VAULT_FILE" --vault-password-file="$VAULT_PASS_FILE"
|
|
echo "✅ Vault decrypted successfully"
|
|
echo "⚠️ Remember to re-encrypt before committing!"
|
|
echo ""
|
|
}
|
|
|
|
# Function to edit vault
|
|
edit_vault() {
|
|
if [ ! -f "$VAULT_FILE" ]; then
|
|
echo "❌ Vault file not found: $VAULT_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "$VAULT_PASS_FILE" ]; then
|
|
echo "❌ Vault password file not found: $VAULT_PASS_FILE"
|
|
echo " Run: $0 create-password"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Opening vault for editing..."
|
|
ansible-vault edit "$VAULT_FILE" --vault-password-file="$VAULT_PASS_FILE"
|
|
}
|
|
|
|
# Function to view vault
|
|
view_vault() {
|
|
if [ ! -f "$VAULT_FILE" ]; then
|
|
echo "❌ Vault file not found: $VAULT_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "$VAULT_PASS_FILE" ]; then
|
|
echo "❌ Vault password file not found: $VAULT_PASS_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
ansible-vault view "$VAULT_FILE" --vault-password-file="$VAULT_PASS_FILE"
|
|
}
|
|
|
|
# Function to check vault status
|
|
check_status() {
|
|
echo "Vault Status:"
|
|
echo "-------------"
|
|
|
|
if [ -f "$VAULT_PASS_FILE" ]; then
|
|
echo "✅ Vault password file exists: $VAULT_PASS_FILE"
|
|
else
|
|
echo "❌ Vault password file not found: $VAULT_PASS_FILE"
|
|
fi
|
|
|
|
if [ -f "$VAULT_FILE" ]; then
|
|
if head -n1 "$VAULT_FILE" | grep -q "ANSIBLE_VAULT"; then
|
|
echo "✅ Vault file is encrypted: $VAULT_FILE"
|
|
else
|
|
echo "⚠️ Vault file exists but is NOT encrypted: $VAULT_FILE"
|
|
echo " Run: $0 encrypt"
|
|
fi
|
|
else
|
|
echo "❌ Vault file not found: $VAULT_FILE"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Main menu
|
|
case "${1:-}" in
|
|
generate-secrets)
|
|
generate_secrets
|
|
;;
|
|
create-password)
|
|
create_vault_password
|
|
;;
|
|
encrypt)
|
|
encrypt_vault
|
|
;;
|
|
decrypt)
|
|
decrypt_vault
|
|
;;
|
|
edit)
|
|
edit_vault
|
|
;;
|
|
view)
|
|
view_vault
|
|
;;
|
|
status)
|
|
check_status
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {generate-secrets|create-password|encrypt|decrypt|edit|view|status}"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " generate-secrets - Generate new Forgejo secrets"
|
|
echo " create-password - Create vault password file (.vault_pass)"
|
|
echo " encrypt - Encrypt vault.yaml"
|
|
echo " decrypt - Decrypt vault.yaml (use carefully!)"
|
|
echo " edit - Edit encrypted vault"
|
|
echo " view - View encrypted vault contents"
|
|
echo " status - Check vault status"
|
|
echo ""
|
|
echo "Quick setup:"
|
|
echo " 1. $0 generate-secrets # Generate new secrets"
|
|
echo " 2. Edit vault.yaml with your secrets"
|
|
echo " 3. $0 create-password # Create password file"
|
|
echo " 4. $0 encrypt # Encrypt vault"
|
|
echo ""
|
|
exit 1
|
|
;;
|
|
esac
|