こちらのツールの紹介になります
最近あまり名前を聞かなくなりましたが、OpenStackのような仮想マシンの自動アロケーション機能もない環境で、ExcelでKVMホストのCPU,メモリ,ディスクのリソース管理表を使ってキャパシティ管理していたことがありました(今も本当はやらないといけないんですけど、面倒くさくてやってません)
「管理表ちゃんと更新してください」と何度か言われましたが、どうしても嫌だったのでAnsibleの Dynamic Inventory
を使って仮想マシンの自動アロケーション機能を作りました
- KVMホストにログインしCPU,メモリ,ディスクの空き容量を取得し
host_vars
に登録する - 作成したい仮想マシンスペックのリストを
vars
で指定してplaybookを実行 - KVMホストのリソースの空き状況をみて、仮想マシンに割り当てられるリソースがあれば、ホストに仮想マシンを作る
これ自体は、うまく機能したのですが Dynamic Inventory
の仕様に合わせてJSONを生成するのが、結構ハードル高かったので(Bashでやるから……)自分なりにもっとシンプルな方法で実現できるようにこちらのツールを作りました
Dynamic.js
const Tutrial = class extends Submarine {
query(files){
return {
availables: String.raw`
df -P \
|awk '{print $4}' \
|grep "^[0-9]*$"
`
};
}
format(stats){
return {
available_max: Array.isArray(stats.availables)
? stats.availables.map(
available => available * 1
).sort((a ,b)=>{
return a < b
? -1
: a == b
? 0
: 1;
}).reverse()[0]
: stats.availables * 1
};
}
}
const Tutrials = Submarine.collect(
host => new Tutrial({
conn: 'ssh',
host: host
}),
{
coll: 'echo',
str: 'server{1..5}'
},
{
coll: 'ping'
}
);
const tut = new Tutrials();
tut.current().then(
hosts => hosts.map(
host => host.available_max
).reduce((a, b)=>{
return a + b;
}) / 1024 / 1024
).then((available_sum)=>{
console.log(available_sum);
});
このコードは何をやっているかと言うと、各サーバからdf
コマンドで取得したディスクの空き容量を足し合わせています
以下の部分で対象ホストを動的に生成しています
Dynamic.js
...
const Tutrials = Submarine.collect(
host => new Tutrial({
conn: 'ssh',
host: host
}),
{
coll: 'echo',
str: 'server{1..5}'
},
{
coll: 'ping'
}
);
...
-
echo
コマンドの出力結果を対象ホストのリストとして
{
coll: 'echo',
str: 'server{1..5}'
}
- そのうち
ping
コマンドの応答があるものを対象ホストとする
{
conn: 'ping',
}
他にもbash
コマンドの出力結果をそのまま対象ホストとしたりssh
してhostname
コマンドで取得したホスト名のうち、正規表現にマッチするものだけを対象ホストにすることもできます
bash
コマンドがあればaws
コマンドとjq
コマンドでEC2
のリストを生成したり/etc/hosts
をgrep
した結果をそのまま使ったりできるので、大体の要件は満たせるはず