In multi-admin environments, tracking changes to server configurations becomes essential for:
- Change accountability (who made what change)
- Rollback capabilities during outages
- Audit compliance requirements
- Disaster recovery scenarios
The most effective approaches combine version control systems with deployment automation:
Option 1: Git-Based Workflow
Basic setup with Git hooks:
# Initialize repository in /etc cd /etc sudo git init sudo git add . sudo git commit -m "Initial configuration baseline" # Add post-commit hook for change notifications cat <<'EOF' > .git/hooks/post-commit #!/bin/sh echo "Config changed by $(git config user.name)" | mail -s "Config Change" admin-team@example.com EOF chmod +x .git/hooks/post-commit
Option 2: Rsync + Git Hybrid
For distributed systems, maintain a golden repository:
#!/bin/bash
# Sync script for node configurations
CONFIG_REPO="/srv/git/server-configs"
TARGET_NODES=("web01" "web02" "db01")
for node in "${TARGET_NODES[@]}"; do
rsync -avz --checksum --delete \
--exclude='.git/' \
$CONFIG_REPO/ $node:/etc/
done
Ansible + Git Integration
Example playbook for config management:
- hosts: all_servers
tasks:
- name: Check out configuration repo
ansible.builtin.git:
repo: 'https://git.example.com/config-repo.git'
dest: /etc/.config-repo
version: main
- name: Sync configurations
ansible.builtin.synchronize:
src: /etc/.config-repo/
dest: /etc/
recursive: yes
delete: yes
Windows Implementation Using PowerShell
For Windows Server environments:
# PowerShell script for config versioning
$configPath = "C:\Windows\System32\config"
$repoPath = "C:\ConfigRepo"
If (-not (Test-Path $repoPath)) {
git init $repoPath
Copy-Item -Path "$configPath\*" -Destination $repoPath -Recurse
Set-Location $repoPath
git add .
git commit -m "Initial Windows config import"
}
# Scheduled task to track changes
Register-ScheduledJob -Name "ConfigTracker" -ScriptBlock {
Set-Location $repoPath
git add .
git commit -m "Auto-commit $(Get-Date)"
} -Trigger (New-JobTrigger -AtStartup)
- Implement branch-per-environment strategy (dev/stage/prod)
- Enforce peer review via pull requests
- Use signed commits for audit trails
- Store secrets separately using tools like HashiCorp Vault
- Maintain documentation in the repository's README
Example Nagios check for uncommitted changes:
#!/bin/bash
cd /etc
if [ -n "$(git status --porcelain)" ]; then
echo "WARNING: Uncommitted config changes detected"
exit 1
fi
exit 0
In multi-admin server environments, tracking changes to configuration files becomes critical. Traditional methods like manual backups or simple file copies lack:
- Change attribution (who made what change)
- Change history with meaningful commit messages
- Easy rollback capabilities
- Branching for testing configurations
1. Bare Git Repository with Hooks
Create a central bare repository that administrators push to, with post-receive hooks to deploy changes:
# Initialize bare repo mkdir /srv/git/server-configs.git cd /srv/git/server-configs.git git init --bare # Sample post-receive hook #!/bin/sh GIT_WORK_TREE=/etc git checkout -f
2. Git with etckeeper
etckeeper specifically handles /etc directory versioning:
sudo apt install etckeeper sudo etckeeper init sudo etckeeper commit "Initial commit"
Ansible with Git
Store playbooks and templates in Git, then deploy:
# ansible-playbook deploy_nginx.yml
- hosts: webservers
tasks:
- name: Deploy nginx config
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
Chef/Puppet with Environments
Use version control branches for different environments (dev/stage/prod).
Confd + Git
Template-based configuration with Git as backend:
[template]
src = "nginx.conf.tmpl"
dest = "/etc/nginx/nginx.conf"
keys = [
"/services/web"
]
Kubernetes ConfigMaps with GitOps
For containerized environments:
kubectl create configmap nginx-config --from-file=nginx.conf
PowerShell DSC with Git
Configuration WebServerConfig {
Node "localhost" {
File WebsiteContent {
SourcePath = "c:\git\website"
DestinationPath = "c:\inetpub\wwwroot"
}
}
}
- Use .gitignore for sensitive files (certs, passwords)
- Implement pre-commit hooks for syntax validation (nginx -t, apachectl configtest)
- Consider git-crypt for encrypting sensitive configurations
- Document the workflow in your team's runbook