9.2 KiB
Deployment Checklist
This checklist guides you through deploying the updated rsyslog repository with gitops-status-server integration.
Prerequisites
Before deploying, ensure:
- gitops-status-server is deployed and accessible at:
http://gitops-status-server.observability-stack.svc.cluster.local:80 - gitops-status-server has
/api/statusendpoint implemented (see GITOPS_STATUS_API_REFERENCE.md) - Woodpecker CI is configured for this repository
- SSH access to rsyslog-lab server is configured
- SSH_PRIVATE_KEY secret is set in Woodpecker repository settings
Files Changed/Added
New Files
- ✅
update-gitops-status.sh- Main script for JSON status generation - ✅
GITOPS_STATUS_INTEGRATION.md- Integration documentation - ✅
GITOPS_STATUS_API_REFERENCE.md- API reference with examples - ✅
MIGRATION_SUMMARY.md- Summary of all changes made
Modified Files
- ✅
.woodpecker.yml- Updated pipeline to use JSON status - ✅
README.md- Updated documentation with new flow
Unchanged Files (no action needed)
- ✅ All Ansible playbooks
- ✅ All Ansible inventory files
- ✅ All rsyslog config files
- ✅ Local scripts (apply.sh, drift-check.sh)
Deployment Steps
1. Review Changes
- Read MIGRATION_SUMMARY.md to understand all changes
- Review .woodpecker.yml pipeline changes
- Review update-gitops-status.sh script logic
2. Verify gitops-status-server
Test the gitops-status-server API endpoint:
# Test POST endpoint (should return 200 or 404 if not implemented yet)
curl -X POST http://gitops-status-server.observability-stack.svc.cluster.local:80/api/status \
-H "Content-Type: application/json" \
-d '{
"repo": "test",
"server": "test",
"sync_status": "SYNCED",
"drift_count": 0,
"files": [],
"last_check": "2026-04-21T10:00:00Z"
}'
# Test GET endpoint
curl http://gitops-status-server.observability-stack.svc.cluster.local:80/status.json
If the API is not implemented yet:
- Implement gitops-status-server API (use GITOPS_STATUS_API_REFERENCE.md)
- Deploy to Kubernetes cluster
- Verify endpoints are accessible
3. Test Locally (Optional)
Before pushing to Git, you can test the script locally:
# Set environment variables
export GITOPS_STATUS_SERVER_URL="http://gitops-status-server.observability-stack.svc.cluster.local:80"
export REPO_NAME="rsyslog"
export SERVER_NAME="rsyslog-lab"
# Make script executable
chmod +x update-gitops-status.sh
# Run the script (requires Ansible, jq, curl)
./update-gitops-status.sh
Expected output:
==> Running drift check playbook...
Inventory: ansible/inventory/hosts.yml
Playbook: ansible/playbooks/drift-check.yml
==> Status: SYNCED - server configuration matches Git
==> Drift count: 0
==> Generated JSON status:
{
"repo": "rsyslog",
"server": "rsyslog-lab",
"sync_status": "SYNCED",
"drift_count": 0,
"files": [],
"last_check": "2026-04-21T10:30:00Z"
}
==> Sending status to gitops-status-server...
URL: http://gitops-status-server.observability-stack.svc.cluster.local:80/api/status
==> Status update successful (HTTP 200)
4. Commit and Push Changes
# Stage all changes
git add .
# Commit
git commit -m "Migrate from Pushgateway to gitops-status-server JSON status
- Add update-gitops-status.sh script for JSON status generation
- Update .woodpecker.yml to use gitops-status-server
- Remove Pushgateway metric push logic
- Add comprehensive documentation
- Keep all Ansible playbooks unchanged"
# Push to master (will trigger deploy pipeline)
git push origin master
5. Monitor First Deployment
After pushing to master:
- Watch Woodpecker pipeline execution
- Verify
syntax-checkstep passes - Verify
validatestep passes - Verify
deploystep completes - Verify
update-gitops-statusstep runs successfully - Check that JSON is sent to gitops-status-server
Example successful update-gitops-status step output:
==> Running post-deploy GitOps status check...
==> Running drift check playbook...
==> Status: SYNCED - server configuration matches Git
==> Drift count: 0
==> Generated JSON status: {...}
==> Sending status to gitops-status-server...
==> Status update successful (HTTP 200)
==> JSON status update complete. Pipeline always succeeds.
6. Verify Cron Pipeline
The cron pipeline runs every 2 minutes:
- Wait for next cron execution
- Check Woodpecker for
gitops_sync_checkpipeline run - Verify JSON status is sent
- Verify pipeline succeeds (if synced) or fails (if drift detected)
7. Test Drift Detection
Manually create drift to test detection:
# SSH to the server
ssh rsyslog-lab
# Edit a config file
echo "# manual edit" >> /etc/rsyslog.conf
# Wait up to 2 minutes for next cron run
Expected behavior:
- Cron pipeline runs
- Drift detected in Ansible playbook
- JSON sent with
sync_status: "OUT_OF_SYNC" - JSON includes
files: [{"name": "rsyslog.conf"}] - Pipeline marked as FAILED (for visibility)
Verify in gitops-status-server:
curl http://gitops-status-server.observability-stack.svc.cluster.local:80/status.json
Should show:
[
{
"repo": "rsyslog",
"server": "rsyslog-lab",
"sync_status": "OUT_OF_SYNC",
"drift_count": 1,
"files": [
{"name": "rsyslog.conf"}
],
"last_check": "...",
"updated_at": "..."
}
]
8. Configure Grafana Dashboard
- Add Infinity datasource pointing to gitops-status-server
- Create dashboard to display GitOps status
- Add panels for:
- Sync status overview (SYNCED vs OUT_OF_SYNC)
- Drift count per repo
- Detailed file list for drifted repos
- Last check timestamp
- Historical trend (if gitops-status-server stores history)
Example dashboard queries provided in GITOPS_STATUS_API_REFERENCE.md.
9. Cleanup (Optional)
If everything works correctly:
- Remove old Pushgateway metrics for rsyslog (if no longer needed)
- Update any alerts/dashboards that used old
gitops_sync_statusmetric - Document the new JSON status format in team wiki/docs
Troubleshooting
Script fails with "command not found: jq"
Problem: jq is not installed in the Woodpecker container
Solution: The .woodpecker.yml already includes apk add --no-cache jq. Verify the step runs before the script.
Script fails with "HTTP 404" or "HTTP 500"
Problem: gitops-status-server endpoint not implemented or not accessible
Solution:
- Verify gitops-status-server is running:
curl http://gitops-status-server.observability-stack.svc.cluster.local:80/health - Check Kubernetes service:
kubectl get svc -n observability-stack - Implement
/api/statusendpoint using GITOPS_STATUS_API_REFERENCE.md
Script fails with "No such file or directory: update-gitops-status.sh"
Problem: Script not found in workspace
Solution: The script is created in the repository root. Verify it's committed to Git and available in the CI workspace.
Drift not detected when expected
Problem: Manual changes not showing up in drift check
Solution:
- Verify changes are to files managed by Git (rsyslog.conf or rsyslog.d/*.conf)
- Check Ansible playbook output for diff details
- Verify SSH access to server from CI container
JSON has empty files array even when drift detected
Problem: Script parsing logic not extracting filenames correctly
Solution:
- Check Ansible output format - script expects specific JSON structure
- Run with
ANSIBLE_STDOUT_CALLBACK=jsonto see raw output - Update regex patterns in
update-gitops-status.shif needed
Rollback Procedure
If you need to rollback to Pushgateway:
# Revert to previous commit
git revert HEAD
# Or restore specific files
git checkout HEAD~1 .woodpecker.yml
git checkout HEAD~1 README.md
# Remove new files
git rm update-gitops-status.sh GITOPS_STATUS_*.md MIGRATION_SUMMARY.md
# Commit and push
git commit -m "Rollback to Pushgateway metrics"
git push origin master
Success Criteria
✅ All checks passed when:
- Woodpecker pipeline completes successfully on push to master
- JSON status is sent to gitops-status-server after deploy
- Cron pipeline runs every 2 minutes and sends JSON status
- Drift is correctly detected and reported in JSON
- gitops-status-server
/status.jsonendpoint returns correct data - Grafana dashboard displays rsyslog sync status
- No errors in Woodpecker logs
- File-level drift details are visible in Grafana
Additional Resources
- README.md - Repository overview and workflow
- MIGRATION_SUMMARY.md - Detailed migration changes
- GITOPS_STATUS_INTEGRATION.md - Integration architecture
- GITOPS_STATUS_API_REFERENCE.md - API implementation guide
Support
If you encounter issues:
- Check Woodpecker pipeline logs
- Verify gitops-status-server logs
- Test API endpoints manually with curl
- Review Ansible playbook output
- Check this repository's documentation files