# Ansible Generator

> Comprehensive toolkit for generating best practice Ansible playbooks, roles, tasks, and inventory files.

- Skill: `diegosouzapw/ansible-generator` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add diegosouzapw/ansible-generator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/diegosouzapw/ansible-generator/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: diegosouzapw (https://skillmd.com/u/diegosouzapw)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/diegosouzapw/ansible-generator

---


# Ansible Generator

## Overview

Generate production-ready Ansible resources (playbooks, roles, tasks, inventory files) following current best practices, naming conventions, and security standards. All generated resources are automatically validated using the devops-skills:ansible-validator skill to ensure syntax correctness and lint compliance.

## Core Capabilities

### 1. Generate Ansible Playbooks

Create complete, production-ready playbooks with proper structure, error handling, and idempotency.

**When to use:**
- User requests: "Create a playbook to...", "Build a playbook for...", "Generate playbook that..."
- Scenarios: Application deployment, system configuration, backup automation, service management

**Process:**
1. Understand the user's requirements (what needs to be automated)
2. Identify target hosts, required privileges, and operating systems
3. Use `assets/templates/playbook/basic_playbook.yml` as structural foundation
4. Reference `references/best-practices.md` for implementation patterns
5. Reference `references/module-patterns.md` for correct module usage
6. Generate the playbook following these principles:
   - Use Fully Qualified Collection Names (FQCN) for all modules
   - Ensure idempotency (all tasks safe to run multiple times)
   - Include proper error handling and conditionals
   - Add meaningful task names starting with verbs
   - Use appropriate tags for task categorization
   - Include documentation header with usage instructions
   - Add health checks in post_tasks when applicable
7. **ALWAYS validate** the generated playbook using the devops-skills:ansible-validator skill
8. If validation fails, fix the issues and re-validate

**Example structure:**
```yaml
---
# Playbook: Deploy Web Application
# Description: Deploy nginx web server with SSL
# Requirements:
#   - Ansible 2.10+
#   - Target hosts: Ubuntu 20.04+
# Variables:
#   - app_port: Application port (default: 8080)
# Usage:
#   ansible-playbook -i inventory/production deploy_web.yml

- name: Deploy and configure web server
  hosts: webservers
  become: true
  gather_facts: true

  vars:
    app_port: 8080
    nginx_version: latest

  pre_tasks:
    - name: Update package cache
      ansible.builtin.apt:
        update_cache: true
        cache_valid_time: 3600
      when: ansible_os_family == "Debian"

  tasks:
    - name: Ensure nginx is installed
      ansible.builtin.package:
        name: nginx
        state: present
      tags:
        - install
        - nginx

    - name: Deploy nginx configuration
      ansible.builtin.template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        mode: '0644'
        backup: true
        validate: 'nginx -t -c %s'
      notify: Reload nginx
      tags:
        - configure

  post_tasks:
    - name: Verify nginx is responding
      ansible.builtin.uri:
        url: "http://localhost:{{ app_port }}/health"
        status_code: 200
      register: health_check
      until: health_check.status == 200
      retries: 5
      delay: 10

  handlers:
    - name: Reload nginx
      ansible.builtin.service:
        name: nginx
        state: reloaded
```

### 2. Generate Ansible Roles

Create complete role structures with all required components organized following Ansible Galaxy conventions.

**When to use:**
- User requests: "Create a role for...", "Generate a role to...", "Build role that..."
- Scenarios: Reusable component creation, complex service setup, multi-environment deployments

**Process:**
1. Understand the role's purpose and scope
2. Copy and customize the complete role structure from `assets/templates/role/`:
   - `tasks/main.yml` - Main task execution logic
   - `handlers/main.yml` - Event handlers (service restarts, reloads)
   - `templates/` - Jinja2 configuration templates
   - `files/` - Static files to copy
   - `vars/main.yml` - Role-specific variables (high priority)
   - `vars/Debian.yml` and `vars/RedHat.yml` - OS-specific variables
   - `defaults/main.yml` - Default variables (easily overridable)
   - `meta/main.yml` - Role metadata and dependencies
   - `README.md` - Role documentation
3. Replace all `[PLACEHOLDERS]` with actual values:
   - `[ROLE_NAME]` - The role name (lowercase with underscores)
   - `[role_name]` - Variable prefix for role variables
   - `[PLAYBOOK_DESCRIPTION]` - Description of what the role does
   - `[package_name]`, `[service_name]` - Actual package/service names
   - `[default_port]` - Default port numbers
   - All other placeholders as needed
4. Implement role-specific logic following best practices:
   - Use OS-specific variables via `include_vars`
   - Prefix all role variables with role name
   - Create handlers for all service changes
   - Include validation in template tasks
   - Add comprehensive tags
5. Create proper role documentation in README.md
6. **ALWAYS validate** the role using the devops-skills:ansible-validator skill
7. Fix any validation errors and re-validate

**Role variable naming convention:**
- Prefix: `{{ role_name }}_`
- Examples: `nginx_port`, `nginx_worker_processes`, `postgres_max_connections`

### 3. Generate Task Files

Create focused task files for specific operations that can be included in playbooks or roles.

**When to use:**
- User requests: "Create tasks to...", "Generate task file for..."
- Scenarios: Reusable task sequences, complex operations, conditional includes

**Process:**
1. Define the specific operation to automate
2. Reference `references/module-patterns.md` for correct module usage
3. Generate task file with:
   - Descriptive task names (verb-first)
   - FQCN for all modules
   - Proper error handling
   - Idempotency checks
   - Appropriate tags
   - Conditional execution where needed
4. **ALWAYS validate** using the devops-skills:ansible-validator skill

**Example:**
```yaml
---
# Tasks: Database backup operations

- name: Create backup directory
  ansible.builtin.file:
    path: "{{ backup_dir }}"
    state: directory
    mode: '0755'
    owner: postgres
    group: postgres

- name: Dump PostgreSQL database
  ansible.builtin.command: >
    pg_dump -h {{ db_host }} -U {{ db_user }} -d {{ db_name }}
    -f {{ backup_dir }}/{{ db_name }}_{{ ansible_date_time.date }}.sql
  environment:
    PGPASSWORD: "{{ db_password }}"
  no_log: true
  changed_when: true

- name: Compress backup file
  ansible.builtin.archive:
    path: "{{ backup_dir }}/{{ db_name }}_{{ ansible_date_time.date }}.sql"
    dest: "{{ backup_dir }}/{{ db_name }}_{{ ansible_date_time.date }}.sql.gz"
    format: gz
    remove: true

- name: Remove old backups
  ansible.builtin.find:
    paths: "{{ backup_dir }}"
    patterns: "*.sql.gz"
    age: "{{ backup_retention_days }}d"
  register: old_backups

- name: Delete old backup files
  ansible.builtin.file:
    path: "{{ item.path }}"
    state: absent
  loop: "{{ old_backups.files }}"
```

### 4. Generate Inventory Files

Create inventory configurations with proper host organization, group hierarchies, and variable management.

**When to use:**
- User requests: "Create inventory for...", "Generate inventory file..."
- Scenarios: Environment setup, host organization, multi-tier architectures

**Process:**
1. Understand the infrastructure topology
2. Use `assets/templates/inventory/` as foundation:
   - `hosts` - Main inventory file (INI or YAML format)
   - `group_vars/all.yml` - Global variables for all hosts
   - `group_vars/[groupname].yml` - Group-specific variables
   - `host_vars/[hostname].yml` - Host-specific variables
3. Organize hosts into logical groups:
   - Functional groups: `webservers`, `databases`, `loadbalancers`
   - Environment groups: `production`, `staging`, `development`
   - Geographic groups: `us-east`, `eu-west`
4. Create group hierarchies with `[group:children]`
5. Define variables at appropriate levels (all → group → host)
6. Document connection settings and requirements

**Inventory format preference:**
- Use INI format for simple, flat inventories
- Use YAML format for complex, hierarchical inventories

**Dynamic Inventory (Cloud Environments):**
For AWS, Azure, GCP, and other cloud providers, use dynamic inventory plugins:
- AWS EC2: `plugin: amazon.aws.aws_ec2` with filters and keyed_groups
- Azure: `plugin: azure.azcollection.azure_rm` with resource group filters
- Enables automatic host discovery based on tags, regions, and resource groups
- See `references/module-patterns.md` for detailed examples

### 5. Generate Project Configuration Files

**When to use:**
- User requests: "Set up Ansible project", "Initialize Ansible configuration"
- Scenarios: New project initialization, standardizing project structure

**Process:**
1. Use templates from `assets/templates/project/`:
   - `ansible.cfg` - Project configuration (forks, timeout, paths)
   - `requirements.yml` - Collections and roles dependencies
   - `.ansible-lint` - Lint rules for code quality
2. Customize based on project requirements
3. Document usage instructions

### 6. Role Argument Specifications (Ansible 2.11+)

When generating roles, include `meta/argument_specs.yml` for automatic variable validation:
- Define required and optional variables
- Specify types (str, int, bool, list, dict, path)
- Set default values and choices
- Enable automatic validation before role execution
- Template available at `assets/templates/role/meta/argument_specs.yml`

### 7. Handling Custom Modules and Collections

When generating Ansible resources that require custom modules, collections, or providers that are not part of ansible.builtin:

**Detection:**
- User mentions specific collections (e.g., "kubernetes.core", "amazon.aws", "community.docker")
- User requests integration with external tools/platforms
- Task requires modules not in ansible.builtin namespace

**Process:**
1. **Identify the collection/module:**
   - Extract collection name and module name
   - Determine if version-specific information is needed

2. **Search for current documentation using WebSearch:**
   ```
   Search query pattern: "ansible [collection.name] [module] [version] documentation examples"
   Examples:
   - "ansible kubernetes.core k8s module latest documentation"
   - "ansible amazon.aws ec2_instance 2024 examples"
   - "ansible community.docker docker_container latest documentation"
   ```

3. **Analyze search results for:**
   - Current module parameters and their types
   - Required vs optional parameters
   - Version compatibility and deprecation notices
   - Working examples and best practices
   - Collection installation requirements

4. **If Context7 MCP is available:**
   - First try to resolve library ID using `mcp__context7__resolve-library-id`
   - Then fetch documentation using `mcp__context7__get-library-docs`
   - This provides more structured and reliable documentation

5. **Generate resource using discovered information:**
   - Use correct FQCN (e.g., `kubernetes.core.k8s`, not just `k8s`)
   - Apply current parameter names and values
   - Include collection installation instructions in comments
   - Add version compatibility notes

6. **Include installation instructions:**
   ```yaml
   # Requirements:
   #   - ansible-galaxy collection install kubernetes.core:2.4.0
   # or in requirements.yml:
   # ---
   # collections:
   #   - name: kubernetes.core
   #     version: "2.4.0"
   ```

**Example with custom collection:**
```yaml
---
# Playbook: Deploy Kubernetes Resources
# Requirements:
#   - Ansible 2.10+
#   - Collection: kubernetes.core >= 2.4.0
#   - Install: ansible-galaxy collection install kubernetes.core
# Variables:
#   - k8s_namespace: Target namespace (default: default)
#   - k8s_kubeconfig: Path to kubeconfig (default: ~/.kube/config)

- name: Deploy application to Kubernetes
  hosts: localhost
  gather_facts: false
  vars:
    k8s_namespace: production
    k8s_kubeconfig: ~/.kube/config

  tasks:
    - name: Create namespace
      kubernetes.core.k8s:
        kubeconfig: "{{ k8s_kubeconfig }}"
        state: present
        definition:
          apiVersion: v1
          kind: Namespace
          metadata:
            name: "{{ k8s_namespace }}"
      tags:
        - namespace

    - name: Deploy application
      kubernetes.core.k8s:
        kubeconfig: "{{ k8s_kubeconfig }}"
        state: present
        namespace: "{{ k8s_namespace }}"
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: myapp
          spec:
            replicas: 3
            selector:
              matchLabels:
                app: myapp
            template:
              metadata:
                labels:
                  app: myapp
              spec:
                containers:
                  - name: myapp
                    image: myapp:1.0.0
                    ports:
                      - containerPort: 8080
      tags:
        - deployment
```

## Validation Workflow

**CRITICAL:** Every generated Ansible resource MUST be validated before presenting to the user.

### Validation Process

1. **After generating any Ansible file**, immediately invoke the `devops-skills:ansible-validator` skill:
   ```
   Skill: devops-skills:ansible-validator
   ```

2. **The devops-skills:ansible-validator skill will:**
   - Validate YAML syntax
   - Run ansible-lint for best practices
   - Perform ansible-playbook --syntax-check
   - Execute in check mode (dry-run) when applicable
   - Report any errors, warnings, or issues

3. **If validation fails:**
   - Analyze the reported errors
   - Fix the issues in the generated file
   - Re-validate until all checks pass

4. **If validation succeeds, present the result formally:**

   **Required Presentation Format:**
   ```
   ## Generated [Resource Type]: [Name]

   **Validation Status:** ✅ All checks passed
   - YAML syntax: Passed
   - Ansible syntax: Passed
   - Ansible lint: Passed

   **Summary:**
   - [Brief description of what was generated]
   - [Key features/sections included]
   - [Any notable implementation decisions]

   **Usage:**
   ```bash
   [Exact command to run the playbook/role]
   ```

   **Prerequisites:**
   - [Any required collections or dependencies]
   - [Target system requirements]
   ```

   This formal presentation ensures the user clearly understands:
   - That validation was successful
   - What was generated and why
   - How to use the generated resource
   - Any prerequisites or dependencies

### When to Skip Validation

Only skip validation when:
- Generating partial code snippets (not complete files)
- Creating examples for documentation purposes
- User explicitly requests to skip validation

## Best Practices to Enforce

Reference `references/best-practices.md` for comprehensive guidelines. Key principles:

### Mandatory Standards

1. **FQCN (Fully Qualified Collection Names):**
   - ✅ Correct: `ansible.builtin.copy`, `community.general.ufw`
   - ❌ Wrong: `copy`, `ufw`

2. **Idempotency:**
   - All tasks must be safe to run multiple times
   - Use `state: present/absent` declarations
   - Avoid `command`/`shell` when builtin modules exist
   - When using `command`/`shell`, use `creates`, `removes`, or `changed_when`

3. **Naming:**
   - Task names: Descriptive, start with verb ("Ensure", "Create", "Deploy")
   - Variables: snake_case with descriptive names
   - Role variables: Prefixed with role name
   - Files: lowercase with underscores

4. **Security:**
   - Use `no_log: true` for sensitive operations
   - Set restrictive file permissions (600 for secrets, 644 for configs)
   - Never commit passwords/secrets in plain text
   - Reference ansible-vault for secrets management

5. **Error Handling:**
   - Include `when` conditionals for OS-specific tasks
   - Use `register` to capture task results
   - Add `failed_when` and `changed_when` for command modules
   - Include `validate` parameter for configuration files

6. **Performance:**
   - Disable fact gathering when not needed: `gather_facts: false`
   - Use `update_cache` with `cache_valid_time` for package managers
   - Implement async tasks for long-running operations

7. **Documentation:**
   - Add header comments to playbooks with requirements and usage
   - Document all variables with descriptions and defaults
   - Include examples in role README files

### Module Selection Priority

**IMPORTANT:** Always prefer builtin modules over collection modules when possible. This ensures:
- Better validation compatibility (validation environments may not have collections installed)
- Fewer external dependencies
- More reliable playbook execution across environments

**Priority Order:**
1. **Builtin modules (`ansible.builtin.*`)** - ALWAYS first choice
   - Check `references/module-patterns.md` for builtin alternatives before using collections
   - Example: Use `ansible.builtin.command` with `psql` instead of `community.postgresql.postgresql_db` if collection isn't essential
2. **Official collection modules** (verified collections) - Second choice, only when builtin doesn't exist
3. **Community modules** (`community.*`) - Third choice
4. **Custom modules** - Last resort
5. **Avoid `command`/`shell`** - Only when no module alternative exists

### Handling Collection Dependencies in Validation

When validation fails due to missing collections (e.g., "couldn't resolve module/action"):

1. **First, check if a builtin alternative exists:**
   - Many collection modules have `ansible.builtin.*` equivalents
   - Example: Instead of `community.postgresql.postgresql_db`, use `ansible.builtin.command` with `psql` commands
   - Example: Instead of `community.docker.docker_container`, use `ansible.builtin.command` with `docker` CLI

2. **If collection is required (no builtin alternative):**
   - Document the collection requirement clearly in the playbook header
   - Add installation instructions in comments
   - Consider providing both approaches (collection-based and builtin fallback)

3. **If validation environment lacks collections:**
   - Rewrite tasks using `ansible.builtin.*` modules with equivalent CLI commands
   - Use `changed_when` and `creates`/`removes` for idempotency with command modules
   - Document that the collection-based approach is preferred in production

**Example - Builtin fallback for PostgreSQL:**
```yaml
# Preferred (requires community.postgresql collection):
# - name: Create database
#   community.postgresql.postgresql_db:
#     name: mydb
#     state: present

# Builtin fallback (works without collection):
- name: Check if database exists
  ansible.builtin.command:
    cmd: psql -tAc "SELECT 1 FROM pg_database WHERE datname='mydb'"
  become: true
  become_user: postgres
  register: db_check
  changed_when: false

- name: Create database
  ansible.builtin.command:
    cmd: psql -c "CREATE DATABASE mydb"
  become: true
  become_user: postgres
  when: db_check.stdout != "1"
  changed_when: true
```

## Resources

### References (Load on Skill Invocation)

**IMPORTANT:** These reference files should be **read at the start of generation** to inform implementation decisions. Do not just rely on general knowledge - explicitly read the references to ensure current best practices are applied.

- `references/best-practices.md` - Comprehensive Ansible best practices guide
  - Directory structures, naming conventions, task writing
  - Variables, handlers, templates, security
  - Testing, performance optimization, common pitfalls
  - **When to read:** At the start of generating any Ansible resource
  - **How to use:** Extract relevant patterns for the specific resource type being generated

- `references/module-patterns.md` - Common module usage patterns and examples
  - Complete examples for all common ansible.builtin modules
  - Collection module examples (docker, postgresql, etc.)
  - Copy-paste ready code snippets
  - **When to read:** When selecting modules for tasks
  - **How to use:** Find the correct module and parameter syntax for the operation needed

### Assets (Templates as Reference Structures)

Templates serve as **structural references** showing the expected format and organization. You do NOT need to literally copy and paste them - use them as guides for the correct structure, sections, and patterns.

- `assets/templates/playbook/basic_playbook.yml` - Reference playbook structure
  - Shows: pre_tasks, tasks, post_tasks, handlers organization
  - Shows: Header documentation format
  - Shows: Variable declaration patterns
- `assets/templates/role/*` - Reference role directory structure
  - Shows: Required files and their organization
  - Shows: Variable naming conventions
  - `meta/argument_specs.yml` - Role variable validation (Ansible 2.11+)
- `assets/templates/inventory/*` - Reference inventory organization
  - Shows: Host grouping patterns
  - Shows: group_vars/host_vars structure
- `assets/templates/project/*` - Reference project configuration
  - `ansible.cfg` - Project-level Ansible configuration
  - `requirements.yml` - Collections and roles dependencies
  - `.ansible-lint` - Linting rules configuration

**How to use templates:**
1. **Review** the relevant template to understand the expected structure
2. **Generate** content following the same organizational pattern
3. **Replace** all `[PLACEHOLDERS]` with actual values appropriate for the task
4. **Customize** logic based on user requirements
5. **Remove** unnecessary sections that don't apply
6. **Validate** the result using devops-skills:ansible-validator skill

## Typical Workflow Example

**User request:** "Create a playbook to deploy nginx with SSL"

**Process:**
1. ✅ Understand requirements:
   - Deploy nginx web server
   - Configure SSL/TLS
   - Ensure service is running
   - Target: Linux servers (Ubuntu/RHEL)

2. ✅ Reference resources:
   - Check `references/best-practices.md` for playbook structure
   - Check `references/module-patterns.md` for nginx-related modules
   - Use `assets/templates/playbook/basic_playbook.yml` as base

3. ✅ Generate playbook:
   - Use FQCN for all modules
   - Include OS-specific conditionals
   - Add SSL configuration tasks
   - Include validation and health checks
   - Add proper tags and handlers

4. ✅ Validate:
   - Invoke `devops-skills:ansible-validator` skill
   - Fix any reported issues
   - Re-validate if needed

5. ✅ Present to user:
   - Show validated playbook
   - Explain key sections
   - Provide usage instructions
   - Mention successful validation

## Common Patterns

### Multi-OS Support
```yaml
- name: Install nginx (Debian/Ubuntu)
  ansible.builtin.apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"

# NOTE: For RHEL 8+, use ansible.builtin.dnf instead of yum
# ansible.builtin.yum is deprecated in favor of dnf for modern RHEL/CentOS
- name: Install nginx (RHEL 8+/CentOS 8+)
  ansible.builtin.dnf:
    name: nginx
    state: present
  when: ansible_os_family == "RedHat"
```

### Template Deployment with Validation
```yaml
- name: Deploy configuration
  ansible.builtin.template:
    src: app_config.j2
    dest: /etc/app/config.yml
    mode: '0644'
    backup: true
    validate: '/usr/bin/app validate %s'
  notify: Restart application
```

### Async Long-Running Tasks
```yaml
- name: Run database migration
  ansible.builtin.command: /opt/app/migrate.sh
  async: 3600
  poll: 0
  register: migration

- name: Check migration status
  ansible.builtin.async_status:
    jid: "{{ migration.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 360
  delay: 10
```

### Conditional Execution
```yaml
- name: Configure production settings
  ansible.builtin.template:
    src: production.j2
    dest: /etc/app/config.yml
  when:
    - env == "production"
    - ansible_distribution == "Ubuntu"
```

## Error Messages and Troubleshooting

### If devops-skills:ansible-validator reports errors:

1. **Syntax errors:** Fix YAML formatting, indentation, or structure
2. **Lint warnings:** Address best practice violations (FQCN, naming, etc.)
3. **Undefined variables:** Add variable definitions or defaults
4. **Module not found:** Check FQCN or add collection requirements
5. **Task failures in check mode:** Add `check_mode: no` for tasks that must run

### If custom module/collection documentation is not found:

1. Try alternative search queries with different versions
2. Check official Ansible Galaxy for collection
3. Look for module in ansible-collections GitHub org
4. Consider using alternative builtin modules
5. Ask user if they have specific version requirements

## Final Checklist (MANDATORY)

Before presenting any generated Ansible resource to the user, verify all items:

- [ ] **Reference files read** - Consulted `references/best-practices.md` and `references/module-patterns.md`
- [ ] **FQCN used** - All modules use fully qualified names (`ansible.builtin.*`, not bare names)
- [ ] **Booleans correct** - Use `true`/`false` (NOT `yes`/`no`) to pass ansible-lint
- [ ] **RHEL 8+** - Use `ansible.builtin.dnf` (NOT `ansible.builtin.yum`) for modern RHEL/CentOS
- [ ] **Idempotent** - All tasks safe to run multiple times
- [ ] **Security** - `no_log: true` on sensitive tasks, proper file permissions
- [ ] **Validated** - devops-skills:ansible-validator skill invoked and passed
- [ ] **Formal presentation** - Output formatted per template below

### Required Output Format

After validation passes, ALWAYS present results in this exact format:

```markdown
## Generated [Resource Type]: [Name]

**Validation Status:** ✅ All checks passed
- YAML syntax: Passed
- Ansible syntax: Passed
- Ansible lint: Passed

**Summary:**
- [Brief description of what was generated]
- [Key features/sections included]
- [Any notable implementation decisions]

**Usage:**
```bash
[Exact command to run the playbook/role]
```

**Prerequisites:**
- [Any required collections or dependencies]
- [Target system requirements]
```

---

## Summary

Always follow this sequence when generating Ansible resources:

1. **Understand** - Clarify user requirements
2. **Reference** - Check best-practices.md and module-patterns.md
3. **Generate** - Use templates and follow standards (FQCN, idempotency, naming)
4. **Search** - For custom modules/collections, use WebSearch to get current docs
5. **Validate** - ALWAYS use devops-skills:ansible-validator skill
6. **Fix** - Resolve any validation errors
7. **Present** - Deliver validated, production-ready Ansible code

Generate Ansible resources that are:
- ✅ Idempotent and safe to run multiple times
- ✅ Following current best practices and naming conventions
- ✅ Using FQCN for all modules
- ✅ Properly documented with usage instructions
- ✅ Validated and lint-clean
- ✅ Production-ready and maintainable

