Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Compute Cloud
    • Все инструкции
      • Настроить параметры сервиса метаданных
      • Получить метаданные ВМ
      • Получить идентификационный документ ВМ
      • Изменить метаданные ВМ
      • Создать ВМ с пользовательским скриптом конфигурации
      • Создать ВМ с метаданными из переменных окружения
      • Создать ВМ с доступом к секрету Yandex Lockbox
    • Посмотреть операции с ресурсами сервиса
  • Yandex Container Solution
  • Управление доступом
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Обучающие курсы

В этой статье:

  • Создание виртуальной машины с пользовательским скриптом конфигурации
  • Примеры
  1. Пошаговые инструкции
  2. Создание виртуальной машины
  3. Создать ВМ с пользовательским скриптом конфигурации

Создать виртуальную машину с пользовательским скриптом конфигурации

Статья создана
Yandex Cloud
Улучшена
Обновлена 29 апреля 2025 г.
  • Создание виртуальной машины с пользовательским скриптом конфигурации
  • Примеры

Вы можете создать виртуальную машину с предустановленной конфигурацией программного обеспечения с помощью ключа user-data в метаданных ВМ.

Заданная в ключе user-data конфигурация обрабатываются агентом cloud-init, запущенным на ВМ. Cloud-init поддерживает разные форматы передачи метаданных, например cloud-config.

Примечание

Чтобы создавать, изменять и редактировать ВМ, необходима минимальная роль compute.editor на каталоге. Для создания ВМ с лицензируемым образом дополнительно потребуется роль license-manager.viewer.

Создание виртуальной машины с пользовательским скриптом конфигурацииСоздание виртуальной машины с пользовательским скриптом конфигурации

Важно

В конфигурации user-data обязательно задавайте логин и SSH-ключ пользователя, даже если вы ранее указали эти данные в блоке Доступ в консоли управления.

Чтобы создать ВМ с пользовательским скриптом конфигурации:

Консоль управления
CLI
Terraform
API
  1. В консоли управления выберите каталог, в котором будет создана ВМ.

  2. В списке сервисов выберите Compute Cloud.

  3. На панели слева выберите Виртуальные машины.

  4. Нажмите кнопку Создать виртуальную машину.

  5. Задайте нужные параметры ВМ.

  6. Раскройте блок Метаданные и в появившихся полях укажите:

    • Ключ — user-data.
    • Значение — конфигурация cloud-config в формате YAML. Примеры конфигурации для user-data см. в подразделе Примеры.
  7. Нажмите кнопку Создать ВМ.

Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

Выполните команду:

yc compute instance create \
  --name my-sample-instance \
  --zone ru-central1-a \
  --network-interface subnet-name=<имя_подсети>,nat-ip-version=ipv4,security-group-ids=<идентификатор_группы_безопасности> \
  --create-boot-disk image-folder-id=standard-images,image-family=ubuntu-2204-lts,kms-key-id=<идентификатор_ключа> \
  --metadata-from-file user-data="<путь_к_файлу_конфигурации>"

Где:

  • --name — имя ВМ. Требования к имени:

    • длина — от 2 до 63 символов;
    • может содержать строчные буквы латинского алфавита, цифры и дефисы;
    • первый символ — буква, последний — не дефис.

    Примечание

    Имя виртуальной машины используется для генерации внутреннего FQDN единожды — при создании ВМ. Если для вас важен внутренний FQDN, учитывайте это и задавайте нужное имя ВМ при создании.

  • --zone — зона доступности, которая соответствует выбранной подсети.

  • --network-interface — настройки сетевого интерфейса ВМ:

    • subnet-name — имя подсети, расположенной в зоне доступности, указанной в параметре --zone.
    • security-group-ids — идентификатор группы безопасности.
  • --create-boot-disk — настройки загрузочного диска ВМ:

    • image-family — семейство образов, например, ubuntu-2204-lts. Эта опция позволит установить последнюю версию ОС из указанного семейства.

    • kms-key-id — идентификатор симметричного ключа KMS для создания зашифрованного загрузочного диска. Необязательный параметр.

      Для создания зашифрованного диска нужна роль kms.keys.user или выше.

      Важно

      Задать настройки шифрования можно только при создании диска. Шифрование диска нельзя будет отключить или изменить. Также нельзя будет включить шифрование для уже созданного диска.

      Если деактивировать ключ, которым были зашифрованы диск, снимок или образ, доступ к данным будет приостановлен, пока ключ не будет снова активирован.

      Внимание

      Если удалить ключ или его версию, которыми были зашифрованы диск, снимок или образ, доступ к данным будет безвозвратно потерян. Подробнее см. Удаление версии ключа.

  • --metadata-from-file — ключ user-data и его значение — путь к файлу с конфигурацией cloud-config в формате YAML. Например: --metadata-from-file user-data="/home/user/metadata.yaml".

    Примеры конфигурации для user-data см. в подразделе Примеры.

