IBM Cloud Schematicsを触ってみた

Bluemixのドキュメントを見ていたら、Computeのカテゴリーに「IBM Cloud Schematics」なるベータ版のサービスが提供されていたので、せっかくなので試してみました。

ただし、Bluemix Infrastrture (Softlayer)でIBM Cloud SchematicsのベースであるTerraformを使っている記事が既にありますので、Terraformの細かい話は今回割愛します。

IBM Bluemix IaaS で Terraform を使ってみた
http://qiita.com/khayama/items/e1f070ba368ab5da335a

Bluemix Platform (PaaS)中心の自分には難しそうですが、とりあえずやってみます。

[2017/05/22 追記]
IBM Cloud Schematicsと同じくTerraformベースで自動化のためのサービスとしてCAM(IBM Cloud Automation Manager)が既に正式利用可能なサービスとして公開されています。簡単な使用方法は以下を参考にしてください:

IBM Cloud Automation Manager(CAM)を触ってみよう！
http://qiita.com/testnin2/items/b2d3805f2458fb6ebb0f

上記は既に構成テンプレートも提供されていますし、自身のテンプレートもインポートできるので、IBM Cloud Automation Manager(CAM)を使うのがよさげです。標準サービスとしてBluemix Infrastructure部分のみ切り出しての位置付けでIBM Cloud Schematicsがあるのか?など、IBM Cloud Schematicsの立ち位置が明確になってくれないかなと。。

# IBM Cloud Schematicsとは
Bluemixが提供する自動化ツール・サービスで、HashiCorpのTerraformがベースになっています。
Terraformはインフラの構築・変更・バージョン管理を安全かつ効率的に行うためのツールです。

[参考] HashiCorp - Terraform (announcement)
https://www.hashicorp.com/blog/Terraform-announcement/

[参考] Terraform Write, Plan, and Create Infrastructure as Code
https://www.terraform.io/

詳しくは上述のリンクやQiitaにも記事を確認してください。
対象はBluemix Infrastructureのようで、Bluemix Platformは対象外です。

# IBM Cloud Schematicsでやれること
ベータ版のため、これからまだまだやれることは増えると思いますが、以下のリンクを見ると、2017年5月時点で4種類のInfrastructureデータソース、25種類のInfrastructureリソースが提供されています。

[参考] IBM Cloud Provider for Terraform
https://ibm-bluemix.github.io/tf-ibm-docs/

リソースに関しては、例えば、

- 仮想あるいはベアメタル・サーバーのプロビジョニング
- VPX load balancers (NetScaler)をプロビジョニング
- ハードウェア・ファイアウォールのプロビジョニング/設定
- エンデュランス/パフォーマンス・ストレージ(ブロック・ストレージ)のプロビジョニング

など、基本的なサービスに対するリソースは用意されているようです。

個人的にはNetwork Gateway Applianceに対するリソースがあると嬉しいなと思うのですが、、まあこれからでしょうか。

# IBM Cloud Schematicsを利用するために必要なもの
操作に関しては、以下のものが用意されており、ドキュメントに使い方がまとめられています:

- Bluemixコンソール(Webブラウザー)
- Bluemixコマンドラインのschematicsプラグイン
- REST API

上記とは別に、Terraformのテンプレートファイル(.tfファイル)をGitリポジトリー上に用意しておく必要があります。<b>上記のどの手順を使うとしてもGitリポジトリーが必須</b>であること、<b>2017年5月時点ではパブリックに公開されているgitリポジトリーのみ使用可能</b>なことに注意してください。

今回はBluemixが提供するGitLab上にテンプレート・ファイルを用意しました:

テンプレート・ファイルのサンプル・リポジトリー
https://git.ng.bluemix.net/mathezeus.code00z/IBMCloudSchematicsSample

上記のテンプレートでは、以下の操作を行うように構成しています:
1. SSHキーを作成
2. Bluemix Infrastruture上に1コア, 1024MBのRHELベースの仮想サーバーを1つ作成
3. 生成したSSHキーのペアとなるプライベート・キーでSSH可能となるように仮想サーバーをセットアップ

