Skip to content
andyceo edited this page Oct 27, 2017 · 7 revisions

Начало работы с Azure через Ansible

Создайте аккаунт. У вас должна быть подписка.

Затем, можно установить пакет для Python для работы с облаком Azure: pip install azure==2.0.0rc5. Для успешной работы Ansible нужна именно эта версия.

Затем установим набор модулей azure для Ansible: pip install ansible[azure]

Затем, нужно создать AD-приложение (Azure Active Directory Application) и предоставить ему полный доступ на подписку. Ansible будет работать с облаком через это приложение. Подробная инструкция находится тут: Use portal to create an Azure Active Directory application and service principal that can access resources. Сделать это можно из веб-портала Azure. Это приложение так же иногда называется Service principal.

Затем, нужно создать в домашней папке пользователя, из-под которого ведется работа, папку: mkdir ~/.azure/. В эту папку нужно положить файл touch ~/.azure/credentials, который будет содержать параметры доступа к ранее созданному AD-приложению:

#[default]
#subscription_id=12345678-1234-1234-1234-123456789012
#client_id=12345678-1234-1234-1234-123456789012
#secret=secret12345678secret
#tenant=12345678-1234-1234-1234-123456789012

После этого, в ваш Asnible надо залить файлик для динамического Inventory. Например такой.

После этого в Ansible создаем тестовый плейбук: touch azure_test.yml:

- name: Test Azure Soundchain inventory
  hosts: azure
  connection: local
  gather_facts: no
  tasks:
    - debug: msg="{{ inventory_hostname }} has powerstate {{ powerstate }}"
  tags:
    - azure_test

И можно запустить: ansible-playbook -i inventory/azure_rm.py azure_soundchain.yml

Дополнительную информацию по работе с Azure в Ansible можно посмотреть на странице документации Ansible Getting Started with Azure и странице документации Azure Установка и настройка Ansible для управления виртуальными машинами в Azure (также будет полезно пролистать дальнейшие инструкции в этом разделе документации).

Azure CLI

Установка описана здесь: Install Azure CLI 2.0

Поставим через Docker: sudo docker run --rm -ti -v azure:/root azuresdk/azure-cli-python:2.0.18 az --version. Версия 2.0.18 - последняя стабильная на момент написания этого документа (2017-09-24).

Обратите внимание, что Azure CLI пишет файлы в именованный том Docker azure. Нужно периодически создавать резервные копии этого тома.

Для упрощения работы, можно добавить алиас для вышеуказанной команды, в файл ~/.bash_aliases:

alias az='sudo docker run --rm -ti -v azure:/root azuresdk/azure-cli-python:2.0.18 az'

После этого, можно будет использовать Azure CLI так: az --version. Далее будем использовать именно короткую запись.

Примечание: т.к. мы удаляем контейнер каждый раз (опция --rm), то запустив однажды очистку томов Docker sudo docker volume prune, наш том azure удалится. Поэтому сделаем контейнер-хранилище для него:

sudo docker run -ti --name az_cli_storage -v azure:/root azuresdk/azure-cli-python:2.0.18 az --version

Теперь нужно залогиниться, либо под вашим пользователем, либо под service principal. Под пользователем: az login и следовать инструкциям, которые распечатала команда.

Если вы уже создали Service Principal, то давайте залогинимся используя его. Для этого, нам сначала нужно залогиниться как пользователь, чтобы иметь возможность выполнять команды: az login

Получим список всех AD-приложений: az ad app list

Получим информацию об интересующем нас приложении по его id: az ad sp show --id 12345678-1234-1234-1234-1234567890123

Залогинимся под Service Principal: az login --service-principal -u 12345678-1234-1234-1234-1234567890123 --password {password} --tenant {tenant}

Развертываем кластер Docker Swarm внутри Azure

Создадим группу ресурсов (логическая группа, в которой выполняется развертывание и администрирование ресурсов Azure):

az group create --name DockerSwarmResourceGroup --location westeurope

Создаем кластер:

az acs create --name DockerSwarmCluster --orchestrator-type Swarm --resource-group DockerSwarmResourceGroup --generate-ssh-keys

В последующих инструкциях нужно будет заменить IPAddress на IP-адрес мастер-ноды Docker Swarm (в названии адреса будет swarm-master-ip).

Получим необходимые IP-адреса:

az network public-ip list --resource-group DockerSwarmResourceGroup --query "[*].{Name:name,IPAddress:ipAddress}" -o table

Первый IP это адрес мастер-ноды, на которой будет установлен docker, а второй - это адрес пула (ingress-сети), на который мы будем слать запросы из внешнего мира.

Поднимем SSH-туннель к мастер-ноде кластера:

ssh -p 2200 -i /var/lib/docker/volumes/azure/_data/.ssh/id_rsa -fNL 2375:localhost:2375 azureuser@IPAddress

