Что такое полиморфизм в контексте скриптов и автоматизации?

«Что такое полиморфизм в контексте скриптов и автоматизации?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps и автоматизации полиморфизм — это возможность использовать единый интерфейс (например, команду, функцию, модуль) для работы с разными типами данных или системами, где конкретное поведение определяется контекстом. Это ключ к созданию переиспользуемых и гибких скриптов.

Пример 1: Полиморфизм в модулях Ansible. Модуль package ведет себя по-разному в зависимости от ОС:

- name: Install a package (Polymorphic task)
  package:
    name: nginx
    state: present
  # На Debian/Ubuntu выполнит `apt install nginx`
  # На RHEL/CentOS выполнит `yum install nginx`
  # На Alpine выполнит `apk add nginx`

Один и тот же модуль package адаптирует свою реализацию под менеджер пакетов целевой системы.

Пример 2: Функция в Python для работы с разными облачными провайдерами.

def create_vm(provider, config):
    """Полиморфная функция создания VM."""
    if provider == "aws":
        # Вызов boto3 EC2 client
        response = ec2.run_instances(...)
        return response['Instances'][0]['InstanceId']
    elif provider == "gcp":
        # Вызов google-cloud-compute client
        instance = compute.instances().insert(...).execute()
        return instance['id']
    elif provider == "azure":
        # Вызов azure-mgmt-compute client
        poller = compute_client.virtual_machines.begin_create_or_update(...)
        return poller.result().name
    else:
        raise ValueError(f"Unsupported provider: {provider}")

# Единый интерфейс для разных провайдеров
vm_id_aws = create_vm("aws", aws_config)
vm_id_gcp = create_vm("gcp", gcp_config)

Пример 3: Использование общих команд Linux для разных целей (ad-hoc полиморфизм). Команда jq ведет себя по-разному в зависимости от переданного фильтра:

# Извлечение поля
cat data.json | jq '.name'
# Фильтрация массива
cat data.json | jq '.[] | select(.status == "up")'
# Форматирование вывода
cat data.json | jq -r '.[].ip'

Вывод для DevOps: Полиморфизм позволяет писать абстрактные playbook'и Ansible, Terraform-модули или скрипты CI/CD, которые могут работать с разнородным окружением (разные ОС, облака, версии ПО), уменьшая дублирование кода и упрощая поддержку.

Видео-ответы