# 使い方 - Bluemixコマンドライン編
Bluemixコマンドライン(bluemixあるいは単にbx)での使い方を以下にまとめてみました。
以下の手順はMacOS 10.12.4, CLIは最新の0.5.4で実施したものになります。

>$bluemix --version
bluemix version 0.5.4+ae22935-2017-05-18T06:24:28+00:00

CLIの導入手順は以下のリンクを参照してください。

[参考] Bluemix CLI
http://clis.ng.bluemix.net/ui/home.html

## 1. Bluemixコマンドラインへのschematicsプラグイン導入
Bluemixコマンドライン・インターフェースにschematicsのプラグインを導入します。
>$bluemix plugin install schematics -r Bluemix
リポジトリー 'Bluemix' から 'schematics' を検索しています...
バイナリー・ファイルをダウンロードしようとしています...
:
OK
プラグイン 'schematics 1.0.0' は /Users/xxxx/.bluemix/plugins/schematics に正常にインストールされました。

プラグインが導入されたかはbluemix plugin listコマンドで確認することが可能です:

> $bluemix plugin list |grep schematics
schematics          1.0.0 

## 2. 環境(Environment)の作成
「bluemix login -a api.ng.bluemix.net」コマンドを実行し、Bluemix Infrastrutureと統合されて利用可能なアカウントで先にログインしておきます。

ログインした前提で、まずは環境の定義ファイル(json形式)を用意します。今回はenv.jsonとしてファイルを作成しました:

>{
&nbsp;&nbsp;"description": "これはサンプル環境なのです。",
&nbsp;&nbsp;"frozen": false,
&nbsp;&nbsp;"name": "サンプル環境",
&nbsp;&nbsp;"sourceurl": "https://git.ng.bluemix.net/mathezeus.code00z/IBMCloudSchematicsSample.git",
&nbsp;&nbsp;"tags": ["sample", "development"],
&nbsp;&nbsp;"terraformversion": "0.9.1",
&nbsp;&nbsp;"variablestore": [{
&nbsp;&nbsp;&nbsp;&nbsp;"name": "ibmid",
&nbsp;&nbsp;&nbsp;&nbsp;"secure": true,
&nbsp;&nbsp;&nbsp;&nbsp;"value": "<Your IBM ID>"
&nbsp;&nbsp;},
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;"name": "ibmidpw",
&nbsp;&nbsp;&nbsp;&nbsp;"secure": true,
&nbsp;&nbsp;&nbsp;&nbsp;"value": "<Your Password of IBM ID>"
&nbsp;&nbsp;},
&nbsp;&nbsp;{
&nbsp;&nbsp;:
&nbsp;&nbsp;}]
}

詳細は上述の「テンプレート・ファイルのサンプル・リポジトリー」に添付されているenv.jsonを確認してください。variablestoreキーに変数を設定する項目がJSONオブジェクトで記載されているので、BluemixアカウントのIBM IDを指定するなど、適宜値を編集します。

なお、「secure」フラグは環境作成後の編集および参照できるか否かを変数に対して設定するためのオプションです。「secure」フラグがtrueなら、環境作成後変数の値を参照することも変更することもできないようです。

env.jsonの編集が完了したら、「bluemix schematics environment creare」コマンドで環境を作成します:
>$bluemix schematics environment create --file env.json
>                       
Account             485a50bb0517157a6855ddb4dee8a788
Creation Time       Sun May 21 13:38:06
Description         これはサンプル環境なのです。
Frozen              false
ID                  <環境のUUID>
Name                サンプル環境
Owner               xxxx@gmail.com
Source URL          https://git.ng.bluemix.net/mathezeus.code00z/IBMCloudSchematicsSample.git
State file
Status              CREATED
Tags                [TAGS]
                    - sample
                    - development
Terraform Version   0.9.1
Variables Store     [VARIABLES]
                    - ibmid: ******** 
                    - ibmidpw: ********
                    - slaccountnum: ********
                    - datacenter: ********
                    - public_key: ********
                    - key_label: ********
                    - key_note: ********
                    - hostname: bmx-schematics-sample
                    - domain: example.com