Пропишем переменную окружения DOCKER_HOST, которая будет направлять наши docker-команды на Azure Docker Swarm Cluster, вместо локального демона docker:

export DOCKER_HOST=:2375

Теперь можно разворачивать в Azure Docker Swarm Cluster свои приложения, используя docker-compose.yml-файлы или просто docker в командной строке. Обратите внимание, что для того чтобы эта переменная работала, нужно обязательно запускать docker без sudo. Тогда можно будет сочетать работу с локальным docker (используя sudo) и Azure Docker Swarm Cluster (без sudo).

Удалим кластер:

az group delete --name DockerSwarmResourceGroup --no-wait

Развертываем кластер для тестирования

Развернем такой же кластер, как и выше, чтобы свободно экспериментировать с ним. Ключи ssh будем использовать от ранее созданного кластера.

az group create --name DockerSwarmTestNetResourceGroup --location eastus
az acs create --name DockerSwarmTestNetCluster --orchestrator-type Swarm --resource-group DockerSwarmTestNetResourceGroup

Посмотрим список всех кластеров:

az acs list --output table

Получим список всех кластеров внутри группы ресурсов DockerSwarmTestNetResourceGroup

az acs list -g DockerSwarmTestNetResourceGroup --output table

Отображение сведений о кластере DockerSwarmTestNetCluster службы контейнеров внутри группы DockerSwarmTestNetResourceGroup:

az acs show -g DockerSwarmTestNetResourceGroup -n DockerSwarmTestNetCluster --output list

Масштабирование кластера (увеличим количество агентов):

az acs scale -g DockerSwarmTestNetResourceGroup -n DockerSwarmTestNetCluster --new-agent-count 4

Посмотрим FQDN имена мастер-ноды кластера:

az acs list -g DockerSwarmTestNetResourceGroup --query '[*].{Master:masterProfile.fqdn,Agent:agentPoolProfiles[0].fqdn}' -o table

Создадим SSH-туннель к главному узлу кластера (замените MasterFQDN на то что вам выдала предыдущая команда) (подробнее можно посмотреть на странице Создание удаленного подключения к кластеру Kubernetes, DC/OS или Docker Swarm):

sudo ssh -p 2200 -i /var/lib/docker/volumes/azure/_data/.ssh/id_rsa -fNL 2374:localhost:2375 azureuser@MasterFQDN

Установите переменную среды DOCKER_HOST. Так вы сможете выполнять команды Docker с Docker Swarm без указания имени узла:

export DOCKER_HOST=localhost:2374

Развернем тестовый Docker Stack azurevote:

docker-compose up -d -f docker-stack-azurevote.yaml

Откроем в браузере по домену агента, взятому из пункта про FQDN.

Получившийся кластер малополезен, без постоянного хранилища для stateful-контейнеров. Мы не можем управлять, на какой ноде будет развернут наш контейнер. Выход - использовать Docker Volume Driver for Azure File Storage, но по умолчанию этого плагина в кластере нет. Есть инструкция, как его установить на все ноды кластера: Installing Docker Volume Driver for Azure File Storage on Azure Container Services

Создаем общую папку для постоянного хранения данных контейнеров и подключаем ее к созданному ранее Docker Swarm

Создаем общую папку (file share)

  1. Сначала создадим Storage Account там же, где у нас группа ресурсов:

     az storage account create -n dockerswarmtestnetdata -g DockerSwarmTestNetResourceGroup --sku Standard_LRS --encryption blob
    
  2. Потом создадим общую папку:

     az storage share create --name dockerswarmtestnetdata --quota 4096 --account-name dockerswarmtestnetdata
    

Обратите внимание, что Storage Account и общая папка называются одинаково.

Компилируем плагин и рспространяем его на все ноды кластера Docker Swarm

  1. Копируем приватный ключ на мастер-ноду (узнайте ваш MasterFQDN сначала):

     sudo scp -i /var/lib/docker/volumes/azure/_data/.ssh/id_rsa /var/lib/docker/volumes/azure/_data/.ssh/id_rsa azureuser@MasterFQDN:~/.ssh/id_rsa
    
  2. Зайдем по ssh на мастер-ноду:

     sudo ssh -i /var/lib/docker/volumes/azure/_data/.ssh/id_rsa azureuser@MasterFQDN
    
  3. Перейдем в папку ~/.ssh:

     cd ~/.ssh
    
  4. Изменим права на файл:

     chmod 600 id_rsa
    
  5. Установим unzip:

     sudo apt-get install -y unzip
    
  6. Перейдем в папку пользователя:

     cd ~
    
  7. Скачаем архив:

     wget https://github.com/theonemule/azure-file-storage-on-acs/archive/master.zip
    
  8. Распакуем архив:

     unzip master.zip
    
  9. Перейдем в папку со скриптами:

     cd azure-file-storage-on-acs-master
    
  10. Соберем драйвер из исходников:

    sudo sh build.sh
    
  11. Отредактируем install-local.sh:

    nano install-local.sh
    

    Нужно заменить "yourstorageaccount" и "yourkey" данными из вашего Storage Account. Кавычки оставить. Получить ключи для хранилища можно командой:

    az storage account keys list -g DockerSwarmTestNetResourceGroup -n dockerswarmtestnetdata
    
  12. Запишите изменения: Ctrl+O и выйдите из редактора nano: Ctrl+X

  13. Запустите install-agents.sh:

    sh install-agents.sh
    
  14. Тестируем:

