CMDBuildをコンテナで簡単起動～APIで構成情報を自動収集

CMDBuildは、OSSの構成管理ツールです。
ITシステムにおける各種構成要素の情報管理が可能です。詳しくはOSSラボさんの紹介資料とかご参考ください。

参考) https://www.slideshare.net/sfunai/cmdbuild


今回は、CMDBuildをDockerコンテナで簡単起動して、API経由でCMDBuildで管理されている情報を取り出すところまで実施。

# CMDBuildのコンテナとDB(PostgreSQL)のコンテナをdocker-composeで一発起動

CMDBuildは構成情報をDB保存することになるので、CMDBuildのコンテナイメージとDB(PostgreSQL)のコンテナイメージが必要となります。

docker-compose.ymlの定義だと以下のようになります。

```yml:docker-compose.yml
version: "3"
services:
  cmdbuild:
    image: quentinv/cmdbuild:latest
    container_name: cmdbuild
    ports:
      - 28080:8080
    networks:
      - cmdbuild-net
  cmdbuild-db:
    image: postgres:9.6.8-alpine
    container_name: cmdbuild-db
    environment:
      POSTGRES_PASSWORD: cmdbuild
    networks:
      - cmdbuild-net
networks:
  cmdbuild-net:
    driver: bridge
```

このファイルを作成し、docker環境上でdocker-compose upを実行。
すると2コンテナ稼働。

```shell-session
$ docker-compose up -d
$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                         PORTS                     NAMES
49feb8a8a4a3        quentinv/cmdbuild:latest   "catalina.sh run"        36 minutes ago      Up 36 minutes                  0.0.0.0:28080->8080/tcp   cmdbuild
41559aa86e40        postgres:9.6.8-alpine      "docker-entrypoint..."   36 minutes ago      Up 36 minutes                  0.0.0.0:32768->5432/tcp   cmdbuild-db
```

# CMDBuildの初期設定

あとは、管理画面上からの設定でOK。
上記のymlで起動した場合、「http\://dockerホスト名:28080/」にアクセス。

初期設定を実施。

まずは言語選択