作成が完了したら、「bluemix schematics environment list」コマンドで環境の一覧を確認し、問題なく作成されていることを確認します。

>$bluemix schematics environment list
Name           ID                                 Description                      Owner                         Status    Frozen
サンプル環境   <環境のUUID>   これはサンプル環境なのです?...   xxxx@gmail.com   CREATED   False
>              
OK

## 3. アクション(action)の計画(Plan)
次に、作成した環境で実際にインフラの構成タスクを実行する前にドライ・ラン、すなわちテンプレート・ファイルに問題がないかの妥当性確認を行います。「bluemix schematics action plan」コマンドでアクションの計画実行を行います:

>$bluemix schematics action plan --id <環境のUUID>
>        
table_activity_id   <アクション(計画)のUUID>  
>         
OK

実行結果は「bluemix schematics activity log」コマンドで確認します:

>$bluemix schematics activity log --id <アクション(計画)のUUID>
2017/05/21 13:54:41 Log File: /tmp/engine-log-991288142
2017/05/21 13:54:41 -----  New Request (processed by handler 80)  -----
2017/05/21 13:54:41 Requested Action: 
:
2017/05/21 13:54:46 <b>terraform plan | Plan: 2 to add, 0 to change, 0 to destroy</b>.
2017/05/21 13:54:46 Finished: terraform plan -input=false -refresh=true -no-color -out=execution-plan -state=terraform.tfstate -var-file=schematics.tfvars
>
OK

「terraform plan | Plan: X to add, 0 to change, 0 to destroy」のような表示が出力されていれば、問題なく実行できることが確認できます。

## 3. アクション(action)の適用(Apply)
アクションの計画が問題なく完了したら、「bluemix schematics action apply」コマンドで実際にインフラ・タスクを実行します。

>$bluemix schematics action apply --id <環境のUUID>
Do you really want to perform this action [y/N]?> y
>
table_activity_id   <アクション(適用)のUUID>  
>
OK

実行結果はアクションの計画と同様に「bluemix schematics activity log」コマンドで確認します:

>$bluemix schematics activity log --id <アクション(適用)のUUID>
2017/05/21 13:56:40 Log File: /tmp/engine-log-571881295
2017/05/21 13:56:40 -----  New Request (processed by handler 81)  -----
2017/05/21 13:56:40 Requested Action:
:
2017/05/21 14:01:38 <b>terraform apply | Apply complete! Resources: 2 added, 0 changed, 0 destroyed.</b>
:
2017/05/21 14:01:38 terraform apply | Outputs:
2017/05/21 14:01:38 terraform apply | 
2017/05/21 14:01:38 terraform apply | ipv4_address = 161.xxx.xxx.xxx
2017/05/21 14:01:38 terraform apply | ipv4_address_private = 10.xxx.xxx.xxx
2017/05/21 14:01:38 terraform apply | ssh_key_id = 885391
2017/05/21 14:01:38 Finished: terraform apply -no-color -state=terraform.tfstate -var-file=schematics.tfvars

「terraform apply | Apply complete! Resources: X added, 0 changed, 0 destroyed.」のような表示が出力されていれば、問題なく実行できることが確認できます。また、このサンプルでは作成した仮想サーバーのIPアドレス(Public/Private)がOutputs欄に出力されるようにしています。

