Создать виртуальную машину с пользовательским скриптом конфигурации
Вы можете создать виртуальную машину с предустановленной конфигурацией программного обеспечения с помощью ключа user-data
в метаданных ВМ.
Заданная в ключе user-data
конфигурация обрабатываются агентом cloud-init
Создание виртуальной машины с пользовательским скриптом конфигурации
Важно
В конфигурации user-data
обязательно задавайте логин и SSH-ключ пользователя, даже если вы ранее указали эти данные в блоке Доступ в консоли управления.
Чтобы создать ВМ с пользовательским скриптом конфигурации:
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
Задайте нужные параметры ВМ.
-
Раскройте блок Метаданные и в появившихся полях укажите:
- Ключ —
user-data
. - Значение — конфигурация
cloud-config
в формате YAML. Примеры конфигурации дляuser-data
см. в подразделе Примеры.
- Ключ —
-
Нажмите кнопку Создать ВМ.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --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.
Чтобы убедиться в успешном выполнении скриптов конфигурации, получите вывод последовательного порта ВМ.
Примеры
Чтобы установить и запустить веб-сервер Nginxuser-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 необходимо создать самостоятельно.
Чтобы установить Dockeruser-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
# YC 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**************"
}
}
Чтобы установить Terraformuser-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 необходимо создать самостоятельно.
Чтобы установить утилиту kubectluser-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 необходимо создать самостоятельно.
Чтобы установить Helmuser-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