課題
運用チームがメインで管理している構成管理データベースだが、セキュリティ調査や商用環境の状態確認ということで開発や営業から情報を聞かれることがよくある。
その度に運用側で情報を確認して伝達するというフローが発生し、非常にボトルネックとなっていた。
しかし、自社サービスは諸事情でオンプレ稼働しており、簡単にサーバ情報を外に出すことができない。
営業・開発・運用のどのチームでも見られることができるスマートなプラットフォームが無いだろうか。。。
と思っていたら、New Relicにそれっぽい機能があった。
New Relicの構成管理機能とその問題
New Relicにはどのミドルウェアがどのサーバで使われているかが一目瞭然となる機能がInfrastructureにある。
↓こんな感じで
これをダッシュボードに載せればと思ったが、NRQLで引くことがなんと不可能であった。Graphqlを通して無理やりダッシュボードに載せても閲覧することができなかった。
チームメンバ全員にFull userアカウントを買うのは非現実的すぎるし、この機能のためだけにというのはあまりに無駄である。
こうなったらもはやゴリ押しするしかない! ということで、New Relic-Flexを使用して情報を収集する。
New Relic-Flexで構成情報収集
New Relic-Flexの仕様
New Relic-Flexについては、こちら を参照
要約すると、「コマンドの実行結果をNew Relicに転送して任意のDBテーブルとして保存する」という機能である。データカラムを定義してコマンドの出力結果を区切り文字で区切ることで、カラムに対応するデータとして保存する。
この機能を利用するにあたって壁となったのは、「コマンドの出力結果は行単位でデータとして保存される」という仕様。コマンドの出力結果が複数行に分かれると1行ごとに別データとして保存されてしまう。
例えば、Apache_versionというカラムを定義してhttpd -v
の結果を収集しようとすると
Server version: Apache/2.4.37 (centos)
Server built: Jun 8 2020 20:14:33
これは、
Timestamp | Apache_version |
---|---|
2022-12-11 HH:MM:ss | Server version: Apache/2.4.37 (centos) |
2022-12-11 HH:MM:ss | Server built: Jun 8 2020 20:14:33 |
このように別のイベントデータとして収集されてしまう。そのため、複数行のデータを1行にまとめる必要があり、ここが一番苦戦した。
ゴリ押し構成情報出力シェル
結論として、以下のようにxargsとechoを利用して1行にまとめつつ改行コードを文字列化するというあまりにゴリ押しの実装を行った。
httpd -v | xargs -I{} echo -n {}\\r\\n; echo -ne "\t"
これを実行すると
Server version: Apache/2.4.37 (centos)\r\nServer built: Jun 8 2020 20:14:33
というように改行が改行コードの文字列に変換され、末尾にタブを追加した文字列が出力される。
さらにechoのnオプションで末尾は改行されないので、
#!/bin/bash
httpd -v | xargs -I{} echo -n {}\\r\\n; echo -ne "\t"
openssl version | xargs -I{} echo -n {}\\r\\n; echo -ne "\t"
というようにxargsとechoを追加したコマンドを並べたシェルを実行すると、
Server version: Apache/2.4.37 (centos)\r\nServer built: Jun 8 2020 20:14:33[タブ]OpenSSL 1.1.1f 31 Mar 2020\r\n[タブ]
という1行でタブ区切りのコマンド結果が出力できる。
あとは、integration.d配下に以下を記載したymlを置いて、
integrations:
- name: nri-flex
interval: 21600s
timeout: 900s
config:
name: collectCMDB_Integration
apis:
- name: middleware
commands:
- run: 'sh [構成情報収集シェルのパス]'
split: horizontal
split_by: \t
timeout: 60000
set_header: [Apache_version,OpenSSL_version]
先ほどのシェルをInfraエージェントに実行させると、New Relicにmiddlewaresampleという以下のようなテーブルが作成される。
Timestamp | Apache_version | OpenSSL_version |
---|---|---|
2022-12-11 HH:MM:ss | Server version: Apache/2.4.37 (centos)\r\nServer built: Jun 8 2020 20:14:33 | OpenSSL 1.1.1f 31 Mar 2020\r\n |
他の構成情報もまとめたければ、シェルに好きなコードを書いて同様のパイプを噛ませることで自由に構成情報を収集できる。
まとめ
必要な情報をgrepして1行ごとに情報を出力すればいいのではと思うかもしれないが、10行程度の出力全てが必要な構成情報というパターンもあり得る。
New Relicデータベース上に記録される文字列としては1行にまとめられているせいで改行コードなどが不細工だが、GASでGraphqlを叩いてスプレッドシートに成形するなどすれば、見栄えはどうとでもなる。
New Relic使用中でかつオンプレなどで構成情報収集が面倒だという方は参考にしていただけると。