実際に、Bluemix Infrastrutureのコンソール画面にログインし、デバイスの一覧を見てみると、、、
![図8.png](https://qiita-image-store.s3.amazonaws.com/0/101771/8b335a3f-7d20-08fc-1c44-0f4cac52565a.png)

<img width="1153" alt="スクリーンショット 2017-05-21 23.16.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/e62f8abe-0d16-af5c-0fe5-d187572549c5.png">
はい、できてますね。SSHキーも左上のハンバーガー・メニューの[Devices]>[Manage]>[SSH Keys]を見てみると、、、
<img width="1282" alt="スクリーンショット 2017-05-21 23.18.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/1c8dd2fe-80ac-a8c5-1da8-16b1fdedf511.png">
はい、こちらもできています。そして、登録したSSHキーの対をなすプライベート・キー(以下の例ではid_rsa_bmx_tfという名前で用意しています)で仮想サーバーにSSHログインしてみると・・・

>$ssh -i ~/.ssh/id_rsa_bmx_tf root@161.xxx.xxx.xxx
The authenticity of host '161.xxx.xxx.xxx (161.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:Bn597f8unpsNddgMqpj+p/qo3wMBoYFGbbdlIFnGhPo.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '161.xxx.xxx.xxx' (ECDSA) to the list of known hosts.
>
[root@bmx-schematics-sample ~]# hostname -f
bmx-schematics-sample.example.com

はい、SSHログインもできました。

# 使い方 - Bluemixコンソール編
先の手順はBluemixコマンドを利用した手順ですが、今度はWebブラウザーのみでのセットアップ手順を説明します。Bluemix Platform側に操作コンソールがあるのがちょっと不思議です。

## 1. Schematics画面の表示
Bluemix Platform側のコンソール画面で、左上のハンバーガー・メニューをクリックします。そして、[サービス(Services)]を選択し、サブ・カテゴリーとして「Schematics」を選択します:
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/101771/32b23bc6-5e2c-4f92-5b92-68fac3a6f5b1.png)

画面が切り替わると、以下のような管理画面が表示されます。このまま画面左上にある「Environments」をクリックします:
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/101771/c65e2875-7589-2259-98aa-f0dc4ed6d0cb.png)

## 2. 環境(Environment)の作成
環境(Environment)の管理タブに切り替わったら、右上の「Create an Environments」をクリックします:
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/101771/3d1c0f3e-3681-ac32-8191-2baa44051d24.png)

作成フォームに環境の設定を入力していきます。基本的には上述したenv.jsonと指定しているものと同じです。
<img width="1284" alt="スクリーンショット 2017-05-21 18.09.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/9032d44e-fd2c-a691-a47a-843be62bb445.png">
環境変数(Variables)の欄で、変数を追加・設定します。Secure属性は右側の南京錠マークをクリックすればON/OFF可能です。
<img width="553" alt="スクリーンショット 2017-05-21 18.09.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/62e72ad2-7a0b-2120-3a24-f95328029430.png">

入力後、「Create」をクリックすれば、セットアップが始まります。しばらく待つと環境が作成されます。

## 3. アクションの計画(Plan)
アクションの計画は環境の詳細画面で「Plan」をクリックします。
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/101771/e01c2beb-7b20-c7bb-3696-2c53522dbf3e.png)

問題がなければ、以下の図のように緑色の正常メッセージが出力されます。
<img width="347" alt="スクリーンショット 2017-05-21 18.13.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/0c0934be-b592-82aa-8e45-17e1be751bd2.png">

「Refresh」をクリックすると、アクションの実行状態の更新が行えます。

## 4. アクションの適用(Apply)
引き続いて「Apply」をクリックします。問題がなければ今度はApplyに対する緑色の正常メッセージが出力されるはずです。

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/101771/3691ef0d-174f-42a1-a5ac-1e16fdbe3013.png)

しばらく待ってから、「Apply」に対する「View Log」をみて、エラーがないことを確認します。もし、「View Log」ボタンが表示されない場合は「Refresh」をクリックして更新してください。
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/101771/c421ceaa-d3d5-2b42-b949-6f4c7afeea6e.png)

以上で、Bluemixコマンドラインで実行したTerraformのアクションをWebブラウザーのみで実行できました!!

# 最後に
いつもながらに長文ですが、IBM Cloud Schematicsについて、最低限の操作をまとめてみました。未だベータではあること、今回のサンプルはシンプルだったので、実際にどこまでInfrastractureのセットアップを自動化できるかは今後も試してみたいかなと思っています。

あとは、IBM Cloud SchematicsってこれまでのSoftLayerのAPIでの自動化と比べて何が長所/短所なのかも整理しないといけないかなと思っています。きめ細かく設定していきたいならAPI, シンプルに自動化をセットアップしたいならIBM Cloud Schematicsって住み分けになっていくとは思っていますが、今後も要チェックですね。

以上です。