Skip to content

Examples

Norberto Aquino edited this page Sep 26, 2025 · 1 revision

Configuration Examples

Real-world examples for different organizational setups and use cases.

📋 Table of Contents


🏢 Small Office Setup

Scenario: 50 computers, simple setup, basic asset tracking

Configuration

[rudder]
url = https://rudder.smalloffice.com
api_token = abc123def456ghi789

[snipe-it]
url = https://assets.smalloffice.com
apikey = xyz789uvw012rst345
manufacturer_id = 1
defaultStatus = 2
computer_model_category_id = 1

[api-mapping]
name = hostname
_snipeit_ip_address_1 = properties ipHostNumber
_snipeit_os_2 = properties osName
_snipeit_memory_3 = properties memorySize

Deployment

# Initial setup
python3 rudder2snipe --connection_test
python3 rudder2snipe --dryrun --verbose

# First sync
python3 rudder2snipe --verbose

# Daily cron job
echo "0 9 * * * /opt/rudder2snipe/.venv/bin/python /opt/rudder2snipe/rudder2snipe --verbose >> /var/log/rudder2snipe.log 2>&1" | crontab -

Expected Results

  • Creates 50 assets in Snipe-IT
  • Maps basic information (hostname, IP, OS, memory)
  • Simple daily sync
  • ~2-3 minutes execution time

🏢 Enterprise Deployment

Scenario: 1000+ assets, complex requirements, custom fields, user management

Configuration

[rudder]
url = https://rudder.enterprise.corp
api_token = enterprise_token_here_very_long

[snipe-it]
url = https://snipe.enterprise.corp
apikey = enterprise_snipe_key_here
manufacturer_id = 3
defaultStatus = 4
computer_model_category_id = 5
computer_custom_fieldset_id = 2

[api-mapping]
# Basic information
name = hostname
_snipeit_ip_address_1 = properties ipHostNumber
_snipeit_mac_address_2 = properties macAddress

# Operating system details
_snipeit_os_name_3 = properties osName
_snipeit_os_version_4 = properties osVersion
_snipeit_os_kernel_5 = properties osKernelVersion
_snipeit_os_full_6 = properties osFullName

# Hardware specifications
_snipeit_cpu_model_7 = properties processorModel
_snipeit_cpu_cores_8 = properties processorCount
_snipeit_memory_size_9 = properties memorySize
_snipeit_disk_size_10 = properties diskSize

# Location and organizational
_snipeit_location_11 = properties location
_snipeit_department_12 = properties department
_snipeit_cost_center_13 = properties costCenter
_snipeit_building_14 = properties building
_snipeit_floor_15 = properties floor

# Technical details
_snipeit_serial_number_16 = properties serialNumber
_snipeit_asset_owner_17 = properties assetOwner
_snipeit_purchase_date_18 = properties purchaseDate
_snipeit_warranty_end_19 = properties warrantyExpiration

# Management information
_snipeit_last_inventory_20 = properties inventoryDate
_snipeit_agent_version_21 = properties agentName
_snipeit_compliance_status_22 = properties complianceStatus

[user-mapping]
rudder_api_field = properties primaryUser

Deployment Script

#!/bin/bash
# enterprise-deploy.sh

LOG_DIR="/var/log/rudder2snipe"
LOG_FILE="$LOG_DIR/enterprise-sync.log"
ERROR_LOG="$LOG_DIR/enterprise-error.log"

# Ensure log directory exists
mkdir -p "$LOG_DIR"

# Pre-sync checks
echo "$(date): Starting enterprise sync" >> "$LOG_FILE"

# Check disk space
DISK_USAGE=$(df /var | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 90 ]; then
    echo "$(date): WARNING - Disk usage at ${DISK_USAGE}%" >> "$LOG_FILE"
fi

# Run sync with rate limiting and user assignment
/opt/rudder2snipe/.venv/bin/python /opt/rudder2snipe/rudder2snipe \
    --ratelimited \
    --users \
    --verbose \
    >> "$LOG_FILE" 2>> "$ERROR_LOG"

EXIT_CODE=$?