![cmdbuild_1.png](https://qiita-image-store.s3.amazonaws.com/0/45851/694581c7-b48f-f846-b48f-9f7d4ab07961.png)

データベースの設定
![cmdbuild_2.png](https://qiita-image-store.s3.amazonaws.com/0/45851/f2cc85c8-b97e-5811-eb1d-6a80de90fd73.png)

初期ユーザの登録
![cmdbuild_3.png](https://qiita-image-store.s3.amazonaws.com/0/45851/a2247a85-397b-cb2c-afbc-bcf16e364a49.png)

これで完了。あとは上記で作成した初期ユーザでログインすれば利用できる状態に。


# 構成管理の基本情報を登録

ここまでの手順を実施した段階ではまだ中身のデータが空っぽの状態です。
そのため、まずは構成管理の基礎となるクラス情報等の登録が必要となります。
なお、最初から必要な情報を登録した状態で使える[Ready2use](http://www.cmdbuild.org/en/prodotti/ready2use)というものも提供されているので、手間を省きたい場合はそちらの利用を検討されると良いかと思います。(Subscription型での提供だと思います。)

## クラス登録

Configuration Itemに含まれる区分けをクラスとして定義します。
クラスは例えば以下のような感じで定義します。

* Location(環境の場所情報管理用)
* Infrastructure(インフラ情報管理用)
    * Server (サーバ情報管理用)
    * Storage (ストレージ情報管理用)
    * Rack (ラック情報管理用)
    * Network Device (ネットワーク機器情報管理用)
* Software instance (ソフトウェア情報管理用)
    * Database (データベースSW情報管理用)
    * Application (アプリケーションSW情報管理用)　　等々

登録はCMDBuildの管理画面から行います。

ログイン後、**「アドミニストレーションモジュール」**から登録作業を行います。

![cmdbuild_4.png](https://qiita-image-store.s3.amazonaws.com/0/45851/9c65b200-a36c-0545-e9e3-7b8c57769b6c.png)

![cmdbuild_5.png](https://qiita-image-store.s3.amazonaws.com/0/45851/a8e0bf05-bc48-a2f5-16d1-efaa7c3b36a5.png)

クラス作成するだけではクラスの中の属性項目がCode(クラスオブジェクトの識別文字列)とDescription(オブジェクトの概要)の2項目のみなので、クラスの「アクティビティ」から属性値を追加します。

![cmdbuild_6.png](https://qiita-image-store.s3.amazonaws.com/0/45851/e36079bf-7397-ab44-95c3-2b321386c406.png)

あとは、クラス間に関連性を持たせて管理するケースもあるのでリレーションの定義を行います。「ドメイン」から登録です。
以下の図では、LocationとInfrastructure間に1:Nの関係性を定義しています。

![cmdbuild_7.png](https://qiita-image-store.s3.amazonaws.com/0/45851/1f65da4b-e4d7-4964-37be-4e3991cf26eb.png)

## データ登録

ここまでくればあとは、実際の構成管理データを登録します。
データの登録は***「データ管理モジュール」***から実施です。
Locationとして「東京第1」といったデータを登録しています。

![cmdbuild_10.png](https://qiita-image-store.s3.amazonaws.com/0/45851/dbfe63c1-f6e7-f41f-11ac-a8d75c3ab6c5.png)

次に、Infrastructureとして「System1のインフラ」という情報を登録し、「東京第1」に対してリレーションを設定しています。
![cmdbuild_11.png](https://qiita-image-store.s3.amazonaws.com/0/45851/ae57e31e-a395-881a-ae29-e49958edbefb.png)
![cmdbuild_12.png](https://qiita-image-store.s3.amazonaws.com/0/45851/3de0b106-6754-e7b0-5d21-ef0f05327787.png)

すると、こんな感じで関連性を持った状態で構成管理されます。

![cmdbuild_13.png](https://qiita-image-store.s3.amazonaws.com/0/45851/75250b84-7344-a16a-0790-1e7a5dacd965.png)

こういった要領で構成管理情報を登録・更新して管理していきます。

# APIで構成管理情報を取り出し

最後に、構成情報をAPIで取り出す方法をまとめておきます。
CMDBuildにはREST API、SOAP APIの2種類のWeb APIが実装されています。
詳しくは[こちら(pdf)](http://www.cmdbuild.org/file/manuali/webservice-manual-in-english)を参照してください。
今回はREST API経由で先程登録したカード情報をピックアップしてみます。

## ログイン(POST)

まずは、各種メソッドの実行のためにはログインしてトークン情報を発行しておく必要があります。

```shell-session
$ curl -X POST "http://CMDBuildホスト名:ポート/services/rest/v2/sessions/" -H "Content-Type: application/json" -s -d '{"username": "ユーザ名", "password": "パスワード"}'
```

```json
{"data":
  {
    "username":"admin",
    "role":"SuperUser",
    "availableRoles":["SuperUser"],
    "_id":"9ba.......e3256"
  }
}
```
_idという部分が認証トークンです。以降の処理はこのトークン情報をリクエストのヘッダーに設定して送信することでAPI処理可能となります。

## クラスリストの取得(GET)

先程登録したクラスのリストを取得します。

```shell-session
$ curl -X GET "http://CMDBuildホスト名:ポート/services/rest/v2/classes/" -s -H "Content-Type: application/json" -H "CMDBuild-Authorization: 9ba.......e3256"
```

```json
{"data":
  [
    {
      "name":"Application",
      "description":"Application",
      "parent":"Class",
      "prototype":false,
      "_id":"Application"
    },
    {
      "name":"Class",
      "description":"Class",
      "parent":null,
      "prototype":true,
      "_id":"Class"
    },
    {
      "name":"Database",
      "description":"Database",
      "parent":"Class",
      "prototype":false,
      "_id":"Database"
    },
    {
      "name":"Infrastructure",
      "description":"Infrastructure",
      "parent":"Class",
      "prototype":false,
      "_id":"Infrastructure"
    },
    {
      "name":"Location",
      "description":"Location",
      "parent":"Class",
      "prototype":false,
      "_id":"Location"
    },
    ・・略
  ],
  "meta":{
    "total":10,
    "positions":{},
    "references":{}
  }
}
```

## Locationクラスのカード情報を取得(GET)

```shell-session
$ curl -X GET "http://CMDBuildホスト名:ポート/services/rest/v2/classes/Location/cards/" -s -H "Content-Type: application/json" -H "CMDBuild-Authorization: 9ba.......e3256"
```

```json
{"data":
  [
    {
      "_type":"Location",
      "Description":"東京第1",
      "_id":24,
      "Code":"tokyo-001",
      "Notes":null
    }
  ],
  "meta":{
    "total":1,
    "positions":{},
    "references":{}
  }
}
```

## Locationクラスのカードを追加(POST)

```shell-session
$ curl -X POST "http://CMDBuildホスト名:ポート/services/rest/v2/classes/Location/cards/" -H "Content-Type: application/json" -H "CMDBuild-Authorization: 9ba.......e3256" -s -d '{"Code":"osaka-001", "Description": "Osaka1"}'
{"data":34}
```

# まとめ
触りの部分だけではありますが、簡単につかえるイメージはもっていただけなのではないでしょうか。
Ready2useを使えば[こちらのスライド](https://www.slideshare.net/sfunai/cmdbuild-ready2use)にもある通り非常にいろんなことできそうです。