normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Azure Automation を利用して PowerShell DSC for Linux で Apache をセットアップする

今回も LinuxMicrosoft Platform の露払いをしたいと思う。Desired State Configuration と呼ばれるコンセプトの実現技術として Linux では Puppet, Chef 等が存在するが、PowerShell DSC と呼ばれる技術も Linux 版に対応していることをご存じだろうか。
Get started with Desired State Configuration (DSC) for Linux に入門編があるが、こちらはオンプレミスで PowerShell DSC for Linux を構成する方法であるため、今回はこちらを Microsoft Azure の PaaS である Azure Automation を利用して実現する方法を紹介する。

利用する Microsoft Azure のコンポーネント

今回利用する環境は以下となる。毎度 CentOS を利用しているが、これは Microsoft 公式サイトでは Ubuntu を利用したドキュメントが多いものの日本の大企業では RHEL が多いことへの配慮となる。

今回の設定手順の概要

以下が今回の作業手順になる。

  • 管理ポータル側の作業 - その 1
    • Azure Automation アカウントを作成する
    • PowerShell DSC 向けのスクリプトを作成し、Azure Automation アカウントの DSC 構成に登録する
    • モジュール nx をギャラリーから追加する
    • コンパイルを実施する
  • Linux 仮想マシン側の作業
    • OMI と DSC パッケージをインストールする
    • コマンドを実行して Azure Automation アカウントに紐づける
  • 管理ポータル側の作業 - その 2

上記における「コマンドを実行して Azure Automation アカウントに紐づける」の作業は Windows Server であれば管理ポータル上から可能であり、「Linux 仮想マシン側の作業」である OMI と DSC パッケージのインストールも不要な点が LinuxMicrosoft Azure 上の PowerShell DSC を利用する場合の差異となる。

管理ポータル側の作業 - その 1

まずは管理ポータルから新規に Azure Automation のアカウントを作成する。[新規]-[Monitoring + management]-[オートメーション]を選択し、適切なパラメータを設定して作成する。
f:id:waritohutsu:20161225120410p:plain

作成した Azure Automation アカウントに Linux 仮想マシンに対する制御を行う nx モジュールをインポートする。以下の [資産]-[モジュール] を選択し、ギャラリーから追加を選択した後に nx で文字列検索を実施すると以下の画面となる。
f:id:waritohutsu:20161225120933p:plain

上記から Module with DSC Resources for Linux を選択する。設定が無事完了すると以下の画面の様に nx モジュールが利用可能で追加される。
f:id:waritohutsu:20161225121045p:plain

更に以下の 01.CentOS-Configuration.ps1 ファイルを作成する。以下のスクリプトLinux マシンに yum を利用して Apache をインストールし、サービスを実行中にする処理を行うものだ。

Configuration CentOSConfig
{
    # ここで nx モジュールを明示的にインポートしないとエラーが発生する
    Import-DscResource -Module nx

    Node CentOS.Apache
    {
        nxPackage Httpd
        {
            PackageManager = "yum"
            Name = "httpd"
            Ensure = "Present"
        }

        nxService HttpdStatus
        {
            Controller = "systemd"
            Name = "httpd"
            Enabled = $true
            State = "Running"
            DependsOn = "[nxPackage]httpd"
        }
    }
}

次に [DSC 構成] を選択して [構成の追加] から 01.CentOS-Configuration.ps1 ファイルを選択し、管理ポータル上にアップロードする。以下の様に [DSC 構成] に CentOSConfig が追加されていれば成功だ。
f:id:waritohutsu:20161225120701p:plain

登録した DSC 構成である CentOSConfig を選択し コンパイル を選択して仮想マシンに登録可能な形式に変換する。以下の様に「キュー登録済み」となり、数分待つとジョブが完了するので、エラーが発生しないか確認してほしい。
f:id:waritohutsu:20161225121247p:plain

この際、「Import-DscResource -Module nx」を記載し忘れるとコンパイル時に以下のエラーが発生するので注意が必要だ。

Exception calling "NewScriptBlock" with "1" argument(s): "At line:9 char:9 + nxPackage httpd + ~~~~~~~~~ Undefined DSC resource 'nxPackage'. Use Import-DSCResource to import the resource. At line:17 char:9 + nxService SSHDStatus + ~~~~~~~~~ Undefined DSC resource 'nxService'. Use Import-DSCResource to import the resource." (At line:9 char:9 + nxPackage httpd + ~~~~~~~~~ Undefined DSC resource 'nxPackage'. Use Import-DSCResource to import the resource. At line:17 char:9 + nxService SSHDStatus + ~~~~~~~~~ Undefined DSC resource 'nxService'. Use Import-DSCResource to import the resource.)

Linux 仮想マシン側の作業

次に PowerShell DSC for Linux で構成管理したい Linux マシンへアクセスし、OMI と DSC パッケージをインストールすため、以下のコマンドを実行する。

[azureuser@XXXXXXXXXXXX ~]$ sudo su -
[root@XXXXXXXXXXXX ~]# yum -y install https://github.com/Microsoft/omi/releases/download/v1.1.0-0/omi-1.1.0.ssl_100.x64.rpm
[root@XXXXXXXXXXXX ~]# yum -y install https://github.com/Microsoft/PowerShell-DSC-for-Linux/releases/download/v1.1.1-294/dsc-1.1.1-294.ssl_100.x64.rpm

以下を実施した後、管理ポータルから「プライマリ アクセス キー」と「URL」を取得する。
f:id:waritohutsu:20161225121914p:plain

上記の値を利用して以下のコマンドを実行する。正常終了の場合には以下の様に ReturnValue=0 がコマンド後に返される。

[root@XXXXXXXXXXXXX ~]# /opt/microsoft/dsc/Scripts/Register.py [プライマリ アクセス キー] [URL]
instance of SendConfigurationApply
{
    ReturnValue=0
}

上記のコマンドを実行すると以下の様に DSC ノードとして登録され管理ポータル上に反映される。
f:id:waritohutsu:20161225122054p:plain

管理ポータル側の作業 - その 2

ポータル上にノードとして割り当てられた仮想マシンに対し、登録済みの [DSC 構成] を仮想マシンに設定する。
f:id:waritohutsu:20161225122128p:plain

以下の様に保留中になるので、「準拠」に状態が変わるまでしばらく(20分~30分程度)待つ。上記が無事完了すると状態が準拠になるので Apache の動作が確認可能になる。