Примечание

Команды yc compute instance create | create-with-container | update | add-metadata поддерживают подстановку в метаданные ВМ значений переменных окружения. Эти значения, заданные в ключе user-data в формате $<имя_переменной>, в момент выполнения команды Yandex Cloud CLI будут подставлены в метаданные ВМ из переменных окружения среды, в которой выполняется команда.

Чтобы изменить такое поведение, не подставлять значение переменной из среды выполнения команды CLI и передать в метаданные ВМ имя переменной в формате $<имя_переменной>, используйте синтаксис с двумя символами доллара. Например: $$<имя_переменной>.

Подробнее см. в разделе Особенности передачи переменных окружения в метаданных через CLI.

Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.

Добавьте скрипт конфигурации ВМ в секцию metadata ресурса yandex_compute_instance конфигурационного файла Terraform:

resource "yandex_compute_instance" "vm-1" {
  name        = "my-sample-instance"
  ...
  metadata    = {
    user-data = "${file("<путь_к_файлу_конфигурации>")}"
  }
  ...
}

Где:

  • user-data — путь к файлу с конфигурацией cloud-config в формате YAML. Например: user-data = "${file("/home/user/metadata.yaml")}".

    Примеры конфигурации для user-data см. в подразделе Примеры.

Создайте ВМ с помощью метода REST API create для ресурса Instance, передав в поле metadata в теле запроса объект, содержащий YAML-конфигурацию cloud-config. Если в конфигурации несколько строк, используйте \n в качестве разделителя. Например:

{
  "folderId": "b1gvmob95yys********",
  "name": "my-sample-instance",
  "zoneId": "ru-central1-a",
  "platformId": "standard-v3",
  ...
  "metadata": {
    "user-data": "#cloud-config\ndatasource:\n  Ec2:\n    strict_id: false\nssh_pwauth: yes\nusers:\n- name: <имя_пользователя>\n  sudo: 'ALL=(ALL) NOPASSWD:ALL'\n  shell: /bin/bash\n  ssh_authorized_keys:\n  - <публичный_SSH-ключ>\nwrite_files:\n  - path: '/usr/local/etc/startup.sh'\n    permissions: '755'\n    content: |\n      #!/bin/bash\n      apt-get update\n      apt-get install -y nginx\n      service nginx start\n      sed -i -- 's/ nginx/ Yandex Cloud - ${HOSTNAME}/' /var/www/html/index.nginx-debian.html\n    defer: true\nruncmd:\n  - ['/usr/local/etc/startup.sh']"
  },
  ...
}

Примеры конфигурации для user-data см. в подразделе Примеры.

Подробнее о создании ВМ см. в разделе Создать виртуальную машину из публичного образа Linux.

Чтобы убедиться в успешном выполнении скриптов конфигурации, получите вывод последовательного порта ВМ.

ПримерыПримеры

Nginx
Docker
Yandex Cloud CLI
Yandex Unified Agent
Terraform
kubectl
Helm

Чтобы установить и запустить веб-сервер Nginx на создаваемой ВМ, укажите для ключа user-data следующее значение:

#cloud-config
datasource:
  Ec2:
    strict_id: false
ssh_pwauth: no
users:
- name: <имя_пользователя>
  sudo: 'ALL=(ALL) NOPASSWD:ALL'
  shell: /bin/bash
  ssh_authorized_keys:
  - <публичный_SSH-ключ>
write_files:
  - path: "/usr/local/etc/startup.sh"
    permissions: "755"
    content: |
      #!/bin/bash

      apt-get update
      apt-get install -y nginx
      service nginx start
      sed -i -- "s/ nginx/ Yandex Cloud - ${HOSTNAME}/" /var/www/html/index.nginx-debian.html
    defer: true
runcmd:
  - ["/usr/local/etc/startup.sh"]

Где:

  • <имя_пользователя> — логин пользователя, который будет использоваться для подключения к ВМ по SSH.
  • <публичный_SSH-ключ> — содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.