# Post-sync reporting
if [ $EXIT_CODE -eq 0 ]; then
    echo "$(date): Sync completed successfully" >> "$LOG_FILE"
    
    # Count successful operations
    CREATED=$(grep -c "Successfully created asset" "$LOG_FILE")
    UPDATED=$(grep -c "Successfully updated" "$LOG_FILE")
    
    echo "$(date): Created: $CREATED, Updated: $UPDATED" >> "$LOG_FILE"
else
    echo "$(date): Sync failed with exit code $EXIT_CODE" >> "$ERROR_LOG"
    
    # Send alert email
    mail -s "Enterprise rudder2snipe sync failed" [email protected] < "$ERROR_LOG"
fi

Cron Configuration

# /etc/cron.d/rudder2snipe-enterprise
# Run every 4 hours during business hours
0 8,12,16 * * 1-5 rudder /opt/rudder2snipe/enterprise-deploy.sh

# Weekly full sync with force update
0 2 * * 0 rudder /opt/rudder2snipe/.venv/bin/python /opt/rudder2snipe/rudder2snipe --force --ratelimited --users_force --verbose >> /var/log/rudder2snipe/weekly-sync.log 2>&1

Expected Results

  • Manages 1000+ assets efficiently
  • Rich custom field data
  • Automatic user assignments
  • ~60-90 minutes execution time with rate limiting
  • Comprehensive logging and monitoring

🌐 Managed Service Provider

Scenario: Multiple clients, separate Snipe instances, centralized management

Directory Structure

/opt/rudder2snipe/
├── clients/
│   ├── client1/
│   │   ├── settings.conf
│   │   └── logs/
│   ├── client2/
│   │   ├── settings.conf
│   │   └── logs/
│   └── client3/
│       ├── settings.conf
│       └── logs/
├── scripts/
│   ├── sync-all-clients.sh
│   ├── sync-client.sh
│   └── health-check.sh
└── templates/
    └── settings-template.conf

Client Configuration Template

# /opt/rudder2snipe/templates/settings-template.conf
[rudder]
url = https://rudder.CLIENT_NAME.msp.com
api_token = CLIENT_RUDDER_TOKEN

[snipe-it]
url = https://snipe.CLIENT_NAME.msp.com
apikey = CLIENT_SNIPE_TOKEN
manufacturer_id = 1
defaultStatus = 2
computer_model_category_id = 1
asset_tag = properties serialNumber

[api-mapping]
name = hostname
_snipeit_client_id_1 = properties clientId
_snipeit_contract_number_2 = properties contractNumber
_snipeit_service_level_3 = properties serviceLevel
_snipeit_ip_address_4 = properties ipHostNumber
_snipeit_os_5 = properties osName
_snipeit_location_6 = properties location
_snipeit_contact_person_7 = properties contactPerson

[user-mapping]
rudder_api_field = properties username

Client-Specific Configuration (Example)

# /opt/rudder2snipe/clients/acme-corp/settings.conf
[rudder]
url = https://rudder.acme-corp.msp.com
api_token = acme_token_abc123

[snipe-it]
url = https://snipe.acme-corp.msp.com
apikey = acme_snipe_xyz789
manufacturer_id = 2
defaultStatus = 2
computer_model_category_id = 1

[api-mapping]
name = hostname
_snipeit_client_id_1 = properties clientId
_snipeit_contract_number_2 = properties contractNumber
_snipeit_ip_address_3 = properties ipHostNumber
_snipeit_os_4 = properties osName
_snipeit_department_5 = properties department
_snipeit_employee_id_6 = properties employeeId

[user-mapping]
rudder_api_field = properties username

Multi-Client Sync Script

#!/bin/bash
# /opt/rudder2snipe/scripts/sync-all-clients.sh

CLIENTS_DIR="/opt/rudder2snipe/clients"
SCRIPT_DIR="/opt/rudder2snipe"
MASTER_LOG="/var/log/rudder2snipe/master-sync.log"

echo "$(date): Starting multi-client sync" >> "$MASTER_LOG"

