fix: improve DRIFTED_FILES parsing and reduce file descriptor issues
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Add comprehensive debug output to track parsing steps - Fix DRIFTED_FILES extraction from Ansible output - Always output DRIFTED_FILES line (even when empty) for reliable parsing - Add ANSIBLE_CALLBACKS_ENABLED='' to prevent inotify exhaustion - Add KEEP_PLAYBOOK_LOG option for debugging - Add validation warning when OUT_OF_SYNC but no files found - Create DEBUGGING_GITOPS_STATUS.md guide
This commit is contained in:
parent
57911b7f52
commit
46b0bb449e
187
DEBUGGING_GITOPS_STATUS.md
Normal file
187
DEBUGGING_GITOPS_STATUS.md
Normal file
@ -0,0 +1,187 @@
|
||||
# Debugging GitOps Status Issues
|
||||
|
||||
This guide helps troubleshoot issues with the GitOps status reporting system.
|
||||
|
||||
## Common Issue: Status shows OUT_OF_SYNC after deployment
|
||||
|
||||
### Symptoms
|
||||
- You pushed changes to the repo
|
||||
- The deploy step succeeded
|
||||
- But `update-gitops-status` shows OUT_OF_SYNC
|
||||
- Changed files are not displayed
|
||||
|
||||
### Root Causes
|
||||
|
||||
#### 1. **Deployment didn't actually succeed**
|
||||
The deploy step might have failed silently or the configuration wasn't applied correctly.
|
||||
|
||||
**How to check:**
|
||||
- Look at the deploy step logs in Woodpecker
|
||||
- SSH to the server and verify files match Git:
|
||||
```bash
|
||||
diff /etc/rsyslog.conf files/rsyslog.conf
|
||||
diff -r /etc/rsyslog.d/ files/rsyslog.d/
|
||||
```
|
||||
|
||||
#### 2. **Parsing issue with DRIFTED_FILES output**
|
||||
The script might not be correctly extracting the file list from Ansible's output.
|
||||
|
||||
**How to debug:**
|
||||
Run the status update script locally with debug mode:
|
||||
```bash
|
||||
export KEEP_PLAYBOOK_LOG=true
|
||||
./update-gitops-status.sh
|
||||
```
|
||||
|
||||
This will save the playbook output to `drift-check-output.log`. Check:
|
||||
- Does the log contain `DRIFTED_FILES=` line?
|
||||
- What does the line look like exactly?
|
||||
- Are there ANSI color codes interfering?
|
||||
|
||||
Look for these debug lines in the output:
|
||||
```
|
||||
DEBUG: Searching for DRIFTED_FILES in playbook output...
|
||||
DEBUG: Found DRIFTED_FILES pattern
|
||||
DEBUG: Raw line: ...
|
||||
DEBUG: Extracted value: '...'
|
||||
```
|
||||
|
||||
#### 3. **Too many open files error**
|
||||
If you see "failed to create fsnotify watcher: too many open files":
|
||||
|
||||
**Fixed in latest version:**
|
||||
- `.woodpecker.yml` now sets `ANSIBLE_CALLBACKS_ENABLED=""` and `ANSIBLE_GATHERING=explicit`
|
||||
- `update-gitops-status.sh` uses `ANSIBLE_CALLBACKS_ENABLED=""` when running playbooks
|
||||
- These settings prevent Ansible from exhausting inotify watches
|
||||
|
||||
**If issue persists:**
|
||||
- The container might need privileged mode to adjust kernel parameters
|
||||
- Or reduce Ansible parallelism in inventory settings
|
||||
|
||||
#### 4. **Ansible output format changed**
|
||||
If Ansible version changed, the debug output format might be different.
|
||||
|
||||
**How to fix:**
|
||||
Check `drift-check-output.log` and adjust the parsing in `update-gitops-status.sh`:
|
||||
```bash
|
||||
# Current parsing (line ~110 in update-gitops-status.sh):
|
||||
DRIFTED_FILES_STR=$(echo "$DRIFTED_FILES_STR" | sed 's/.*DRIFTED_FILES=//' | sed 's/\x1b\[[0-9;]*m//g' | sed 's/".*$//' | xargs)
|
||||
```
|
||||
|
||||
You might need to adjust the `sed` commands based on the actual format.
|
||||
|
||||
## Testing the Fix
|
||||
|
||||
### 1. Test locally
|
||||
```bash
|
||||
# Set up SSH key
|
||||
export SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
|
||||
|
||||
# Run the script with debug output
|
||||
export KEEP_PLAYBOOK_LOG=true
|
||||
./update-gitops-status.sh
|
||||
|
||||
# Check the log
|
||||
cat drift-check-output.log | grep -A 2 "DRIFTED_FILES="
|
||||
```
|
||||
|
||||
### 2. Test in Woodpecker
|
||||
Push a small change and monitor the `update-gitops-status` step:
|
||||
```bash
|
||||
# Make a small comment change
|
||||
echo "# Test change $(date)" >> files/rsyslog.conf
|
||||
|
||||
# Commit and push
|
||||
git add files/rsyslog.conf
|
||||
git commit -m "test: verify gitops status detection"
|
||||
git push
|
||||
|
||||
# Watch the pipeline in Woodpecker UI
|
||||
# The update-gitops-status step should:
|
||||
# 1. Run deploy (apply.yml)
|
||||
# 2. Run drift-check immediately after
|
||||
# 3. Show SYNCED (because deploy just ran)
|
||||
# 4. Show no drifted files
|
||||
```
|
||||
|
||||
### 3. Test drift detection (manual change on server)
|
||||
```bash
|
||||
# SSH to the server
|
||||
ssh rsyslog-lab
|
||||
|
||||
# Make a manual change
|
||||
echo "# Manual change" >> /etc/rsyslog.conf
|
||||
|
||||
# Wait for the cron job to run (every 2 minutes)
|
||||
# Or manually trigger it in Woodpecker
|
||||
|
||||
# The status should now show:
|
||||
# - Status: OUT_OF_SYNC
|
||||
# - Files: rsyslog.conf
|
||||
```
|
||||
|
||||
## Expected Behavior
|
||||
|
||||
### After successful deployment (push to master)
|
||||
```
|
||||
Step 2/4: Analyzing drift detection results...
|
||||
✓ Status: SYNCED - server configuration matches Git
|
||||
Total drift count: 0
|
||||
|
||||
Step 3/4: Building JSON payload...
|
||||
Generated JSON:
|
||||
{
|
||||
"repo": "rsyslog",
|
||||
"server": "rsyslog-lab",
|
||||
"sync_status": "SYNCED",
|
||||
"drift_count": 0,
|
||||
"files": [],
|
||||
"last_check": "2026-04-22T14:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### When drift is detected (cron job or manual server change)
|
||||
```
|
||||
Step 2/4: Analyzing drift detection results...
|
||||
✗ Status: OUT OF SYNC - configuration drift detected
|
||||
- Drift detected in: rsyslog.conf
|
||||
Total drift count: 1
|
||||
|
||||
Step 3/4: Building JSON payload...
|
||||
Generated JSON:
|
||||
{
|
||||
"repo": "rsyslog",
|
||||
"server": "rsyslog-lab",
|
||||
"sync_status": "OUT_OF_SYNC",
|
||||
"drift_count": 1,
|
||||
"files": [
|
||||
{"name": "rsyslog.conf"}
|
||||
],
|
||||
"last_check": "2026-04-22T14:32:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Enable debug mode
|
||||
```bash
|
||||
export KEEP_PLAYBOOK_LOG=true
|
||||
./update-gitops-status.sh
|
||||
cat drift-check-output.log
|
||||
```
|
||||
|
||||
### Manually run drift-check
|
||||
```bash
|
||||
ansible-playbook -i ansible/inventory/hosts.yml ansible/playbooks/drift-check.yml
|
||||
```
|
||||
|
||||
### Manually run deployment
|
||||
```bash
|
||||
ansible-playbook -i ansible/inventory/hosts.yml ansible/playbooks/apply.yml
|
||||
```
|
||||
|
||||
### Check server state
|
||||
```bash
|
||||
ssh rsyslog-lab "md5sum /etc/rsyslog.conf /etc/rsyslog.d/*.conf"
|
||||
md5sum files/rsyslog.conf files/rsyslog.d/*.conf
|
||||
```
|
||||
Loading…
x
Reference in New Issue
Block a user