AnsibleからAzureを操作してみた その2 ~仮想マシン作成編~

こんにちは。株式会社リアルグローブの廣川です。

時間が空いてしまいすみませんでした!前回の記事でAnsibleからAzure Resource Managerを操作することができるようになりましたので、今回は実際にPlaybookを使って仮想マシンを作成してみましょう!

Ansible組み込みのAzure Resource Manager用モジュール

実操作の前に、Ansible 2.1で追加されたAzure Resource Manager(ARM)用モジュールでどんな操作ができるようになったのか、簡単に紹介しておきましょう。

操作系モジュール

  • azure_rm_networkinterface: ネットワーク インターフェイス (NIC)の操作
  • azure_rm_publicipaddress: パブリックIPアドレスの操作
  • azure_rm_resourcegroup: リソースグループの操作
  • azure_rm_securitygroup: セキュリティグループの操作
  • azure_rm_storageaccount: ストレージアカウントの操作
  • azure_rm_storageblob: ストレージ上のBLOBの操作
  • azure_rm_subnet: 仮想ネットワーク上のサブネットの操作
  • azure_rm_virtualmachine: VMの操作
  • azure_rm_virtualnetwork: 仮想ネットワークの操作

状態(Facts)取得系モジュール

  • azure_rm_networkinterface_facts: ネットワーク インターフェイス (NIC)の状態取得
  • azure_rm_publicipaddress_facts: パブリックIPアドレスの状態取得
  • azure_rm_resourcegroup_facts: リソースグループの状態取得
  • azure_rm_securitygroup_facts: セキュリティグループの状態取得
  • azure_rm_storageaccount_facts: ストレージアカウントの状態取得
  • azure_rm_virtualmachineimage_facts: VMイメージの状態取得
  • azure_rm_virtualnetwork_facts: 仮想ネットワークの状態取得

その他

  • azure_rm_deployment: ARMのデプロイを作成 * 筆者の環境ではエラーとなりうまく動かせませんでした…

と、かなり充分なARM操作がAnsible経由で実行できるようになりました。
各モジュールの詳細は公式ドキュメント(英語)を確認してください。

Ansibleから仮想マシンを作る

お待たせしました。それではAnsibleから仮想マシンを作成するためのPlaybookを作成していきましょう!個別のAnsible Playbookの書き方説明は割愛しますので、拙著「Ansible完全読本」や当ブログのクララオンライン吉村さんのAnsible解説記事を参考にしてくださいね。

今回作るPlaybookはgithub上でも公開しております。azure_rm_virtualmachine モジュールのバグ修正版も含めてありますので確認してみてください(サンプルPlaybookはAnsible 2.1の公式モジュールでも動くようにしています)。

完成済みサンプルPlaybookは以下の手順で用意できます。

手順 0. Playbookファイル site.yml を作成する

まずはPlaybookファイル site.yml を以下のように作りましょう。

ここでは localhost 上での create_azure_vm.yml 上タスクの呼び出しだけを定義しており、手順 1. 以降のここから実タスクは site.ymlと同じディレクトリに置いた create_azure_vm.yml と言うファイルに記述していきます。

手順 1. リソースグループとサブネットを作成する

ARMのアーキテクチャではVMやネットワーク、ストレージといった各種リソースは全てある一つのリソースグループに所属することになります。ですので、まず最初は azure_rm_resourcegroup モジュールを使ってリソースマネージャを作成しましょう。

location(地域)にはjapaneast(東日本)を選んでいますが、もちろん他の地域を選ぶことも可能です。使用可能な地域のリストは、前回使った azure-cli から以下のように取得可能です。

手順 2.  仮想ネットワークを作成する

arm_arch2

AzureのARM上ではVMは上図の様にストレージ、NICに紐付いています。

AnsibleからVMを作る際にはストレージやNIC(と付随するIPアドレスとネットワーク・セキュリティ・グループ)を自動でまとめて作成することができますが、NICを所属させる仮想ネットワークとその中のサブネットは予め作成しておいてあげる必要があります。(ロードバランサーについては今回は取り扱いません。)

上記では 10.0.0.0/16(10.0.0.0 ~ 10.255.255.255)のレンジを持つ仮想ネットワークvn01を作成し、その中の10.0.0.0/24(10.0.0.0 ~ 10.0.0.255)subnet01に割り当てています。

手順 3.  仮想マシンのイメージを選択

これで仮想マシン作成前に必要な作業は完了しましたので、どのイメージを使って仮想マシンを作成するかを選びましょう。

Windows系イメージ
Publisher(発行元) Offer(プラン) SKU
MicrosoftWindowsServer WindowsServer 2012-R2-Datacenter
MicrosoftWindowsServer WindowsServer 2012-Datacenter
MicrosoftWindowsServer WindowsServer 2008-R2-SP1
MicrosoftWindowsServer WindowsServer Windows-Server-Technical-Preview
MicrosoftSQLServer SQL2014-WS2012R2 Enterprise-Optimized-for-DW
MicrosoftSQLServer SQL2014-WS2012R2 Enterprise-Optimized-for-OLTP
Linux系イメージ
Publisher(発行元) Offer(プラン) SKU
OpenLogic CentOS 7.2
RedHat RHEL 7.2
Canonical UbuntuServer 16.04.0-LTS
credativ Debian 8
CoreOS CoreOS Stable

といった所がよく使われる代表的なイメージになります。