for client_dir in "$CLIENTS_DIR"/*/; do
    client_name=$(basename "$client_dir")
    
    echo "$(date): Processing client: $client_name" >> "$MASTER_LOG"
    
    if [ -f "$client_dir/settings.conf" ]; then
        # Create client-specific log directory
        mkdir -p "$client_dir/logs"
        
        # Run sync for this client
        cd "$client_dir"
        
        /opt/rudder2snipe/.venv/bin/python "$SCRIPT_DIR/rudder2snipe" \
            --ratelimited \
            --verbose \
            > "logs/sync-$(date +%Y%m%d).log" 2>&1
        
        EXIT_CODE=$?
        
        if [ $EXIT_CODE -eq 0 ]; then
            echo "$(date): Client $client_name sync completed successfully" >> "$MASTER_LOG"
        else
            echo "$(date): Client $client_name sync failed with code $EXIT_CODE" >> "$MASTER_LOG"
            
            # Alert for this specific client
            echo "Client $client_name sync failed at $(date)" | \
                mail -s "MSP Alert: $client_name sync failed" [email protected]
        fi
        
        # Brief pause between clients
        sleep 30
    else
        echo "$(date): Warning - No settings.conf found for $client_name" >> "$MASTER_LOG"
    fi
done

echo "$(date): Multi-client sync completed" >> "$MASTER_LOG"

Health Check Script

#!/bin/bash
# /opt/rudder2snipe/scripts/health-check.sh

CLIENTS_DIR="/opt/rudder2snipe/clients"
HEALTH_REPORT="/tmp/rudder2snipe-health.txt"

echo "rudder2snipe Health Report - $(date)" > "$HEALTH_REPORT"
echo "===========================================" >> "$HEALTH_REPORT"

for client_dir in "$CLIENTS_DIR"/*/; do
    client_name=$(basename "$client_dir")
    
    echo "" >> "$HEALTH_REPORT"
    echo "Client: $client_name" >> "$HEALTH_REPORT"
    echo "-------------------" >> "$HEALTH_REPORT"
    
    if [ -f "$client_dir/settings.conf" ]; then
        echo "✓ Configuration file exists" >> "$HEALTH_REPORT"
        
        # Check recent log
        LATEST_LOG=$(find "$client_dir/logs" -name "sync-*.log" | sort | tail -1)
        if [ -n "$LATEST_LOG" ]; then
            LOG_AGE=$((($(date +%s) - $(stat -f %m "$LATEST_LOG" 2>/dev/null || stat -c %Y "$LATEST_LOG" 2>/dev/null)) / 3600))
            
            if [ $LOG_AGE -lt 25 ]; then
                echo "✓ Recent sync log found (${LOG_AGE}h ago)" >> "$HEALTH_REPORT"
                
                if grep -q error "$LATEST_LOG"; then
                    echo "⚠ Errors found in recent log" >> "$HEALTH_REPORT"
                else
                    echo "✓ No errors in recent log" >> "$HEALTH_REPORT"
                fi
            else
                echo "⚠ Last sync log is ${LOG_AGE}h old" >> "$HEALTH_REPORT"
            fi
        else
            echo "✗ No sync logs found" >> "$HEALTH_REPORT"
        fi
    else
        echo "✗ Configuration file missing" >> "$HEALTH_REPORT"
    fi
done

# Email health report
mail -s "MSP rudder2snipe Health Report" [email protected] < "$HEALTH_REPORT"

Expected Results

  • Manages multiple client environments independently
  • Centralized monitoring and alerting
  • Client-specific configurations and logging
  • Scalable architecture for growth

🧪 Development Environment

Scenario: Testing environment, development features, safe experimentation

Configuration

[rudder]
url = https://rudder-dev.lab.local
api_token = dev_token_12345

[snipe-it]
url = https://snipe-dev.lab.local
apikey = dev_key_67890
manufacturer_id = 1
defaultStatus = 1
computer_model_category_id = 1

[api-mapping]
name = hostname
_snipeit_environment_1 = properties environment
_snipeit_test_flag_2 = properties testFlag
_snipeit_developer_3 = properties developer
_snipeit_ip_address_4 = properties ipHostNumber
_snipeit_os_5 = properties osName

Development Workflow

#!/bin/bash
# dev-workflow.sh

echo "=== Development rudder2snipe Workflow ==="

# Always start with connection test
echo "1. Testing connections..."
python3 rudder2snipe --connection_test

if [ $? -ne 0 ]; then
    echo "Connection test failed. Check configuration."
    exit 1
fi

