[Документация Yandex Cloud](../../index.md) > [Yandex Data Processing](../index.md) > [Концепции](index.md) > Скрипты инициализации

# Скрипты инициализации

При [создании кластера](../operations/cluster-create.md) вы можете указать скрипты инициализации хостов. Это может быть полезно для автоматической установки или обновления ПО, необходимого для запуска [заданий](jobs.md). Каждый скрипт будет выполнен от имени суперпользователя `root` только один раз при первом запуске хоста.

В первой строке файла скрипта укажите полный путь к интерпретатору, например, `#!/bin/sh` или `#!/usr/bin/python`.

URI скрипта может быть задан в схемах `https://`, `http://`, `hdfs://` и `s3a://`. Для `s3a://` требуется выполнение хотя бы одного из условий:

* [ACL бакета](../../storage/operations/buckets/edit-acl.md) должен разрешать сервисному аккаунту кластера операции чтения.
* Сервисному аккаунту кластера должна быть [присвоена роль](../../iam/operations/sa/assign-role-for-sa.md) `storage.viewer`.
* Доступ к бакету должен быть [публичным](../../storage/operations/buckets/bucket-availability.md).

{% note warning %}

Скрипты инициализации запускаются при каждом создании узла. Если они зависят от внешних ресурсов, например публичных репозиториев, это может привести к следующим последствиям:
* замедление создания или масштабирования кластера;
* сбой при создании кластера или добавлении узла, если внешний сервис временно недоступен;
* нарушение автоматического восстановления узлов.

Образы Yandex Data Processing имеют ссылки на публичные репозитории, не входящие в состав сервиса Yandex Data Processing. Их недоступность может нарушить работу кластера. Поэтому рекомендуется минимизировать количество операций в скриптах инициализации.

{% endnote %}


## Переменные окружения {#env-variables}

Для использования в скриптах инициализации доступны следующие переменные окружения:

* `CLUSTER_ID` — идентификатор кластера.
* `S3_BUCKET` — имя привязанного бакета Yandex Object Storage.
* `ROLE` — роль хоста (`masternode`, `computenode` или `datanode`).
* `CLUSTER_SERVICES` — [список компонентов](environment.md).
* `MAX_WORKER_COUNT` — максимальное количество хостов подкластеров для хранения и обработки данных.
* `MIN_WORKER_COUNT` — минимальное количество хостов подкластеров для хранения и обработки данных.

Например, чтобы выполнить часть скрипта только на хосте-мастере (`masternode`), используйте проверку значения переменной окружения `ROLE`:

```bash
if [[ "${ROLE}" == "masternode" ]]; then
   ...
fi
```

## Ошибки скриптов инициализации {#errors}

Если выполнение скрипта завершилось ошибкой и кластер перешел в состояние `DEAD`:

1. Посмотрите логи в [Yandex Cloud Logging](../../logging/operations/read-logs.md) или на хостах кластера в файле `/var/log/yandex/dataproc-init-actions.log`.
1. Исправьте ошибку.
1. [Удалите](../operations/cluster-delete.md) этот кластер и [создайте](../operations/cluster-create.md) новый.

Если ошибки скриптов инициализации произошли на уже созданном кластере (например, во время добавления подкластера), а пересоздание кластера нарушает рабочие процессы, результат выполнения скрипта можно исправить вручную:

1. Подключитесь к проблемному хосту и выполните действия, необходимые для компенсации ошибки. 
1. Запустите скрипт, который помечает успешным результат выполнения скриптов инициализации:

    ```bash
    sudo /opt/yandex/complete_init_action.py
    ```

1. Проверьте результат выполнения скриптов инициализации в файле `/home/dataproc-agent/dataproc-init-acts/states.json` на хосте-мастере.

### Ошибки синтаксиса {#syntax-errors}

Чтобы проверить скрипт на наличие ошибок синтаксиса, загрузите файл скрипта вручную и запустите его:

1. Подключитесь к хосту кластера.
1. Загрузите файл скрипта из хранилища по ссылке, использованной при создании кластера. Например:

   ```bash
   wget <HTTP-ссылка_на_файл_скрипта>
   ```

1. Запустите скрипт.

Если при выполнении скрипта возникли ошибки, сообщения о них отобразятся в консоли.

Одной из причин ошибок скриптов инициализации может быть несовместимость формата. Так как среда выполнения скрипта — Linux (Ubuntu), то скрипты, подготовленные в Windows, могут выполняться с одной из следующих ошибок:

* `^M: bad interpreter`;

* `FileNotFoundError: [Errno 2] No such file or directory: '<имя_исполняемого_файла>'`.

Эти ошибки возникают из-за использования в Windows символа переноса строки `CR/LF` (в Linux – `LF`). Для исправления выполните команду:

{% list tabs group=programming_language %}

- Bash {#bash}

  ```bash
  sed -i -e 's/\r$//' <имя_файла_скрипта>
  ```

- PowerShell {#powershell}

  ```powershell
  $file = "<имя_файла_скрипта>"; $text = [IO.File]::ReadAllText($file) -replace "`r`n", "`n"; [IO.File]::WriteAllText($file, $text)
  ```

{% endlist %}