Создать виртуальную машину с пользовательским скриптом конфигурации
Вы можете создать виртуальную машину с предустановленной конфигурацией программного обеспечения с помощью ключа 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 \
--metadata-from-file user-data="<путь_к_файлу_конфигурации>"
Где:
-
subnet-name
— имя подсети, расположенной в зоне доступности, указанной в параметре--zone
. -
security-group-ids
— идентификатор группы безопасности. -
--metadata-from-file
— ключuser-data
и его значение — путь к файлу с конфигурациейcloud-config
в формате YAML. Например:--metadata-from-file user-data="/home/user/metadata.yaml"
.Примеры конфигурации для
user-data
см. в подразделе Примеры.
Если у вас еще нет 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 -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
VM_ID=$(curl -s 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 необходимо создать самостоятельно.
Чтобы установить 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 -sSL https://hashicorp-releases.yandexcloud.net/terraform/1.8.5/terraform_1.8.5_linux_amd64.zip -o /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 -sSL https://dl.k8s.io/release/v1.3.0/bin/linux/amd64/kubectl -o /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 -sSL https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz -o /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