A Python tool that automatically generates argument_specs.yml
files for Ansible collections and roles. It analyzes your role's variables, tasks, and defaults to create comprehensive argument specifications that provide documentation and validation for your Ansible roles.
- Collection-Wide Processing: Process all roles in a collection automatically
- Single Role Mode: Generate specs for individual roles with interactive or automated modes
- Intelligent Type Inference: Automatically detects variable types based on naming patterns and usage
- Variable Discovery: Extracts variables from tasks, defaults, vars, and conditional statements
- Smart Filtering: Excludes registered variables, private variables, and Ansible built-ins
- Multiple Entry Points: Supports roles with multiple task entry points
- Version Tracking: Automatically adds
version_added
fields for new variables - Clean Output: Generates well-formatted YAML with alphabetical sorting
- Validation: Built-in validation of generated specs
# Install from PyPI
pip install ansible-argument-spec-generator
# Or install from source
pip install -e .
Requirements:
- Python 3.8+
- PyYAML (automatically installed)
- Ansible Core 2.11+ (for using the generated specs)
After installation, you have access to these commands:
ansible-argument-spec-generator
generate-argument-spec
(shorter alias)
# Process all roles in current collection
ansible-argument-spec-generator
# Process a single role interactively
ansible-argument-spec-generator --single-role
# Get help
ansible-argument-spec-generator --help
Process all roles in a collection:
# Process all roles in current collection
ansible-argument-spec-generator
# Process specific collection path
ansible-argument-spec-generator --collection-path /path/to/collection
# List roles in collection
ansible-argument-spec-generator --list-roles
# Process specific role only
ansible-argument-spec-generator --role my_role
Process individual roles:
# Interactive mode
ansible-argument-spec-generator --single-role
# Generate from defaults file
ansible-argument-spec-generator --single-role --from-defaults defaults/main.yml
# Generate from configuration file
ansible-argument-spec-generator --single-role --from-config config.yml
# Silent (default) - summary only
ansible-argument-spec-generator
# Basic info
ansible-argument-spec-generator -v
# Detailed processing
ansible-argument-spec-generator -vv
# Full debug output
ansible-argument-spec-generator -vvv
Option | Description |
---|---|
--single-role |
Process individual role instead of entire collection |
--collection-path PATH |
Path to collection root (default: current directory) |
--list-roles |
List all roles found in collection |
--role NAME |
Process only the specified role |
--from-defaults FILE |
Generate specs from defaults file |
--from-config FILE |
Generate from configuration file |
--output FILE |
Output file path (default: meta/argument_specs.yml) |
--validate-only |
Validate existing specs without generating |
-v, -vv, -vvv |
Verbosity levels (basic, detailed, debug) |
The tool analyzes your Ansible roles to automatically generate argument specifications:
- Discovers Variables: Extracts variables from
defaults/main.yml
,vars/main.yml
, and task files - Infers Types: Automatically detects variable types based on naming patterns and default values
- Detects Entry Points: Identifies multiple task entry points (main.yml, install.yml, etc.)
- Filters Variables: Excludes registered variables, private variables, and Ansible built-ins
- Generates Specs: Creates clean, well-formatted
argument_specs.yml
files
For complex scenarios, create a configuration file:
entry_points:
main:
short_description: "Install and configure web application"
arguments:
app_name:
type: str
required: true
description: "Name of the application"
state:
type: str
default: "present"
choices: ["present", "absent", "started", "stopped"]
description: "Desired state"
app_port:
type: int
default: 8080
description: "Port number"
required_if:
- ["state", "present", ["app_name"]]
The tool creates standard argument_specs.yml
files:
---
argument_specs:
main:
short_description: "Auto-generated specs for webapp role"
options:
app_name:
description: "Application name"
type: str
default: myapp
app_enabled:
description: "Enable application"
type: bool
default: true
config_path:
description: "Configuration file path"
type: path
default: /etc/myapp/config.yml
version_added: "1.1.0"
...
The tool automatically extracts variables from multiple sources:
- Defaults and Vars:
defaults/main.yml
andvars/main.yml
- Task Files: Variables used in Jinja2 templates, conditionals, and loops
- Multiple Entry Points: Supports roles with
main.yml
,install.yml
,configure.yml
, etc.
Variables are automatically typed based on naming patterns:
*_path
,*_dir
,*_file
→type: path
*_enabled
,*_debug
,force_*
→type: bool
*_port
,*_timeout
→type: int
Automatically excludes:
- Private variables (starting with
__
) - Registered variables from tasks
- Ansible built-ins (
ansible_facts
,inventory_hostname
, etc.)
Validate existing specs:
# Validate all roles
ansible-argument-spec-generator --validate-only
# Validate single role
ansible-argument-spec-generator --single-role --validate-only
Generated specs provide:
- Documentation:
ansible-doc --type role my_collection.my_role
- Validation: Automatic argument validation
- Error Messages: Clear feedback for invalid inputs
# Process entire collection
cd /path/to/my_collection
ansible-argument-spec-generator
# Process single role in collection
ansible-argument-spec-generator --role webapp
# Interactive single role mode
ansible-argument-spec-generator --single-role
# Generate from defaults file
ansible-argument-spec-generator --single-role --from-defaults defaults/main.yml
- "Not a collection root": Ensure you're in a directory with
galaxy.yml
androles/
- "No roles found": Check that
roles/
directory contains valid role structures - YAML parsing errors: The tool provides specific error messages for malformed files
- File encoding issues: Ensure all files are UTF-8 encoded
Use verbosity flags for troubleshooting:
# List roles in collection
ansible-argument-spec-generator --list-roles
# Validate existing specs
ansible-argument-spec-generator --validate-only
# Debug with verbosity
ansible-argument-spec-generator -vvv --role myrole
We welcome contributions! Here's how you can help improve the Ansible Argument Specs Generator:
-
Clone the repository:
git clone https://github.com/djdanielsson/ansible_arg_spec_generator.git cd ansible_arg_spec_generator
-
Set up development environment:
# Install Python 3.8+ python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate pip install -e ".[dev]"
-
Run tests:
# Run all tests pytest # Run with coverage pytest --cov=generate_argument_specs --cov-report=html # Run specific test categories pytest -k "test_basic"
-
Code formatting:
# Format code with Black black . # Check formatting black --check .
- Code Style: Follow PEP 8 guidelines
- Formatting: Use Black for consistent formatting
- Testing: Write tests for new features and bug fixes
- Documentation: Update README and docstrings for changes
- Commits: Use clear, descriptive commit messages
The project includes comprehensive tests covering:
- Core functionality
- Edge cases
- Integration tests
- CI/CD workflows
Run the full test suite:
pytest tests/ -v
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature
- Make your changes and add tests
- Ensure all tests pass:
pytest
- Format code:
black .
- Commit your changes:
git commit -m "Add your feature"
- Push to your fork:
git push origin feature/your-feature
- Create a Pull Request
- Bug Reports: Use GitHub Issues with detailed reproduction steps
- Feature Requests: Describe the proposed feature and its use case
- Questions: Check existing issues or create a discussion
This project follows a code of conduct to ensure a welcoming environment for all contributors.
MIT