Skip to content

Consolidate cloud provider prompt patterns to reduce duplication #14892

@dguido

Description

@dguido

Summary

Cloud provider roles share significant duplication across both prompt files and main task files. This issue tracks consolidating common patterns into roles/cloud-common/.

Part 1: Prompt Patterns

Cloud provider prompt files (roles/cloud-*/tasks/prompts.yml) total ~704 lines with significant duplication:

Pattern Files Lines (approx)
API error handling (401/403/429/5xx) 10 200+
Credential collection (token/key prompts) 10 150+
Region selection 8 200+

Proposed Files

  • roles/cloud-common/tasks/api_error_handler.yml - common error message template
  • roles/cloud-common/tasks/prompt_credentials.yml - credential collection pattern
  • roles/cloud-common/tasks/prompt_region.yml - region selection pattern

Part 2: Main Task Patterns

All 11 cloud provider roles share nearly identical patterns in tasks/main.yml:

Output Facts (duplicated in all 11 roles)

- set_fact:
    cloud_instance_ip: "{{ instance_ip }}"
    ansible_ssh_user: "{{ ssh_user }}"
    ansible_ssh_port: "{{ ssh_port }}"
    cloudinit: "{{ cloudinit_status }}"

Cloud-Init Template Loading (inconsistent encoding)

cloud-ec2:         lookup('template', ...) | b64encode
cloud-azure:       lookup('template', ...) | string
cloud-gce:         lookup('template', ...) | b64encode
cloud-digitalocean: lookup('template', ...)

Proposed Files

  • roles/cloud-common/tasks/set_output_facts.yml - shared output facts
  • Standardized cloud_init_user_data variable with consistent encoding

Benefits

  • Reduces code duplication across 11 roles (~700+ lines → ~250 lines for prompts alone)
  • Adding a new cloud provider becomes copying a small config instead of 100+ lines of boilerplate
  • Bug fixes apply to all providers at once
  • Ensures consistent behavior and UX across providers

Files Affected

Prompt files:

  • roles/cloud-digitalocean/tasks/prompts.yml (106 lines)
  • roles/cloud-ec2/tasks/prompts.yml (138 lines)
  • roles/cloud-gce/tasks/prompts.yml (85 lines)
  • roles/cloud-azure/tasks/prompts.yml (25 lines)
  • roles/cloud-hetzner/tasks/prompts.yml
  • roles/cloud-linode/tasks/prompts.yml
  • roles/cloud-vultr/tasks/prompts.yml
  • roles/cloud-scaleway/tasks/prompts.yml
  • roles/cloud-lightsail/tasks/prompts.yml
  • roles/cloud-cloudstack/tasks/prompts.yml

Main task files:

  • All roles/cloud-*/tasks/main.yml files

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions