Содержание
Диски в Azure
Как и любой компьютер – виртуальная машина в Azure использует диски для размещения операционной системы, приложений и данных.
Всем машины в Azure имеют как минимум два диска – для операционной системы (operating system disk), который создаётся из образа ОС, и диск для временных данных (temporary disk). Кроме того – к машине можно подключить один и более дисков для данных (data disks).
- Operating system disk: SATA-диск, монтируется по умолчанию как
/dev/sda
. Максимальный размер – 1023 .GB - Temporary disk:
/dev/sdb
, смонтированный в/mnt
. Подробнее про временные диски – тут>>>:
[simterm]
# cat /mnt/DATALOSS_WARNING_README.txt
WARNING: THIS IS A TEMPORARY DISK.
Any data stored on this drive is SUBJECT TO LOSS and THERE IS NO WAY TO
RECOVER IT.
[/simterm] - Data disk: самый интересный для нас – диск для хранения данных приложений. Является SCSI-диском для ОС, и может иметь размер до 1023 GB. Azure создаёт диск для операционной системы автоматически, при развёртывании образа ВМ. Если образ так же содержит в себе диск для данных – он будет создан, иначе – вы должны создать и подключить его сами, что мы и сделаем дальше.
Больше о дисках – тут>>>.
Задача – поднять виртуальную машину, создать data-диск в Storage Account и подключить этот диск к машине.
Далее – на этот диск будут скопированы данные из $JENKINS_HOME
на другом хосте, после чего – запустим Jenkins в Docker с разделом из подключенного диска.
Создание ВМ
Подробнее о создании виртуальной машины в Azure с помощью Azure CLI – тут>>>.
Проверяем машины в ресурс-группе:
[simterm]
$ azure vm list -g jm-testing info: Executing command vm list + Getting virtual machines data: ResourceGroupName Name ProvisioningState PowerState Location Size data: ----------------- ----------------- ----------------- ---------- ---------- --------------- data: jm-testing jm-webapp-ci-temp Succeeded VM running westeurope Standard_DS1_v2 data: jm-testing WinTools Succeeded VM running westeurope Standard_DS1_v2 info: vm list command OK
[/simterm]
Создаём новую.
Находим образы:
[simterm]
$ azure vm image list-offers westeurope Canonical info: Executing command vm image list-offers + Getting virtual machine image offers (Publisher: "Canonical" Location:"westeurope") data: Publisher Offer Location data: --------- ------------------------- ---------- data: Canonical Ubuntu15.04Snappy westeurope data: Canonical Ubuntu15.04SnappyDocker westeurope data: Canonical UbunturollingSnappy westeurope data: Canonical UbuntuServer westeurope data: Canonical Ubuntu_Core westeurope data: Canonical Ubuntu_Snappy_Core westeurope data: Canonical Ubuntu_Snappy_Core_Docker westeurope info: vm image list-offers command OK
[/simterm]
Находим версии для UbuntuServer:
[simterm]
$ azure vm image list-skus westeurope Canonical UbuntuServer info: Executing command vm image list-skus + Getting virtual machine image skus (Publisher:"Canonical" Offer:"UbuntuServer" Location:"westeurope") data: Publisher Offer sku Location data: --------- ------------ ----------------- ---------- data: Canonical UbuntuServer 12.04.2-LTS westeurope ... data: Canonical UbuntuServer 16.04-DAILY-LTS westeurope data: Canonical UbuntuServer 16.04-LTS westeurope data: Canonical UbuntuServer 16.04.0-LTS westeurope data: Canonical UbuntuServer 16.10 westeurope data: Canonical UbuntuServer 16.10-DAILY westeurope data: Canonical UbuntuServer 17.04-DAILY westeurope
[/simterm]
Получаем URN ресурса:
[simterm]
$ azure vm image list westeurope Canonical UbuntuServer 16.04-LTS info: Executing command vm image list + Getting virtual machine images (Publisher:"Canonical" Offer:"UbuntuServer" Sku: "16.04-LTS" Location:"westeurope") data: Publisher Offer Sku OS Version Location Urn data: --------- ------------ --------- ----- --------------- ---------- ------------------------------------------------ data: Canonical UbuntuServer 16.04-LTS Linux 16.04.201611220 westeurope Canonical:UbuntuServer:16.04-LTS:16.04.201611220 ... data: Canonical UbuntuServer 16.04-LTS Linux 16.04.201702020 westeurope Canonical:UbuntuServer:16.04-LTS:16.04.201702020
[/simterm]
Создаём машину:
[simterm]
$ azure vm quick-create -g jm-testing -n jmcivm1 -l westeurope -y Linux -Q Canonical:UbuntuServer:16.04-LTS:16.04.201611220 -u username -p password info: Executing command vm quick-create + Listing virtual machine sizes available in the location "westeurope" + Looking up the VM "jmcivm1" ... + Creating public ip "jmciv-weste-sfflg33fs60n-pip" + Looking up the public ip "jmciv-weste-sfflg33fs60n-pip" + Creating NIC "jmciv-weste-sfflg33fs60n-nic" + Looking up the NIC "jmciv-weste-sfflg33fs60n-nic" + Looking up the storage account clisto4154840500jmcivm1 + Creating VM "jmcivm1" ... info: vm quick-create command OK
[/simterm]
error: Parameter adminPassword must be at least 8 character in length, it must contain a lower case, an upper case, a number and a special character such as !@#$%^&+=
Бесит такая забота.
Проверяем:
[simterm]
$ azure vm show -g jm-testing -n jmcivm1 info: Executing command vm show + Looking up the VM "jmcivm1" ... data: Storage Profile: data: Image reference: data: Publisher :Canonical data: Offer :UbuntuServer data: Sku :16.04-LTS data: Version :16.04.201611220 data: data: OS Disk: data: OSType :Linux ...
[/simterm]
Логинимся:
[simterm]
$ ssh [email protected] ... username@jmcivm1:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.1 LTS Release: 16.04 Codename: xenial
[/simterm]
Имеющиеся диски и разделы:
[simterm]
$ lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT fd0 sda └─sda1 ext4 cloudimg-rootfs 77227c68-c4c2-4ebe-b766-aa693e9a450f / sdb └─sdb1 ext4 9cce3007-3826-4166-91c3-e601dafeed5d /mnt sr0 udf rd_rdfe_stable.161107-1031 0B050C5872645f72
[/simterm]
Создание Storage Account
Проверяем текущий Storage Account для созданной машины:
[simterm]
$ azure vm show -g jm-testing -n jmcivm1 | grep Storage data: Storage Profile: data: BootDiagnostics StorageUri :https://clisto4154840500jmcivm1.blob.core.windows.net/
[/simterm]
Диски виртуальных машин хранятся в Blob-сторейджах в VHD-формате:
[simterm]
$ azure vm show -g jm-testing -n jmcivm1 | grep -A 5 "Data Disk" data: Data Disks: data: Data Disk 1: data: Size :128 GB data: Name :vhd-test1 data: Vhd Uri :https://stoxorceoyixe6o.blob.core.windows.net/vhds/vhd-test1.vhd data: Caching :ReadWrite data: CreateOption :Empty
[/simterm]
Проверяем содержимое контейнера в хранилище:
[simterm]
$ azure storage container list -a stoxorceoyixe6o -k DuGF***qJkA== info: Executing command storage container list + Getting storage containers data: Name Public Access Last Modified data: ---- ------------- ----------------------------- data: vhds Off Wed, 08 Feb 2017 11:04:59 GMT
[/simterm]
Создаём новый диск размером 10gb и подключаем его к созданной ВМ:
[simterm]
$ azure vm disk attach-new -g jm-testing -n jmcivm1 10 ci-disk-1 info: Executing command vm disk attach-new + Looking up the VM "jmcivm1" info: New data disk location: https://stoxorceoyixe6o.blob.core.windows.net/vhds/ci-disk-1.vhd + Updating VM "jmcivm1" info: vm disk attach-new command OK
[/simterm]
Проверяем харнилище:
[simterm]
$ azure storage blob list --container vhds -a stoxorceoyixe6o -k DuGF***qJkA== info: Executing command storage blob list + Getting blobs in container vhds data: Name Blob Type Length Content Type Last Modified Snapshot Time data: ---------------------------------------- --------- ----------- ------------------------ ----------------------------- ------------- data: ci-disk-1.vhd PageBlob 10737418752 application/octet-stream Wed, 08 Feb 2017 12:25:06 GMT data: clidbfd4f78689ffadd-os-1486551711243.vhd PageBlob 31457280512 application/octet-stream Wed, 08 Feb 2017 12:26:02 GMT info: storage blob list command OK
[/simterm]
clidbfd4f78689ffadd-os-1486551711243.vhd – “системный” диск (образ с Ubuntu), ci-disk-1.vhd – только что добавленный нами.
Подключаемся к машине, проверяем диски:
[simterm]
$ lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT fd0 sda └─sda1 ext4 cloudimg-rootfs 77227c68-c4c2-4ebe-b766-aa693e9a450f / sdb └─sdb1 ext4 9cce3007-3826-4166-91c3-e601dafeed5d /mnt sdc
[/simterm]
sdc
– появился.
Далее – как обычно: создать файловую систему, смонтировать – и готово.
Создаём раздел на диске:
[simterm]
$ sudo -s # fdisk /dev/sdc ... Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (1-4, default 1): First sector (2048-20971519, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519): Created a new partition 1 of type 'Linux' and of size 10 GiB. Command (m for help): p ... Device Boot Start End Sectors Size Id Type /dev/sdc1 2048 20971519 20969472 10G 83 Linux Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
[/simterm]
Проверяем:
[simterm]
# lsblk -f /dev/sdc NAME FSTYPE LABEL UUID MOUNTPOINT sdc └─sdc1
[/simterm]
Создаём файловую систему:
[simterm]
# mkfs.ext4 /dev/sdc1 mke2fs 1.42.13 (17-May-2015) Discarding device blocks: done Creating filesystem with 2621184 4k blocks and 655360 inodes Filesystem UUID: 9cc937e7-693d-4259-92ba-61cd44b25abc Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
[/simterm]
Монтируем диск:
[simterm]
# mkdir /jenkins # mount /dev/sdc1 /jenkins/ # ls -l /jenkins/ total 16 drwx------ 2 root root 16384 Feb 8 12:31 lost+found
[/simterm]
Готовим fstab
, что бы диск смотировался при перезапуске машины.
Находим UUID диска:
[simterm]
# blkid /dev/sdc1 /dev/sdc1: UUID="9cc937e7-693d-4259-92ba-61cd44b25abc" TYPE="ext4" PARTUUID="8ec89fdc-01"
[/simterm]
Правим /etc/fstab
, добавляем строку:
UUID=9cc937e7-693d-4259-92ba-61cd44b25abc /jenkins ext4 defaults 0 1
Полностью файл теперь выглядит так:
[simterm]
# cat /etc/fstab # CLOUD_IMG: This file was created/modified by the Cloud Image build process UUID=77227c68-c4c2-4ebe-b766-aa693e9a450f / ext4 defaults,discard 0 0 /dev/disk/cloud/azure_resource-part1 /mnt auto defaults,nofail,comment=cloudconfig 0 2 UUID=9cc937e7-693d-4259-92ba-61cd44b25abc /jenkins ext4 defaults 0 1
[/simterm]
Готово.
Перезапускаем машину:
[simterm]
# reboot
[/simterm]
И после перезагрузки – проверяем:
[simterm]
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT fd0 2:0 1 4K 0 disk sda 8:0 0 29.3G 0 disk └─sda1 8:1 0 29.3G 0 part / sdb 8:16 0 7G 0 disk └─sdb1 8:17 0 7G 0 part /mnt sdc 8:32 0 10G 0 disk └─sdc1 8:33 0 10G 0 part /jenkins sr0 11:0 1 1.1M 0 rom $ ls -l /jenkins/ total 16 drwx------ 2 root root 16384 Feb 8 12:31 lost+found
[/simterm]
Аналогично можно подключить любой диск из любого Storage Account с помощью azure vm disk attach
:
[simterm]
$ azure vm disk -h help: Commands to manage your Virtual Machine data disks help: help: Attach a new data-disk to a VM in a resource group help: vm disk attach-new [options] <resource-group> <vm-name> <size-in-gb> [vhd-name] help: help: Detach a data-disk attached to a VM in a resource group help: vm disk detach [options] <resource-group> <vm-name> <lun> help: help: Attach a new data-disk to a VM in a resource group help: vm disk attach [options] <resource-group> <vm-name> [vhd-url] help: help: Get all data disks of a VM in a resource group help: vm disk list [options] <resource-group> <vm-name> ...
[/simterm]
Миграция Jenkins
Устанавливаем Docker:
[simterm]
# apt-get update && apt-get install curl linux-image-extra-$(uname -r) linux-image-extra-virtual # apt-get install apt-transport-https software-properties-common ca-certificates # curl -fsSL https://yum.dockerproject.org/gpg | sudo apt-key add - # add-apt-repository "deb https://apt.dockerproject.org/repo/ ubuntu-$(lsb_release -cs) main" # apt-get update && apt-get install docker-engine
[/simterm]
Копируем данные Jenkins-а со старого хоста:
[simterm]
# scp -r [email protected]:/jenkins/* /jenkins/ [email protected]'s password: jenkins.model.ArtifactManagerConfiguration.xml ...
[/simterm]
Пока копируются данные из $JENKINS_HOME
– создаём пользователя и добавляем его в группу docker
:
[simterm]
# useradd jenkins # usermod -a -G docker jenkins
[/simterm]
Меняем пользователя каталога /jenkins
:
[simterm]
# chown -R jenkins:jenkins /jenkins/
[/simterm]
Находим его ID:
[simterm]
# id jenkins uid=1001(jenkins) gid=1001(jenkins) groups=1001(jenkins),999(docker)
[/simterm]
Запускаем контейнер с Jenkins от имени пользователя jenkins
:
[simterm]
# docker run -u 1001 -dti -p 80:8080 \ > -v /usr/bin/docker:/usr/bin/docker \ > -v /etc/passwd:/etc/passwd \ > -v /jenkins/:/var/jenkins_home/ \ > -v /var/run/docker.sock:/var/run/docker.sock \ > -e JENKINS_HOME=/var/jenkins_home/ jenkins Unable to find image 'jenkins:latest' locally latest: Pulling from library/jenkins ...
[/simterm]
Готово. Вводим пароль – и получаем копию Jenkins с другого хоста:
[simterm]
# cat /jenkins/secrets/initialAdminPassword 62902e8f531346c08e5f0da9d4775f5c
[/simterm]