# Run dry run with debug
echo "2. Running dry run with debug output..."
python3 rudder2snipe --dryrun --debug | tee dev-dryrun.log

# Check for any obvious issues
if grep -q "ERROR\|error" dev-dryrun.log; then
    echo "Errors found in dry run. Review dev-dryrun.log"
    exit 1
fi

# Test specific features
echo "3. Testing user assignment (dry run)..."
python3 rudder2snipe --dryrun --users_force --debug | tee dev-users.log

echo "4. Testing force update (dry run)..."
python3 rudder2snipe --dryrun --force --debug | tee dev-force.log

echo "5. All tests completed. Review log files before live run."
echo "   To run live: python3 rudder2snipe --verbose"

Expected Results

  • Safe testing environment
  • Detailed debugging information
  • Feature validation before production
  • Rapid iteration and testing

🌍 Multi-Site Configuration

Scenario: Multiple geographical locations, different Rudder instances, centralized Snipe-IT

Site-Specific Configurations

Headquarters (US)

# settings-us-hq.conf
[rudder]
url = https://rudder-us.company.com
api_token = us_token_abc123

[snipe-it]
url = https://snipe.company.com
apikey = global_snipe_key
manufacturer_id = 2
defaultStatus = 2
computer_model_category_id = 1

[api-mapping]
name = hostname
_snipeit_site_code_1 = properties siteCode
_snipeit_location_2 = properties location
_snipeit_timezone_3 = properties timezone
_snipeit_ip_address_4 = properties ipHostNumber
_snipeit_os_5 = properties osName
_snipeit_cost_center_6 = properties costCenter

European Office

# settings-eu.conf
[rudder]
url = https://rudder-eu.company.com
api_token = eu_token_def456

[snipe-it]
url = https://snipe.company.com
apikey = global_snipe_key
manufacturer_id = 2
defaultStatus = 2
computer_model_category_id = 1

[api-mapping]
name = hostname
_snipeit_site_code_1 = properties siteCode
_snipeit_location_2 = properties location
_snipeit_timezone_3 = properties timezone
_snipeit_ip_address_4 = properties ipHostNumber
_snipeit_os_5 = properties osName
_snipeit_gdpr_flag_7 = properties gdprCompliant

Asia Pacific Office

# settings-apac.conf
[rudder]
url = https://rudder-apac.company.com
api_token = apac_token_ghi789

[snipe-it]
url = https://snipe.company.com
apikey = global_snipe_key
manufacturer_id = 2
defaultStatus = 2
computer_model_category_id = 1

[api-mapping]
name = hostname
_snipeit_site_code_1 = properties siteCode
_snipeit_location_2 = properties location
_snipeit_timezone_3 = properties timezone
_snipeit_ip_address_4 = properties ipHostNumber
_snipeit_os_5 = properties osName
_snipeit_language_8 = properties systemLanguage

Multi-Site Sync Script

#!/bin/bash
# multi-site-sync.sh

CONFIGS_DIR="/opt/rudder2snipe/configs"
SITES=("us-hq" "eu" "apac")

for site in "${SITES[@]}"; do
    echo "$(date): Starting sync for site: $site"
    
    # Calculate timezone-appropriate delay
    case $site in
        "us-hq")
            # US Eastern: Run at 8 AM local
            delay=0
            ;;
        "eu")
            # European: Run at 8 AM local (6 hours ahead)
            delay=$((6*60))
            ;;
        "apac")
            # Asia Pacific: Run at 8 AM local (13 hours ahead)
            delay=$((13*60))
            ;;
    esac
    
    # Schedule with at command for timezone coordination
    echo "/opt/rudder2snipe/.venv/bin/python /opt/rudder2snipe/rudder2snipe --config $CONFIGS_DIR/settings-$site.conf --ratelimited --verbose >> /var/log/rudder2snipe/sync-$site.log 2>&1" | at now + $delay minutes
    
    echo "$(date): Scheduled sync for $site in $delay minutes"
done

📊 Custom Field Examples

Advanced Hardware Tracking

[api-mapping]
# Basic identification
name = hostname
_snipeit_serial_number_1 = properties serialNumber
_snipeit_asset_tag_2 = properties assetTag