Ссылки на документацию

Команды Azure CLI

Полное описание возможных команд доступно здесь: Azure CLI 2.0

  • Список всех поддерживаемых регионов:

      az account list-locations
    

    или

      az account list-locations --query "[].{Region:name}" -o table
    
  • Создадим группу ресурсов (логический контейнер для ресурсов) в регионе eastus:

      az group create --name myResourceGroup --location eastus
    
  • Просмотреть список популярных образов виртуальных машин:

      az vm image list -o table
    

    подробнее см. Поиск образов виртуальных машин Linux в Azure Marketplace с помощью Azure CLI

  • Создать виртуальную машину:

      az vm create -n myVM -g myResourceGroup --image UbuntuLTS --admin-username azureuser
    
  • Создать свой репозиторий Docker-образов Azure Container Registry:

      az acr create --resource-group myResourceGroup --name mycontainerregistry082 --sku Basic --admin-enabled true
    

Команды хранилища

  • Создадим аккаунт хранения:

      az storage account create -n mystorageaccount -g myResourceGroup --location eastus --sku Standard_LRS --encryption blob
    
  • Список всех Storage Accounts в виде удобной таблицы:

      az storage account list --query "[].{ID:name,Loc:location,Group:resourceGroup,SKU:sku.name}" -o table
    
  • Список всех контейнеров (аналог папки) внутри заданного Storage Account:

      az storage container list --account-name mystorageaccount
    
  • Список всех blobs (аналог файла) внутри контейнера mystoragecontainer и Storage Account mystorageaccount:

      az storage blob list --account-name mystorageaccount -c mystoragecontainer -o table
    

    Полезные данные про это находятся здесь: Perform Blob storage operations with Azure CLI

  • Посмотреть свойства blob'а:

      az storage blob show --account-name mystorageaccount -c mystoragecontainer -n blobName -o table
    

    или

      az storage blob metadata show --account-name mystorageaccount -c mystoragecontainer -n blobName -o table
    

Команды дисков

  • Создадим управляемый диск (managed disk) и назовем его data:

      az disk create -n data -g myResourceGroup --size-gb 10
    
  • Узнаем идентификатор диска data (вообще он был показан при создании, так что это не обязательно):

      az disk show -g myResourceGroup -n data --query 'id' -o tsv
    
  • Присоединим диск data к виртуальной машине myVM:

      az vm disk attach -g myResourceGroup --vm-name myVM --disk data
    

    Дальнейшая работа с присоединенным диском показана здесь: Add a disk to a Linux VM

Подсоединяем диск внутри Linux-виртуалки

sudo fdisk /dev/sdc
sudo mkfs -t ext4 /dev/sdc1 && sudo aptitude purge docker-ce -y
# drwx--x--x 12 root    root    4096 Oct  6 13:03 docker/
# Access: (0711/drwx--x--x)  Uid: (    0/    root)   Gid: (    0/    root)
# sudo mkdir /var/lib/docker
sudo mount /dev/sdc1 /var/lib/docker && sudo chmod go-wr+x /var/lib/docker && sudo -i blkid | grep sdc1
sudo vi /etc/fstab
# UUID=f97f11d0-8479-4250-98a8-da683c4f55a4   /var/lib/docker   ext4   defaults,discard,nofail   1   2
sudo umount /var/lib/docker
sudo mount /var/lib/docker
sudo aptitude install docker-ce -y
sudo reboot

ifconfig
sudo docker swarm join --token SWMTKN-1-4cyzflewghgblqs4xfy5uztsq41u6zj4lmxacz5hmsrbci597l-4d7yuxaqedn1d0fg3ho1d2gx0 192.168.1.9:2377

Подробности здесь: Подключение диска данных к виртуальной машине Linux

Работа с шаблонами (templates)

  • Задеплоим шаблон:

      az group deployment create -n ExampleDeployment -g ExampleGroup --template-file "azuredeploy.json"
    
  • Экспортируем группу manual в шаблон (все значения захардкожены, осторожно!)

      az group export -n manual
    

Разное

Sidebar is under construction

Clone this wiki locally