Azure i ansible

Dostałem możliwość potestowania Azure - głównie w celu rozwoju swoich projektów. Jako, że ostatnio sporo dłubię w Ansible - pierwsze rzecz, która mi przyszła do głowy to oczywiście deploy czystego serwera z poziomu Ansible.

Zanim zaczniemy - potrzebne są narzędzia Azure zainstalowane w systemie. Do tego celu postrzebne jest nam nodejs i npm. Później wystarczy zainstalować azure-cli:

npm install azure-cli -g

Później musimy się zalogować na swoje konto. Najprościej jest to zrobić za pomocą polecenia:

azure account download
azure account import <nazwa_pliku>

Na sam koniec potrzeba nam jeszcze certyfikatu management i (opcjonalnie) x.509 z klucza ssh.

# certyfikat management
azure account cert export
# certyfikat x.509 id_rsa
openssl req -x509 -key ~/.ssh/id_rsa -nodes -days 365 -newkey rsa:2048 -out myCert.pem

Tyle ze wstępu, przygotowań narzędzi i potrzebnych plików. Do samego deployu potrzeba nam tylko jeszcze jednej rzeczy - nazwy obrazu, który chcemy wrzucić. Z dystrybucji Linuksa dostępny jest RedHat, Ubuntu i OpenLogic (CentOS). Listę dostępnych obrazów uzyskamy poleceniem:

azure vm image list

Potrzebujemy całej nazwy obrazu, czyli:

5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150706

Jak wygląda kwestia playbooka do tego? Ja stworziłem sobie plik ze zmiennymi (żeby ich w repo przypadkiem nie wrzucić) i wygląda on tak:

azure:
  subscription: <id_subskrypcji>
  user: mariom
  ssh_cert_path: vault/ssh.pem
  management_cert_path: vault/azure.pem 
  location: "West Europe"
  image: 5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150706
  storage_account: ansibletest

Playbook:

- name: Create azure vm
  hosts: localhost
  vars_prompt:
    azurename: "Hostname?"
  tasks:
    - include_vars: vault/azure
    - local_action:
        module: azure
        name: "{{ azurename }}"
        role_size: Basic_A0
        image: "{{ azure.image }}"
        location: "{{ azure.location }}"
        user: "{{ azure.user }}"
        ssh_cert_path: "{{ azure.ssh_cert_path }}"
        subscription_id: "{{ azure.subscription }}"
        management_cert_path: "{{ azure.management_cert_path }}"
        storage_account: "{{ azure.storage_account }}"

Playbook wykonuje się lokalnie - bo z naszej maszyny jest tworzona inna. Przed wykonaniem zapyta się nas o nazwę nowej wirtualki na Azure. Jeśli wszystko zrobiliśmy poprawnie - playbook powinien zakończyć się sukcesem i po kilku minutach w panelu Azure powinna być widoczny, włączony nowy serwer wirtualny.