# Hardware specifications
_snipeit_cpu_model_3 = properties processorModel
_snipeit_cpu_cores_4 = properties processorCount
_snipeit_cpu_speed_5 = properties processorSpeed
_snipeit_memory_total_6 = properties memorySize
_snipeit_memory_type_7 = properties memoryType
_snipeit_storage_primary_8 = properties primaryDiskSize
_snipeit_storage_type_9 = properties primaryDiskType

# Network configuration
_snipeit_ip_primary_10 = properties ipHostNumber
_snipeit_mac_primary_11 = properties macAddress
_snipeit_network_speed_12 = properties networkSpeed
_snipeit_wifi_enabled_13 = properties wifiEnabled

# System information
_snipeit_os_name_14 = properties osName
_snipeit_os_version_15 = properties osVersion
_snipeit_os_architecture_16 = properties osArchitecture
_snipeit_last_boot_17 = properties lastBootTime
_snipeit_uptime_18 = properties uptime

# Security and compliance
_snipeit_encryption_status_19 = properties diskEncryption
_snipeit_firewall_status_20 = properties firewallEnabled
_snipeit_antivirus_21 = properties antivirusProduct
_snipeit_compliance_score_22 = properties complianceScore

Financial and Procurement Tracking

[api-mapping]
# Asset identification
name = hostname
_snipeit_asset_number_1 = properties assetNumber
_snipeit_serial_number_2 = properties serialNumber

# Financial information
_snipeit_purchase_price_3 = properties purchasePrice
_snipeit_purchase_date_4 = properties purchaseDate
_snipeit_vendor_5 = properties vendor
_snipeit_po_number_6 = properties purchaseOrderNumber
_snipeit_warranty_end_7 = properties warrantyExpiration
_snipeit_depreciation_8 = properties depreciationValue

# Organizational tracking
_snipeit_cost_center_9 = properties costCenter
_snipeit_department_10 = properties department
_snipeit_project_code_11 = properties projectCode
_snipeit_budget_year_12 = properties budgetYear

Location and User Tracking

[api-mapping]
# Asset identification
name = hostname

# Location details
_snipeit_building_1 = properties building
_snipeit_floor_2 = properties floor
_snipeit_room_3 = properties room
_snipeit_desk_number_4 = properties deskNumber
_snipeit_site_code_5 = properties siteCode

# User information
_snipeit_assigned_user_6 = properties assignedUser
_snipeit_user_email_7 = properties userEmail
_snipeit_user_phone_8 = properties userPhone
_snipeit_manager_9 = properties managerName

# Usage tracking
_snipeit_last_login_10 = properties lastLoginTime
_snipeit_login_count_11 = properties loginCount
_snipeit_usage_hours_12 = properties dailyUsageHours

🔧 Automation Examples

Systemd Service with Multiple Configurations

# /etc/systemd/system/[email protected]
[Unit]
Description=Rudder to Snipe-IT Sync for %i
After=network.target

[Service]
Type=oneshot
User=rudder
Group=rudder
WorkingDirectory=/opt/rudder2snipe
ExecStart=/opt/rudder2snipe/.venv/bin/python /opt/rudder2snipe/rudder2snipe --config /opt/rudder2snipe/configs/settings-%i.conf --ratelimited --verbose
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Usage

# Enable services for different environments
systemctl enable [email protected]
systemctl enable [email protected]
systemctl enable [email protected]

# Run specific environment
systemctl start [email protected]

Docker Deployment

# Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY rudder2snipe .
COPY settings.conf .

USER nobody

ENTRYPOINT ["python", "rudder2snipe"]
CMD ["--ratelimited", "--verbose"]
# docker-compose.yml
version: '3.8'
services:
  rudder2snipe-prod:
    build: .
    volumes:
      - ./configs/production.conf:/app/settings.conf:ro
      - ./logs:/app/logs
    environment:
      - TZ=UTC
    
  rudder2snipe-staging:
    build: .
    volumes:
      - ./configs/staging.conf:/app/settings.conf:ro
      - ./logs:/app/logs
    environment:
      - TZ=UTC

These examples provide comprehensive templates for various deployment scenarios. Choose the configuration that best matches your environment and customize the field mappings according to your specific requirements.

Next: Troubleshooting