Microsoft Azure を意のままに操る Ansible 事始め
こんにちは、今回本ブログでご紹介するTipsは一言でいうと「Ansible で Microsoft Azure を操作してみる」です。クラウドサービスである Microsoft Azure を Ansible という自動構築・オーケストレーションが行えるオープンソース・ソフトウェア(以下:OSS)を使って操作してしまおうという、今回はその序章です。
はじめに
クラウドサービスを利用する場合、専用のUI、主にWebベースのポータルを利用する事があります。GUIポータルの利用は操作しやすくとてもわかりやすいですが、実際の運用上では柔軟に、簡便に、迅速に構築・運用管理することが求められ、その点では向かないケースがあります。一般に様々なクラウドサービスは、そのクラウドサービス用に用意されたAPIで外部のツールから操作を行うことができ、前述の観点においてクラウドを十分に活用できます。むしろそれができるからこそクラウドサービスを利用する価値があるといえます。 このクラウドサービスのAPIを使った構築・運用は、これまでのシステム構築・運用のノウハウとは勝手が異なるため、少しばかりの知識が必要になります。できるだけ、今持っている知識・技術でスマートにクラウドサービスの活用を実現したいものです。その手助けになれる OSS として私が注目したのが Ansible です。私以外のエンジニアの中でも注目されています。
【Google Trend より(検索ワード:Ansible、カテゴリ:オープンソース)】
例えば「自分のPCから、Azure 上に仮想マシンを起動し、さらにその上で必要な開発環境も準備・サービスを動かし、アプリケーションをデプロイする。」といったような事が1オペレーションで可能になります。
前置きが長くなりましたが、百聞は一見にしかずということでさっそく私が試した内容を記事に挙げましたのでご覧ください。なお、本記事をご覧のみなさんは Microsoft Azure についてはご存知な方も多いとおもいますが、Ansible についてはまだあまりご存知ない方もいらっしゃるとおもいますので少しそのあたりも補足するよう以下のようなアジェンダで構成しています。既に両者ともある程度勝手を知っていて、スグに試したいということであれば「Ansible を使って Azure 上に仮想マシンを立ち上げよう」からご参照ください。
アジェンダ
- はじめに(本セクション)
- Microsoft Azure について
- Ansible について
- Ansible を使って Azure 上に仮想マシンを立ち上げよう
- おわりに
Microsoft Azure について
Microsoft社のクラウドサービスです。NIST(National Institute of Standards and Technology:米国標準技術局)が公開しているクラウドコンピューティングのサービスモデルの定義でいう、PaaS(Platform as a Service) , IaaS(Infrastructure as a Service)をサポートしていると言えます。Microsoft 社というと「Windows」をスグに思い浮かべる方も多いと思いますが、Microsoft Azure では Windows というくくりにとどまっておらず、とてもオープンなプラットフォームが利用できます。新しい機能やサービスがこれからもどんどん利用できるようになってくるでしょう。
Ansible について
実は2013年頃くらいに発足したOSSとしてはまだ新しいプロジェクトです。昨今赤丸急上昇中のOSSとなっており、DevOps を実現するツールとしても注目されています。それはとても簡単なのに利用範囲が広く強力だからです。新しいソフト・ツールを使うということは新しい知識を覚えなければならず、ソフトや扱う人によっては多くの時間を要しますし、最悪は使うのを諦めてしまうこともあるでしょう。Ansible は学習コストがとても少ないものとなっています。故に少ない時間で熟練できます。また、エージェントレスでスグはじめることができ、本番環境への適用までの時間もとても短くできます。我々ITに携わる者にとって、すぐに使えるソフトウェアはそれだけで価値です。また、システムの構成情報を Dev と Ops で共通言語化できるのも特徴です。更に簡単なのに自動構築のみならずオーケストレーションも出来る点がクラウドとの親和性も高めています。
簡単ではありますが、私が入門編として講演したコンテンツをスライドシェアに公開しております。まだご存知ない方は一読いただくとこの後のセクションを読む上で理解の助けになると思います。
Ansible を使って Azure 上に仮想マシンを立ち上げよう
Microsoft Azure(以下Azure)上で仮想マシンを立ち上げるやり方を具体的に解説してきます。
今回の具体的な目標は「Ansibleを使ってAzure上でWindows Server 2012を起動する」です。
ステップは以下のようになります。
- Microsoft Azure の準備
- Ansible マシンを用意
- Ansible の実行
- アクセス・ログイン確認
1. Microsoft Azure の準備
Azure において以下の準備が必要です。
- 1-1. Azure アカウント
- 1-2. Azure CLI インストール
- 1-3. ストレージアカウント
- 1-4. 管理証明書
1-1. Azure アカウント
こちらは、Azure の Web サイトから登録・取得してください。完了後、サブスクリプション ID を確認することが出来ます。この ID 必要です。まだお持ちでない方も1か月間の無料評価版がついておりますのでこれを機にお試しいただけます。ここでは詳細な作成方法はここでは割愛しますので、Azure アカウント作成については こちらをご参照ください。 Get Started
1-2. Azure CLI インストール
Azure をコマンドレベルで操作するユーティリティがあります。Ansible を使う上で必須なわけではないですがこれを使うほうが手っ取り早い事がわかりました。以下は Azure CLI を Ubuntu Linux にインストールする例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ sudo apt-get install nodejs-legacy $ sudo apt-get install npm $ sudo npm install -g azure-cli npm http GET https://registry.npmjs.org/azure-cli npm http 200 https://registry.npmjs.org/azure-cli (略) /usr/local/bin/azure -> /usr/local/lib/node_modules/azure-cli/bin/azure azure-cli@0.9.9 /usr/local/lib/node_modules/azure-cli $ azure help info: Executing command help info: _ _____ _ ___ ___ info: /_\ |_ / | | | _ \ __| info: _ ___/ _ \__/ /| |_| | / _|___ _ _ info: (___ /_/ \_\/___|\___/|_|_\___| _____) info: (_______ _ _) _ ______ _)_ _ info: (______________ _ ) (___ _ _) info: info: Microsoft Azure: Microsoft's Cloud Platform info: info: Tool version 0.9.9 (略) help: Current Mode: asm (Azure Service Management) $ |
Azure CLI を使用するにあたって、Azure で作ったアカウントを認証するための設定が必要です。
|
1 2 3 4 5 6 |
$ azure account download info: Executing command account download info: Launching browser to http:// help: Save the downloaded file, then execute the command help: account import info: account download command OK |
指示されたようにファイルをダウンロードして、以下のように Linux マシンにインポートします。
|
1 2 3 |
$ azure account import credentials.publishsettings info: Executing command account import info: account import command OK |
これで Azure の自分のアカウントで Azure CLI が利用できるようになります。
|
1 2 3 4 5 6 7 8 9 10 11 |
$ azure account show info: Executing command account show data: Name : 無料試用版 data: ID : <Your subscription ID> data: Tenant ID : data: Is Default : true data: Environment : AzureCloud data: Has Certificate : Yes data: Has Access Token : No data: info: account show command OK |
1-3. ストレージアカウント
これは Azure ポータルまたは Azure CLI にて作成することが出来ます。この時、作成するロケーションに注意します。例えば日本であれば、日本(西)「Japan West」があります。これは後に起動する仮想マシンと同じロケーションにします。アカウントを作成すると、ストレージアカウント名が確認できます。詳細な作成方法は割愛します。
ストレージアカウントは1度でも仮想マシンを作った事があるとそれに準じて自動で作成されています。それを使っても構いません。
1-4. 管理証明書
外部 API からのアクセスするアカウントを Azure 側で認証するために必要なものです。Ansible で操作する場合も必要です。Azure CLI をセットアップした後は既にクラウド上に管理証明書が保存されています。クライアント側(操作する側)に秘密鍵を含んだ証明書が必要であり、それを取得します。Azure CLI を使ってそれをエクスポートします。
|
1 |
$ azure acount cert export -f /home/takeshik/manage.cer |
2. Ansible マシンを用意
Linux マシンを用意します。ここでは前述の Azure CLI をインストールしたマシンと同じです。
- 2-1. Ansible インストール
- 2-2. Ansible 実行準備(インベントリファイルとプレイブック)
2-1. Ansible インストール
Ansible をインストールします。ディストリビューションによらず簡単です。他、Mac OSX をご利用の方は別途 Ansible マニュアルを参照してください。
実は Azure 上に Windows 系の仮想マシンを起動させるためには、投稿時点の Ansible 1.9.x 系のバージョンではなく次期バージョンである 2.0.0 以上が必要です。ここでは先取りでこのバージョンを使います。(GA バージョンのインストールは【補足】を参照してください。)
|
1 2 3 4 5 6 7 8 9 10 |
$ git clone https://github.com/ansible/ansible.git $ cd ansible $ git checkout v2.0.0-0.3.beta1 $ git submodule update --init $ . hacking/env-setup $ ansible --version ansible 2.0.0 (detached HEAD 5ae74f7d38) last updated 2015/10/12 07:19:07 (GMT +000) lib/ansible/modules/core: (detached HEAD d659c79db7) last updated 2015/10/12 07:19:50 (GMT +000) lib/ansible/modules/extras: (detached HEAD 0ff1776a84) last updated 2015/10/12 07:20:14 (GMT +000) config file = /etc/ansible/ansible.cf |
Ansible は専用のモジュールを使って様々な処理を実行します。今回は Ansible で用意されている Azure モジュールを使います。このモジュールは以下の環境でサポートされています。
- Python >= 2.6
- Python azure module >= 0.8.0 (Ansible マニュアルは少し古い情報)
2つめの部分からわかるように、Python の Azure モジュールが必要なのでインストールします。
|
1 2 3 4 5 6 7 |
$ sudo pip install azure==0.11.1 $ sudo pip show azure --- Name: azure Version: 0.11.1 Location: /usr/local/lib/python2.7/dist-packages Requires: python-dateutil, futures |
投稿時時点で、Azure 用の Python モジュールは1.0.2が最新ですが、1.0.2は Ansible の Azure モジュールが対応していない事がわかっているため0.11.1を使っています。
2-2. Ansible 実行準備(インベントリファイルとプレイブック)
Ansible の実行に必要なファイルは「インベントリ」ファイルと「プレイブック」ファイルです。今回はそれぞれ以下のように作成します。
|
1 |
127.0.0.1 ansible_connection=local |
インベントリファイルはコンフィグレーションを行いたいターゲットを指定します。通常ホスト名やIPアドレスを記述しますが、ターゲットがクラウドサービスそのものである場合は「localhost(127.0.0.1)」を指定します。
通常、Ansible モジュールはそのターゲットにコピーされてから実行されることになります。しかし、クラウドサービスそのものの操作は、まず Ansible 実行ホスト側でモジュール(今回であれば Azure 用のモジュール)を動かすことになるため、localhost を指定します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
--- - hosts: localhost gather_facts: no tasks: - name: Create Virtual Machine on Azure (for Windows) azure: # Ansible の azure モジュールを使うことを宣言し、以下はそのオプション auto_updates: no enable_winrm: yes endpoints: "3389" image: 'bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2012R2-x64-v14.2' location: 'Japan West' management_cert_path: /home/takeshik/manage.cer # 取得した管理証明書 hostname: tkstudio name: tkstudio os_type: windows user: azureuser password: "Password_123" role_size: Basic_A2 state: present storage_account: # 取得したストレージアカウント名 subscription_id: # 取得したすサブスクリプションID |
プレイブックファイルではコンフィグレーションを行いたい内容を書きます。今回は Azure モジュールを使って仮想マシンの起動に必要な情報を書いています。Ansible の Azure モジュールについての使い方はマニュアルをご参照ください。Ansible Azure Module
インベントリは INI 、プレイブックは YAML というフォーマットで書かれています。「フォーマットを覚えなければならないのか?」と思うかもしれませんが、これらのフォーマットはとても単純で、直感的に扱えます。YAML はいわば日本語の箇条書き(それを入れ子にする)をのようなフォーマットです。フォーマットについては前述の私のスライドや Ansible のマニュアルに書かれている程度の内容がわかれば事足ります。Inventory , YAML Syntax
上記の Azure モジュールの各オプションで Azure 側の情報を知らないとわからないものとして、 image , location , role_size があります。これらは自身で選択することになります。まず、image と location は Azure CLI で確認できます。
|
1 2 3 |
$ azure vm image list $ azure vm location list |
role_size (仮想マシンのサイズ・スペック)についてはこちらのドキュメントによると、
"ExtraSmall"、"Small"、"Medium"、"Large"、"ExtraLarge"、
"A5"、"A6"、"A7"、"A8"、"A9"、"A10"、"A11"、"Basic_A0"、"Basic_A1"、"Basic_A2"、"Basic_A3"、"Basic_A4"、
などです。使える仮想マシンのサイズはロケーションにより異なります。なお、role_size のデフォルトは "Small" です。
今回は、image に Windows Server 2012R2イメージを、location には Japan West 、role_size は Basic_A2 というのを指定しています。
3. Ansible 実行
以下のように作成したプレイブックを実行します。
|
1 2 3 4 5 6 7 8 9 10 11 |
$ ansible-playbook -i hosts playbook.yml PLAY *************************************************************************** TASK [Create Virtual Machine on Azure (for Windows)] *************************** (少し時間を置き・・・) PLAY RECAP ********************************************************************* 127.0.0.1 : ok=1 changed=1 unreachable=0 failed=0 $ |
少し出力結果を解説すると、「ok=1」というのは実行したアクションが正しく完了した事を表します。今回は「仮想マシンを起動させる」というアクションのみでしたのでカウントは"1"でした。そして、具体的に仮想マシンの起動が行われているため「changed=1」と表されています。この意味は例えば、このあと同じ Ansible コマンドを実行すると「ok=1、changed=0」と出力されます。前回の実行で「仮想マシンが起動されている状態」になっているためです。これにより Ansible が冪等性というものを保っていることが確認できます。冪等性については【補足】をご参照ください。
Azure CLI または GUIポータル画面を確認してみてください。ステータスが確認できます。少し時間を要します。
|
1 2 3 4 5 6 7 8 |
$ azure vm list info: Executing command vm list + Getting virtual machines data: Name Status Location DNS Name IP Address data: -------- ------------ ---------- --------------------- ----------- data: hogehoge Provisioning Japan West hogehoge.cloudapp.net ***.***.***.*** info: vm list command OK $ |
Azure CLI では【Status】が ReadyRole となると起動完了です。GUIポータルでは【状態】が実行中となります。
4. アクセス・ログイン確認
Azure 上で起動させた仮想マシンへのアクセスを行ってみます。リモートデスクトップ接続でアクセスします。Ansible の Azure モジュールオプションでendpoints: "3389"としていたのは外からリモートデスクトップでアクセスするためです。
通常GUIポータルから仮想マシンを起動するとデフォルトではパブリック側のポートは別のものがアサインされますが、Ansible の Azure モジュールではその構成にまだ対応できないため、3389を指定しています。
補足
Ansible インストール
投稿時点で Version は 1.9.4 が最新です。
|
1 2 3 4 |
$ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible |
failed to create the new virtual machine
モジュールオプションで既に使われている「hostname」を指定していると以下のようにエラーとなります。別の名前で再実行してみてください。
|
1 2 3 4 5 6 7 8 9 |
$ ansible-playbook -i hosts playbook.yml PLAY *************************************************************************** TASK [Create Virtual Machine on Azure (for Windows)] *************************** fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "failed to create the new virtual machine, error was: Not found (Not Found)"} PLAY RECAP ********************************************************************* 127.0.0.1 : ok=0 changed=0 unreachable=0 failed=1 |
冪等性
日本語は聞き慣れないものかとおもいますが「ある操作を1回やっても、何回実行しても同じ結果(状態)を得ることができる」ということです。今回の実行例でいうと、Ansibleコマンドを実行した結果、仮想マシンが起動していないなら起動するし既に起動しているのであればその操作を行う必要がないため起動処理を行わない、ということです。Ansible の Azure モジュールに冪等性を保つ実装がされています。
おわりに
いかがでしたでしょうか、まずは Ansible が大体どのようなものであるか、そして Azure とどのように関連付けて操作させるのか、ご理解いただけたのではとおもいます。ただ、感のいい方はお気づきかもしれませんが、 実は今回ご紹介した内容はわざわざ Ansible を使わなくても Azure CLI だけでもできてしまいます。しかし、Ansible では Azure CLI だけでは出来ない仮想マシン上のセットアップ、ミドルウェアインストール・セットアップ・デプロイ、オーケストレーションもできてしまうのです。はじめにお話した「・・・が1オペレーションで」というやつです。次回はその部分も含めてご紹介したいとおもいます。