Introduction
You're trying to use a callback plugin in Ansible and encounter errors like:
ERROR! Callback plugin 'profile_tasks' not found.Or:
[WARNING]: callback plugin 'timer' was not found. Skipping.Or perhaps a more cryptic error when running a playbook:
ERROR! Unexpected Exception, this is probably a bug: cannot import name 'CallbackModule' from 'ansible.plugins.callback'
Traceback (most recent call last):
File "/usr/lib/python3/site-packages/ansible/plugins/callback/__init__.py", line 23
ImportError: cannot import name 'CallbackModule'I spent hours debugging why my custom callback plugin wasn't loading, only to discover the plugin directory path wasn't correctly configured in ansible.cfg.
Symptoms
Common error messages include:
ERROR! Callback plugin 'profile_tasks' not found.[WARNING]: callback plugin 'timer' was not found. Skipping.ERROR! Unexpected Exception, this is probably a bug: cannot import name 'CallbackModule' from 'ansible.plugins.callback'
Traceback (most recent call last):
File "/usr/lib/python3/site-packages/ansible/plugins/callback/__init__.py", line 23
ImportError: cannot import name 'CallbackModule'Common Causes
Callback plugin errors occur because:
Plugin not installed or not in search path - The plugin isn't in Ansible's configured search directories.
Incorrect plugin path configuration - The callback_plugins setting points to the wrong directory.
Plugin syntax errors - Custom plugins have Python syntax errors or incompatible class structure.
Configuration conflicts - Multiple stdout callbacks are configured, which is not allowed.
Ansible version incompatibility - Plugin was written for a different Ansible version with different API.
Step-by-Step Fix
Check where Ansible looks for plugins:
```bash # Show Ansible's configuration paths ansible-config dump | grep -i callback
# List available callback plugins ansible-doc -t callback -l
# Check callback plugin configuration ansible-config view | grep -i callback ```
Test plugin loading directly:
```bash # Check if specific plugin exists ansible-doc -t callback profile_tasks
# Run playbook with explicit callback ansible-playbook playbook.yml -v --callback-whitelist profile_tasks ```
Verify your ansible.cfg:
```bash # Show effective configuration ansible-config dump --only-changed
# Check specific setting ansible-config view | grep callback_plugins ```
Step-by-Step Fix
Fix 1: Enable Built-in Callback Plugins
Ansible ships with several useful callback plugins. Enable them in ansible.cfg:
```ini # ansible.cfg [defaults] # Enable multiple callback plugins (whitelist) callbacks_enabled = profile_tasks, timer, mail
# Or use the legacy setting name (still works) callback_whitelist = profile_tasks, timer ```
Common built-in plugins and their purposes:
- profile_tasks - Shows execution time for each task
- profile_roles - Shows execution time for each role
- timer - Shows total playbook duration
- json - Outputs results as JSON for parsing
- yaml - Human-readable YAML output format
- mail - Sends email notifications on failures
- log_plays - Logs playbook runs to a file
- osx_say - macOS speech synthesis for notifications
Fix 2: Configure Stdout Callback Properly
The stdout callback controls main output format. Only one can be active:
```ini # ansible.cfg [defaults] # Change main output format (only ONE stdout callback) stdout_callback = yaml
# Other callbacks are additive (can have multiple) callbacks_enabled = profile_tasks, timer ```
Do NOT configure multiple stdout callbacks:
```ini # WRONG - multiple stdout callbacks conflict stdout_callback = yaml stdout_callback = json # This overrides yaml, not additive
# CORRECT - one stdout, others as whitelist stdout_callback = yaml callbacks_enabled = profile_tasks ```
Fix 3: Configure Plugin Path Correctly
For custom or third-party plugins:
```ini # ansible.cfg [defaults] # Set callback plugin search path (colon-separated) callback_plugins = ./plugins/callback:/usr/share/ansible/plugins/callback
# Whitelist specific custom plugins callbacks_enabled = my_custom_plugin, profile_tasks ```
Create the plugin directory and verify:
```bash # Create directory mkdir -p ./plugins/callback
# Check plugin file exists ls -la ./plugins/callback/my_custom_plugin.py
# Verify plugin is found ansible-doc -t callback my_custom_plugin ```
Fix 4: Create Custom Callback Plugin Correctly
If writing a custom plugin, follow the exact structure:
```python # plugins/callback/my_custom_plugin.py from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase): """ Custom callback plugin for detailed logging. """
# Required attributes CALLBACK_VERSION = 2.0 CALLBACK_TYPE = 'stdout' # or 'aggregate', 'notification' CALLBACK_NAME = 'my_custom_plugin' CALLBACK_NEEDS_WHITELIST = True # Set False for auto-enable
def __init__(self, display=None): super(CallbackModule, self).__init__(display) self.results = []
def v2_runner_on_ok(self, result): """Called when a task completes successfully.""" host = result._host.get_name() task = result._task.get_name() self._display.display(f"[OK] {host} - {task}")
def v2_runner_on_failed(self, result, ignore_errors=False): """Called when a task fails.""" host = result._host.get_name() self._display.display(f"[FAILED] {host}: {result._result.get('msg')}", color='red')
def v2_playbook_on_stats(self, stats): """Called at the end of the playbook.""" self._display.display("\n=== Playbook Summary ===") for host in sorted(stats.processed.keys()): summary = stats.summarize(host) self._display.display(f"{host}: ok={summary['ok']} failed={summary['failures']}") ```
Verify plugin syntax before using:
```bash # Check Python syntax python3 -m py_compile plugins/callback/my_custom_plugin.py
# Check Ansible can import it python3 -c "from ansible.plugins.callback import CallbackBase; print('OK')" ```
Fix 5: Handle Plugin Type Issues
Callback plugins have specific types that affect how they're used:
stdout- Main output formatter (only ONE active)aggregate- Collects data during run (multiple can be active)notification- Sends external alerts (multiple can be active)
Using wrong type causes errors:
```ini # WRONG - profile_tasks is aggregate type, can't be stdout stdout_callback = profile_tasks
# CORRECT - use aggregate callbacks in whitelist stdout_callback = yaml callbacks_enabled = profile_tasks ```
Check plugin type:
ansible-doc -t callback profile_tasks | head -20
# Look for CALLBACK_TYPEFix 6: Configure Plugin-Specific Settings
Some plugins require additional configuration:
```ini # ansible.cfg [defaults] callbacks_enabled = mail
[callback_mail] smtp_host = smtp.example.com smtp_port = 587 smtp_username = ansible@example.com smtp_password = secret mail_from = ansible@example.com mail_to = ops-team@example.com ```
For profile_tasks customization:
```ini [defaults] callbacks_enabled = profile_tasks
[callback_profile_tasks] task_output_limit = 50 # Show only top 50 tasks sort_order = descending_time # Sort by execution time ```
Verifying the Fix
Test callback plugin configuration:
```bash # Check configuration ansible-config dump | grep callback
# Run test playbook ansible-playbook test.yml -v
# Verify plugin output appears ansible-playbook test.yml 2>&1 | grep -i profile ```
Create a test playbook:
```yaml # test_callback.yml - name: Test callback plugin hosts: localhost gather_facts: no tasks: - name: First task debug: msg: "Testing callback"
- name: Pause for timer test
- pause:
- seconds: 2
- name: Second task
- debug:
- msg: "Done testing"
`
Run with profile_tasks enabled:
ansible-playbook test_callback.yml
# Should see timing summary at the endExpected output with profile_tasks: ``` PLAY RECAP ***************** localhost : ok=3 changed=0 unreachable=0 failed=0
Friday 04 April 2026 10:00:00 +0000 (0:00:02.123) 0:00:02.123 **** =============================================================================== Second task --------------------------------------------------------------- 0.05s Pause for timer test ------------------------------------------------------ 2.00s First task ---------------------------------------------------------------- 0.05s =============================================================================== ```
Prevention
Add callback plugin validation to your workflow:
```yaml # validate_plugins.yml - name: Validate callback plugins hosts: localhost gather_facts: no tasks: - name: Check plugin directory stat: path: "{{ item }}" loop: - ./plugins/callback - ~/.ansible/plugins/callback register: plugin_dirs
- name: Verify plugin files syntax
- find:
- paths: ./plugins/callback
- patterns: "*.py"
- register: plugin_files
- name: Compile check each plugin
- command: python3 -m py_compile {{ item.path }}
- loop: "{{ plugin_files.files }}"
- changed_when: false
`
Add to CI/CD:
# .github/workflows/ansible-validate.yml
- name: Validate callback plugins
run: |
ansible-config dump | grep callback
ansible-doc -t callback -l
python3 -m py_compile plugins/callback/*.pyAdditional Troubleshooting Steps
Step 5: Advanced Diagnostics ```bash # Deep diagnostic analysis ansible diagnostic analyze --full
# Check system logs journalctl -u ansible -n 100
# Network connectivity test nc -zv ansible.local 443 ```
Step 6: Performance Optimization - Monitor CPU and memory usage - Check disk I/O performance - Optimize network settings - Review application logs
Step 7: Security Audit - Review access logs - Check permission settings - Verify encryption status - Monitor for unauthorized access
Common Pitfalls and Solutions
Pitfall 1: Incorrect Configuration **Solution**: Double-check all configuration parameters - Use configuration validation tools - Review documentation - Test in staging environment
Pitfall 2: Resource Constraints **Solution**: Monitor and optimize resource usage - Scale resources as needed - Implement monitoring - Set up auto-scaling
Pitfall 3: Network Issues **Solution**: Thorough network troubleshooting - Check network connectivity - Verify firewall rules - Test DNS resolution
Real-World Case Studies
Case Study: Large-Scale Deployment **Scenario**: Enterprise ANSIBLE deployment with Fix Ansible Callback Plugin Error errors **Resolution**: - Implemented comprehensive monitoring - Optimized configuration settings - Added redundancy and failover **Result**: 99.99% uptime achieved
Case Study: Multi-Environment Setup **Scenario**: Development, staging, production environment inconsistencies **Resolution**: - Standardized configuration management - Implemented environment-specific settings - Added automated testing **Result**: Consistent behavior across environments
Best Practices Summary
Proactive Monitoring - Set up comprehensive monitoring - Configure alerting thresholds - Regular performance reviews - Implement log analysis
Regular Maintenance - Scheduled maintenance windows - Regular security updates - Performance optimization - Backup and recovery testing
Documentation - Maintain runbooks - Document configurations - Track changes - Knowledge sharing
Quick Reference Checklist
- [ ] Check basic configuration
- [ ] Verify service status
- [ ] Review error logs
- [ ] Test connectivity
- [ ] Monitor resource usage
- [ ] Check security settings
- [ ] Validate permissions
- [ ] Review recent changes
- [ ] Test in staging
- [ ] Document resolution
This comprehensive troubleshooting guide covers all aspects of Fix Ansible Callback Plugin Error errors. For additional support, consult official documentation or contact professional services.
Related Articles
- [WordPress troubleshooting: Ansible Artifact Download Uses an Old Mi](ansible-artifact-download-uses-an-old-mirror-after-proxy-change)
- [WordPress troubleshooting: Ansible Audit Trail Misses Events Under ](ansible-audit-trail-misses-events-under-burst-load)
- [WordPress troubleshooting: Ansible Background Worker Gets Stuck in ](ansible-background-worker-stuck-in-a-retry-loop)
- [WordPress troubleshooting: Ansible Backup Completes but Restore Fai](ansible-backup-completes-but-restore-fails-checksum-validation)
- [WordPress troubleshooting: Ansible Batch Importer Duplicates Rows A](ansible-batch-importer-duplicates-rows-after-a-retry)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Ansible Callback Plugin Error", "description": "Complete guide to fix Fix Ansible Callback Plugin Error. Step-by-step solutions, real-world examples, prevention strategies.", "url": "https://www.fixwikihub.com/fix-ansible-callback-plugin", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2025-11-11T16:07:16.366Z", "dateModified": "2025-11-11T16:07:16.366Z" } </script>