これ以外のイメージを使いたい場合もしくは各イメージの古いバージョンを使いたい場合は、以下のコマンドから検索可能です。

手順 4.  仮想マシンの作成: Windows

お待たせしました。仮想マシン作成の手順を進めていきましょう。ここでは

  • WindowsServer Windows-Server-Technical-Preview(Windows Server 2016のプレビュー版)

の仮想マシンを一台作ってみましょう。仮想マシンの作成には azure_rm_virtualmachine モジュールを使います。

指定している引数がかなり多いので、それぞれ解説していきます

  • name: 仮想マシンの名前
    • 英数字15文字以内で指定
    • Anible 2.1現在、既知の問題のためアルファベットの大文字が使えない
  • resource_group: 使用するリソースグループ名
  • vm_size: 仮想マシンのスペック
    • 利用可能なサイズは以下のコマンドで取得可能
  • public_ip_allocation_method: パブリックIPの割り当て形式
    • Dynamic の場合は、VMリブート時などにIPが変更される
    • Static を指定することで静的なIPの割り当てが可能
  • admin_username: 管理者ユーザーのログイン名
  • admin_password: 管理者ユーザー用ログインパスワード
  • open_portsネットワーク・セキュリティ・グループで開放するポート番号のリスト
    • ここでは 3389(RDP用)、5986(WinRM HTTPS用)番への外部アクセスを許可
    • Anible 2.1現在、Windows VMでこの値を未設定にするとエラー
  • os_type: OSイメージの種別、
    • Windows, Linux から選択
  • image: イメージ情報。手順 3. で選んだもの
    • publisherイメージ発行元
    • offer: プラン名
    • skuSKU名
    • versionイメージのバージョン。latest を指定すると最新版が使われる
  • tags: 任意のタグを key: value の形式で設定可能
    • ここでは ansible-target と言うキーに true と言う文字列を値として設定している

最後の debug タスクでは作成完了後の仮想マシンのパブリックIPアドレスを表示しています。

手順 5. Playbookの実行

それでは完成したPlaybookを実行してみましょう!

無事、仮想マシン作成が完了したでしょうか?
仮想マシン作成が無事に完了した場合、Ansibleの出力に

の様なログが表示されているはずです。

実際に表示されたIPアドレスでWindowsマシンにログインできているか、リモートデスクトップ接続ツールを使って接続してみてください。

手順 6. WindowsマシンのAnsible対応

Ansibleの優れている点の一つにエージェントレスでのWindows対応が挙げられます。AnsibleはエージェントレスでLinuxに接続するためにSSHを使いますが、WindowsにはSSHサーバーが入っていません。その代わりにWindowsデフォルトのリモート操作用サービス WinRM を使ってWindowsに接続します。

Azure上のWindowsサーバー・イメージはデフォルトでWinRMが起動状態になっているのですが、初期状態では「HTTPS接続用の設定はされていないが、暗号化されていない通信(HTTP)は許可しない」という状態になっており、そのままではHTTPS、HTTPどちらからの接続も出来ません。WinRMのインターネット上でのHTTP接続許可はセキュリティ上の問題がありますので、ここではHTTPS接続の設定をしてあげる方向で対応を進めていきましょう。

Azure Resource Manager上Windows仮想マシンのWinRM HTTPS接続設定をリモートから実行するには、VMテンプレートを使って自己証明書の設定がされたVMを作成する方法がありますが、実に残念ながら現時点ではこの手順をAnsibleから実行させることはできません。

そのため、デフォルト状態のWindows仮想マシンをAnsibleから操作できるようにするには若干の手作業が発生してしまいます。

とはいえ、必要な作業はとても簡単です。リモートデスクトップ経由でWindowsにログインし、PowerShellを開いて以下のコマンドを実行してください。

これが完了すれば、AnsibleからWindowsへの接続準備は完了です。実に簡単ですね!とはいえ、実用の場面で多数のVMを作成するような場合は一台ずつログインしてこの作業を実行するのは大変ですので、この対応までが済んだ状態をイメージ化して使い回すのが良いでしょう。ただし、その場合は複数VM間で同じ自己証明書を使うことになる点には留意してください。

手順 7. AnsibleからAzure上のWindows仮想マシンに接続

それでは最後にAnsibleからWindowsマシンに接続できることを確認して、今回の締めとします。

まずは、Ansible(Python)からWinRMを操作するためのライブラリをインストールしましょう。

次にWindowsマシンに接続するためのInventoryファイル hosts を以下のような内容で作成します。

xxx.xxx.xxx.xxx は前段までと同様に作成された仮想マシンのパブリックIPアドレスを入れてください。
その他の設定項目を簡単に説明すると、

  • ansible_connection=winrm: WinRM経由でホストに接続することを明示
  • ansible_winrm_server_cert_validation=ignore: 自己証明書での接続を許可
  • ansible_user=MyAdminName: 仮想マシン作成時に指定した管理ユーザー名
  • ansible_password=MyAdminP@ssw0rd: 仮想マシン作成時に指定したログインパスワード

の様になっています。

実際にWindowsに接続できることを win_ping モジュールを使って確認してみます。

以下の様に pong が返って来れば成功です。

お疲れ様でした!これでAnsibleからWindows仮想マシンを作り、その仮想マシンにAnsibleから接続するまでが完了しました。

次回、最終回ではAzureから動的に仮想マシンリストを取得して、各仮想マシンにログインして作業する手順を解説していきますよ!

Share on LinkedIn
LINEで送る
Pocket

realglobe Inc.