Чтобы установить Docker на создаваемой ВМ, а также загрузить и запустить контейнер, укажите для ключа user-data следующее значение:

#cloud-config
datasource:
  Ec2:
    strict_id: false
ssh_pwauth: no
users:
- name: <имя_пользователя>
  sudo: "ALL=(ALL) NOPASSWD:ALL"
  shell: /bin/bash
  ssh_authorized_keys:
  - <публичный_SSH-ключ>
write_files:
  - path: "/usr/local/etc/docker-start.sh"
    permissions: "755"
    content: |
      #!/bin/bash

      # Docker
      echo "Installing Docker"
      sudo apt update -y && sudo apt install docker.io -y
      echo "Grant user access to Docker"
      sudo usermod -aG docker ${USER}
      newgrp docker

    defer: true
  - path: "/usr/local/etc/docker-main.sh"
    permissions: "755"
    content: |
      #!/bin/bash

      # Docker run container
      docker pull hello-world:latest
      docker run hello-world

    defer: true
runcmd:
  - [su, <имя_пользователя>, -c, "/usr/local/etc/docker-start.sh"]
  - [su, <имя_пользователя>, -c, "/usr/local/etc/docker-main.sh"]

Где:

  • <имя_пользователя> — логин пользователя, который будет использоваться для подключения к ВМ по SSH.
  • <публичный_SSH-ключ> — содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.

Чтобы установить Yandex Cloud CLI на создаваемой ВМ, укажите для ключа user-data следующее значение:

#cloud-config
datasource:
  Ec2:
    strict_id: false
ssh_pwauth: no
users:
- name: <имя_пользователя>
  sudo: 'ALL=(ALL) NOPASSWD:ALL'
  shell: /bin/bash
  ssh_authorized_keys:
  - <публичный_SSH-ключ>
write_files:
  - path: "/usr/local/etc/yc-install.sh"
    permissions: "755"
    content: |
      #!/bin/bash

      # CLI
      echo "Installing Yandex Cloud CLI"
      curl \
        --silent \
        --show-error \
        --location \
        https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
      VM_ID=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id)

      # Save YC params
      echo "Saving YC params to the ~/.bashrc"
      cat << EOF >> $HOME/.bashrc
    defer: true
runcmd:
  - [su, <имя_пользователя>, -c, "/usr/local/etc/yc-install.sh"]

Где:

  • <имя_пользователя> — логин пользователя, который будет использоваться для подключения к ВМ по SSH.
  • <публичный_SSH-ключ> — содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.

Примечание

При создании виртуальной машины с Yandex Unified Agent привяжите к ней сервисный аккаунт, которому назначена роль monitoring.editor на текущий каталог.

Чтобы установить Unified Agent на создаваемой ВМ, укажите для ключа user-data следующее значение:

#cloud-config
datasource:
  Ec2:
    strict_id: false
ssh_pwauth: no
users:
- name: <имя_пользователя>
  sudo: 'ALL=(ALL) NOPASSWD:ALL'
  shell: /bin/bash
  ssh_authorized_keys:
  - <публичный_SSH-ключ>
runcmd:
  - wget -O - https://monitoring.api.cloud.yandex.net/monitoring/v2/unifiedAgent/config/install.sh | bash

Где:

  • <имя_пользователя> — логин пользователя, который будет использоваться для подключения к ВМ по SSH.
  • <публичный_SSH-ключ> — содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.

Чтобы привязать сервисный аккаунт к ВМ при создании ВМ с помощью Terraform, укажите в конфигурации строку:

resource "yandex_compute_instance" "my-vm" {
  ...
  service_account_id = "ajehka*************"
}

Чтобы Unified Agent записывал метрики в Yandex Managed Service for Prometheus®, укажите в конфигурации идентификатор воркспейса:

resource "yandex_compute_instance" "my-vm" {
  ...
  metadata    = {
    monitoring_workspaceid = "mon618clr**************"
  }
}

Чтобы установить Terraform на создаваемой ВМ, укажите для ключа user-data следующее значение:

#cloud-config
datasource:
  Ec2:
    strict_id: false
ssh_pwauth: no
users:
- name: <имя_пользователя>
  sudo: 'ALL=(ALL) NOPASSWD:ALL'
  shell: /bin/bash
  ssh_authorized_keys:
  - <публичный_SSH-ключ>
