LoginSignup
1
1

More than 3 years have passed since last update.

AnsibleのDynamic Inventoryが使いづらいのでNode.jsとShellでできるようにした

Posted at

こちらのツールの紹介になります

最近あまり名前を聞かなくなりましたが、OpenStackのような仮想マシンの自動アロケーション機能もない環境で、ExcelでKVMホストのCPU,メモリ,ディスクのリソース管理表を使ってキャパシティ管理していたことがありました(今も本当はやらないといけないんですけど、面倒くさくてやってません)

「管理表ちゃんと更新してください」と何度か言われましたが、どうしても嫌だったのでAnsibleの Dynamic Inventory を使って仮想マシンの自動アロケーション機能を作りました

  1. KVMホストにログインしCPU,メモリ,ディスクの空き容量を取得しhost_varsに登録する
  2. 作成したい仮想マシンスペックのリストをvarsで指定してplaybookを実行
  3. 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'
  }
);
...
  1. echo コマンドの出力結果を対象ホストのリストとして
{
  coll: 'echo',
  str: 'server{1..5}'
}
  1. そのうちpingコマンドの応答があるものを対象ホストとする
{
  conn: 'ping',
}

他にもbashコマンドの出力結果をそのまま対象ホストとしたりsshしてhostnameコマンドで取得したホスト名のうち、正規表現にマッチするものだけを対象ホストにすることもできます

全パターン

bashコマンドがあればawsコマンドとjqコマンドでEC2のリストを生成したり/etc/hostsgrepした結果をそのまま使ったりできるので、大体の要件は満たせるはず

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1