Yandex Cloud
August 25, 2022

Создать ВМ со своей SG, статическим адресом, кастомным пользователем и набором установленных программ

Эта команда отлично подойдёт для создания шаблонных ВМ. На основе которых легко будут разворачиваться другие сервисы.

Подготовим всё необходимое. Установка утилит ус, jq, а также создание SA было подробно рассмотрено тут: https://teletype.in/@cameda/pRNwnipPcIS

export FOLDER_ID=$(yc config get folder-id)
export SA=$(yc iam service-account get cam-instance-sa --format json | jq -r '.id')
export ZONE=ru-central1-a
export NETWORK_ID=$(yc vpc network get cameda-test --format json | jq -r '.id')

Создадим статический адрес в зоне ru-central1-a:

yc vpc address create --external-ipv4 zone=$ZONE
created_at: "2022-08-25T12:01:52Z"
external_ipv4_address:
  address: 62.84.124.218
  zone_id: ru-central1-a
  requirements: {}
reserved: true
type: EXTERNAL
ip_version: IPV4

В зоне ru-central1-a также будем создавать и нашу ВМ.

Создадим правила для прохождения трафика в SG. Создадим новую SG, откроем весь исходящий трафик, а на входящий откроем порты 22, 53, 80, 443.

yc vpc sg create --name cam-test \
"--rule" "description=access all egress port,direction=egress,from-port=1,to-port=65535,protocol=any,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 22 port,direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 443 port,direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 80 port,direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 53 port,direction=ingress,port=53,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--network-id $NETWORK_ID --description "Test access" --folder-id $FOLDER_ID --async
export SG=$(yc vpc sg get cam-test --format=json | jq -r '.id')

Создадим файл скрипта test.yaml с содержимым:

#cloud-config
  version: v1
  package_update: true
  package_upgrade: true
  write_files:
   - encoding: b64
     content: VGVzc3R0dC4uLg==
     owner: root:root
     path: /opt/test
     permissions: '0644'
  packages:
  - git
  - htop
  - mc
  - tree
  - make
  - iftop
  - iotop
  - dstat
  - nginx
  datasource:
   Ec2:
    strict_id: false
  users:
  - default
  - name: cameda
    gecos: Alexey Volkov
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    lock_passwd: false
    passwd: $6$rounds=4096$WhW2cxlj/QX90$Jic1yPwlpiWV98oX8akplpOX4e7pgJlWHCfKAyPiMf7xP1AqI7iocN/gjWQNX9WuIUf14LVgxJluajfOInk.u.
    ssh_authorized_keys:
      - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDI98mJDBN9cnp6HOdBYTQILeAhUSDvDfoqA9iLmVPDyPLFRWs7tE4BjCAcFD6a3M50QIboCaohfa7h+PWksYibab7I3QHOR7y9pCW8FGonGRw2ACvt906qlaWHFj7jWOxuihFoiRROKqLCW5YE/Yc4XFIvW1gu3JQdvQ1wemWvujsI8EHE6PI1pEg7/41y6kn3IhNHIr8WRLe4dPyPGjwc4LpBCcaRSJiX4YjVXynSIHNk365UrL+nGv8ix7bW5FNCgGqSgfUTVCfMYLzQ/gYHPVQrcIvCeHjkwluH8Z3gXeN3OliejBjpLi+IWIzd9K6UADSUNU8oL+9941tDidp8APoe7RbB4h3bY6k8Bhy0yxohgQS2OWSYd1mjeEx8Ba5wzJKqfpUgmcPdrBJnBwLgLMFQyEfYG6vTPkYWAKEvkkJ6ZiA4tdoQvCb+B0xJV/ivHyLtoi3LFE59mbQFDUy8O51vX9JjBDLwzyTEeslWp7uOP66Ti5Q5ucNXbs5yXTU= cameda@cameda-osx"
  runcmd:
    - mkdir /run/mydir
    - [ curl, -sSL, "https://storage.yandexcloud.net/yandexcloud-yc/install.sh" ]

В файле передаётся:
1. Делаем apt update && apt upgrade (package_update: true, package_upgrade: true)
2. Создаём файл /opt/test и записываем туда закодированное в base64 значение;
3. Устанавливаем утилиты: git, htop, mc, tree, make, iftop, iotop, dstat, nginx;
4. Имя пользователя - cameda;
5. Группа пользователя - sudo;
6. Пароль не передаётся в прямом виде. Он передаётся в виде хэша. Сгенерировать хэш можно так:

apt -y install whois
mkpasswd --method=SHA-512 --rounds=4096

Выше представлен хэш для пароля Pa$w0rd.

7. Публичная часть ssh ключа. Из файла ~/.ssh/id_rsa.pub
8. Запускаем скрипт на установку ус. Директива bootcmd.

Создадим ВМ:

yc compute instance create \
--folder-id $FOLDER_ID \
--name srv-1 \
--description "Test machine" \
--hostname srv-1 \
--zone $ZONE_ID \
--platform standard-v2 \
--create-boot-disk image-family=ubuntu-2004-lts,size=60,type=network-ssd,block-size=8K \
--image-folder-id standard-images \
--memory 8 \
--cores 4 \
--core-fraction 100 \
--preemptible \
--network-settings type=standard \
--network-interface subnet-name=subnet-a,nat-ip-version=ipv4,nat-address=62.84.124.218,security-group-ids=$SG \
--metadata serial-port-enable=1 \
--metadata-from-file='user-data=test.yaml' \
--service-account-id $SA \
--async

Проверяем, что всё ОК:

nginx -v
htop
mc
vi /opt/test
cd /run/mydir
Подключаемся к серийной консоли по логину и паролю.

Полезные ссылки:

Примеры использования cloud-init: https://cloudinit.readthedocs.io/en/latest/topics/examples.html