Найти в Дзене
Один Rust не п...Rust

Ansible-модуль на Rust

t.me/oneRustnoqRust Реализовать Ansible-модуль на Rust в стиле Clean Architecture + DDD + Hexagonal, с ООП и SOLID. Повысив тем самым: Производительность ресурсоемких задач. Безопасность памяти. Параллелизм задач, которые может запустить Ansible. Найти альтернативы между разными подходами получения данных из Ansible. Dependency Rule: внешние слои зависят от внутренних, но не наоборот (DIP из SOLID). Composition Root — src/lib.rs и фасады модулей (mod.rs) — здесь собирается вся система через фабрики и singleton'ы. Входные параметры:: {
"operation": "greet",
"name": "World",
"language": "Russian",
"style": "Excited",
"exclamation_count": 5
} Ansible вызывает модуль, передавая JSON на stdin.
src/infrastructure/io.rs — InputReader (трейт) читает stdin.
RealInputReader читает весь ввод, парсит JSON. Поток: Например Создание контекста:src/ansible/mod.rs — фабрика ExecutionContextFactory создаёт ModuleExecutionContext.
Контекст содержит параметры, переменные Ansible, check_mode, d
Оглавление
nicktretyakov1/ansible-rust | Gitverse
ML на RUST без заморочек

t.me/oneRustnoqRust

Для чего нужна данная статья? :

Реализовать Ansible-модуль на Rust в стиле Clean Architecture + DDD + Hexagonal, с ООП и SOLID.

Повысив тем самым:

Производительность ресурсоемких задач.

Безопасность памяти.

Параллелизм задач, которые может запустить Ansible.

Зачем Вам это уметь? :

Найти альтернативы между разными подходами получения данных из Ansible.

Общая архитектура

  • Domain слой (src/domain) — чистая бизнес-логика, независимая от внешнего мира (нет зависимостей от IO, JSON, Ansible).
  • Application слой (src/application) — use-case'ы, оркестрация бизнес-логики.
  • Infrastructure слой (src/infrastructure) — внешние зависимости (IO, JSON-парсинг).
  • Ansible слой (src/ansible) — адаптер для Ansible (ввод/вывод в формате Ansible).
  • Operations слой (src/operations) — конкретные операции модуля (стратегии).
  • Common слой (src/common) — переиспользуемые утилиты, трейты, ошибки.

Dependency Rule: внешние слои зависят от внутренних, но не наоборот (DIP из SOLID).

Composition Root — src/lib.rs и фасады модулей (mod.rs) — здесь собирается вся система через фабрики и singleton'ы.

Поток выполнения модуля (от stdin до stdout)

Входные параметры::

{
"operation": "greet",
"name": "World",
"language": "Russian",
"style": "Excited",
"exclamation_count": 5
}

Ansible вызывает модуль, передавая JSON на stdin.
src/infrastructure/io.rs — InputReader (трейт) читает stdin.
RealInputReader читает весь ввод, парсит JSON.

Поток:

  • Оркестратор находит GreetOperation по имени "greet".
  • Десериализует параметры в GreetParams.
  • Логирует старт и параметры (через глобальный логгер).
  • Executor использует GreetingFactory для создания Greeting (domain entity).
  • Возвращает ModuleResult с сообщением "Привет, World!!!!!".

Например

  • main.rs или binary вызывает infrastructure::current_stdin_reader().read_json().
  • Получаем Value.
  • ansible::create_execution_context(&value) → ModuleExecutionContext.
  • application::run_module:Валидация.
    Из params берём "operation" = "greet".
    GLOBAL_ORCHESTRATOR.execute(ctx, "greet", params).
  • В реестре находим GreetOperation.
  • Выполняется greet.execute(ctx, params) → возвращает ModuleResult::success(changed=true, msg="Hello, World!").
  • Сериализуется и выводится.

Создание контекста:src/ansible/mod.rs — фабрика ExecutionContextFactory создаёт ModuleExecutionContext.
Контекст содержит параметры, переменные Ansible, check_mode, diff_mode и т.д.

Валидация:src/application/validation.rs — глобальный валидатор проверяет контекст и параметры.

Роутинг операции:Из параметров берётся operation или action.
src/operations/mod.rs — OperationRegistry ищет операцию по имени.
OperationOrchestrator (singleton) выполняет найденную операцию.

Выполнение операции:Каждая операция реализует трейт Operation.
Операция возвращает ModuleResult (changed, failed, msg, extra).

Выход:ModuleResult сериализуется в JSON и выводится на stdout.

Ключевые паттерны и SOLID в действии

Singleton (lazy_static + Arc):

  • Глобальные объекты (логгер, фабрики, оркестратор) — thread-safe singleton'ы.
  • Пример: GLOBAL_ORCHESTRATOR в operations.

Factory (OCP):

  • Фабрики для контекста, модуля, реестра операций.
  • Легко добавить новые реализации без изменения кода (OCP).

Strategy (для операций):

  • Трейт Operation — стратегия.
  • Реестр — коллекция стратегий.
  • Оркестратор выбирает стратегию по имени.

Builder (для AnsibleModule):

  • AnsibleModuleBuilder — fluent interface для конфигурации.

Dependency Injection (DIP):

  • Всё зависит от трейтов, а не конкретных реализаций.
  • Реализации подставляются через Arc<dyn Trait>.

Trait Objects (dyn Trait):

  • Для полиморфизма (Operation, InputReader, JsonProcessor).

Value Objects:

  • В domain/common — иммутабельные структуры с поведением (GreetingLanguage, ParameterRequirement).