Шаги (Step)

class carnival.Step(**context)

Объект, предназначенный для выполнения группы комманд с какой-то целью. Вызывается из класса carnival.Task для выполнения комманд (carnival.cmd) на определенных хостах.

Может требовать наличие определенных контекстных переменных для работы, указав их в аргументах метода run. Может вернуть значение для дальнейшего использования.

В следующем примере переменная disk_name будет передана в run, а install пропущена.

>>> host = Host(
>>>     #  Адрес
>>>     "1.2.3.4",
>>>
>>>     # Контекст хоста
>>>     disk_name="/dev/sda1", install=['nginx', 'htop', ]
>>> )
>>> ...
>>> class DiskUsage(Step):
>>>     def run(self, disk_name: str):
>>>         ...
__init__(**context)
Параметры:context – Переменные контекста, назначенные при вызове Шага
run(**kwargs)

Метод который нужно определить для выполнения комманд

Параметры:kwargs – Автоматические подставляемые переменные контекста, поддерживается **kwargs

Работа с контекстом

Существует несколько видов контекста:
  • Специальные переменные контекста
  • Переменные окружения, начинающиеся с префикса CARNIVAL_CTX_. Переменную CARNIVAL_CTX_WORKDIR можно получить по имени WORKDIR. Поддерживается .env-файлы.
  • Контекст хоста (Host.__init__(…, **context)).
  • Контекст шага (Step.__init__(**context)).
Специальные переменные контекста:
  • host - host, на котором вызвано выполнение.

Перегрузка контекста

Список необходимых переменных контекста для шага строится автоматически из сигнатуры метода Step.run из переменных контекста хоста и шага, поддерживается **kwargs.

  • Специальные переменные контекста имеют самый низкий приоритет. Если существует переменная контекста хоста с таким же именем - она будет иметь более высокий приоритет, и перезапишет значение в аргументе Step.run.
  • Переменные окружения имеют приоритет выше, чем специальны переменные.
  • Переменные контекста шага имеют самый высокий приоритет, они перезаписывают любые другие переменные.
>>> host = Host("1.2.3.4", disk_name="/dev/sda1", install=['nginx', 'htop', ])
>>>
>>> class DiskUsage(Step):
>>>     def run(self, disk_name: str):
>>>         return cmd.cli.run(f"du -h {disk_name}")
>>>
>>> class FrontendDiskUsage(Task):
>>>     def run(self):
>>>         # получить использование диска `/dev/sda1` (`host.disk_name`)
>>>         self.step(DiskUsage(), host)
>>>
>>>         # получить использование диска `/dev/sda2`
>>>         # (перегружается из контекста шага)
>>>         self.step(DiskUsage(disk_name="/dev/sda2"), host)
>>>