write_files:
  - path: "/usr/local/etc/tf-install.sh"
    permissions: "755"
    content: |
      #!/bin/bash

      # Install Global Ubuntu things
      sudo apt-get update
      echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
      sudo apt-get install -y unzip python3-pip

      # Install Terraform
      echo "Installing Terraform"
      sudo curl \
        --silent \
        --show-error \
        --location \
        https://hashicorp-releases.yandexcloud.net/terraform/1.8.5/terraform_1.8.5_linux_amd64.zip \
        --output /usr/local/etc/terraform.zip
      sudo unzip /usr/local/etc/terraform.zip -d /usr/local/etc/
      sudo install -o root -g root -m 0755 /usr/local/etc/terraform /usr/local/bin/terraform
      sudo rm -rf /usr/local/etc/terraform /usr/local/etc/terraform.zip /usr/local/etc/LICENSE.txt
    defer: true
runcmd:
  - [su, <имя_пользователя>, -c, "/usr/local/etc/tf-install.sh"]

Где:

  • <имя_пользователя> — логин пользователя, который будет использоваться для подключения к ВМ по SSH.
  • <публичный_SSH-ключ> — содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.

Чтобы установить утилиту kubectl на создаваемой ВМ, укажите для ключа user-data следующее значение:

#cloud-config
datasource:
  Ec2:
    strict_id: false
ssh_pwauth: no
users:
- name: <имя_пользователя>
  sudo: 'ALL=(ALL) NOPASSWD:ALL'
  shell: /bin/bash
  ssh_authorized_keys:
  - <публичный_SSH-ключ>
write_files:
  - path: "/usr/local/etc/kubectl-install.sh"
    permissions: "755"
    content: |
      #!/bin/bash

      # Install kubectl
      echo "Installing kubectl"
      sudo curl \
        --silent \
        --show-error \
        --location \
        https://dl.k8s.io/release/v1.3.0/bin/linux/amd64/kubectl \
        --output /usr/local/etc/kubectl
      sudo install -o root -g root -m 0755 /usr/local/etc/kubectl /usr/local/bin/kubectl
      sudo rm -rf /usr/local/etc/kubectl
    defer: true
runcmd:
  - [su, <имя_пользователя>, -c, "/usr/local/etc/kubectl-install.sh"]

Где:

  • <имя_пользователя> — логин пользователя, который будет использоваться для подключения к ВМ по SSH.
  • <публичный_SSH-ключ> — содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.

Чтобы установить Helm на создаваемой ВМ, укажите для ключа user-data следующее значение:

#cloud-config
datasource:
  Ec2:
    strict_id: false
ssh_pwauth: no
users:
- name: <имя_пользователя>
  sudo: 'ALL=(ALL) NOPASSWD:ALL'
  shell: /bin/bash
  ssh_authorized_keys:
  - <публичный_SSH-ключ>
write_files:
  - path: "/usr/local/etc/helm-install.sh"
    permissions: "755"
    content: |
      #!/bin/bash

      # Install Helm
      echo "Installing Helm"
      sudo curl \
        --silent \
        --show-error \
        --location \
        https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz \
        --output /usr/local/etc/helm-v3.15.2-linux-amd64.tar.gz
      sudo tar xf /usr/local/etc/helm-v3.15.2-linux-amd64.tar.gz -C /usr/local/etc/
      sudo install -o root -g root -m 0755 /usr/local/etc/linux-amd64/helm /usr/local/bin/helm
      sudo rm -rf /usr/local/etc/helm-v3.15.2-linux-amd64.tar.gz /usr/local/etc/linux-amd64
    defer: true
runcmd:
  - [su, <имя_пользователя>, -c, "/usr/local/etc/helm-install.sh"]

Где:

  • <имя_пользователя> — логин пользователя, который будет использоваться для подключения к ВМ по SSH.
  • <публичный_SSH-ключ> — содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.

См. такжеСм. также

Другие примеры конфигураций для ключа user-data:

  • Создание группы виртуальных машин с подключением к файловому хранилищу
  • Создание группы виртуальных машин с подключением к Yandex Object Storage
  • Восстановление работоспособности сетевых интерфейсов ВМ
  • Автоматическая привязка политики резервного копирования Yandex Cloud Backup к ВМ
  • Установка агента для сбора метрик и логов Unified Agent
  • Установка агента для сбора метрик в формате Prometheus

Была ли статья полезна?

Предыдущая
Создать ВМ из пользовательского образа
Следующая
Создать ВМ с метаданными из переменных окружения
Проект Яндекса
© 2025 ООО «Яндекс.Облако»