- ansible/: VM provisioning playbooks and roles - provision-vm.yml: create KVM VM from Ubuntu cloud image - install.yml: install OpenClaw on guest (upstream) - customize.yml: swappiness, virtiofs fstab, linger - roles/vm/: libvirt domain XML, cloud-init templates - inventory.yml + host_vars/zap.yml: zap instance config - backup-openclaw-vm.sh: daily rsync + MinIO upload - restore-openclaw-vm.sh: full redeploy from scratch - README.md: full operational documentation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
96 lines
3.4 KiB
Bash
96 lines
3.4 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
# Run OpenClaw playbook from local source or installed collection
|
|
|
|
OPENCLAW_USER="${OPENCLAW_USER:-openclaw}"
|
|
|
|
# Keep instructions aligned when user overrides openclaw_user via -e.
|
|
extract_openclaw_user_from_args() {
|
|
local prev_is_extra=0
|
|
local arg
|
|
for arg in "$@"; do
|
|
if [ "$prev_is_extra" -eq 1 ]; then
|
|
if [[ "$arg" =~ (^|[[:space:]])openclaw_user=([^[:space:]]+) ]]; then
|
|
OPENCLAW_USER="${BASH_REMATCH[2]}"
|
|
fi
|
|
prev_is_extra=0
|
|
continue
|
|
fi
|
|
|
|
case "$arg" in
|
|
-e|--extra-vars)
|
|
prev_is_extra=1
|
|
;;
|
|
-e=*|--extra-vars=*)
|
|
local extra="${arg#*=}"
|
|
if [[ "$extra" =~ (^|[[:space:]])openclaw_user=([^[:space:]]+) ]]; then
|
|
OPENCLAW_USER="${BASH_REMATCH[2]}"
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
extract_openclaw_user_from_args "$@"
|
|
|
|
# Determine playbook source
|
|
if [ -f "playbooks/install.yml" ]; then
|
|
echo "Running from local source..."
|
|
PLAYBOOK="playbook.yml"
|
|
export ANSIBLE_ROLES_PATH="${PWD}/roles:${ANSIBLE_ROLES_PATH}"
|
|
elif ansible-galaxy collection list 2>/dev/null | grep -q "openclaw.installer"; then
|
|
echo "Running from installed collection..."
|
|
PLAYBOOK="openclaw.installer.install"
|
|
else
|
|
echo "Error: Collection not installed and not running from source"
|
|
echo "Install with: ansible-galaxy collection install -r requirements.yml"
|
|
exit 1
|
|
fi
|
|
|
|
# Run the Ansible playbook
|
|
if [ "$EUID" -eq 0 ]; then
|
|
ansible-playbook "$PLAYBOOK" -e ansible_become=false "$@"
|
|
PLAYBOOK_EXIT=$?
|
|
else
|
|
if sudo -n true 2>/dev/null; then
|
|
echo "Passwordless sudo detected. Running without become password prompt."
|
|
ansible-playbook "$PLAYBOOK" "$@"
|
|
PLAYBOOK_EXIT=$?
|
|
else
|
|
echo "Sudo password required. Prompting for become password."
|
|
ansible-playbook "$PLAYBOOK" --ask-become-pass "$@"
|
|
PLAYBOOK_EXIT=$?
|
|
fi
|
|
fi
|
|
|
|
# After playbook completes successfully, show instructions
|
|
if [ $PLAYBOOK_EXIT -eq 0 ]; then
|
|
echo ""
|
|
echo "═══════════════════════════════════════════════════════════"
|
|
echo "✅ INSTALLATION COMPLETE!"
|
|
echo "═══════════════════════════════════════════════════════════"
|
|
echo ""
|
|
echo "🔄 SWITCH TO OPENCLAW USER with:"
|
|
echo ""
|
|
echo " sudo su - ${OPENCLAW_USER}"
|
|
echo ""
|
|
echo " OR (alternative):"
|
|
echo ""
|
|
echo " sudo -u ${OPENCLAW_USER} -i"
|
|
echo ""
|
|
echo "This will switch you to the OpenClaw user with a proper"
|
|
echo "login shell (loads .bashrc, sets environment correctly)."
|
|
echo ""
|
|
echo "After switching, you'll see the next setup steps:"
|
|
echo " • Configure OpenClaw (~/.openclaw/config.yml)"
|
|
echo " • Login to messaging provider (WhatsApp/Telegram/Signal)"
|
|
echo " • Test the gateway"
|
|
echo ""
|
|
echo "═══════════════════════════════════════════════════════════"
|
|
echo ""
|
|
else
|
|
echo "❌ Playbook failed with exit code $PLAYBOOK_EXIT"
|
|
exit $PLAYBOOK_EXIT
|
|
fi
|