kidoOooOoooOOom

IT系で開発やってます

node.jsで objectをyamlで出力

node.js で形成した objectを yamlフォーマットで出力したいケースがあったのでメモ。
やりたいこととしては、ansibleのinventoryに記載したhosts情報を元に、tmuxinatorの設定ファイル(yaml)を自動生成すること。
yaml出力には js-yaml モジュールを使えば簡単。

var yaml = require('js-yaml');
var fs = require('fs');
var ini = require('ini');
var _ = require('lodash');
var hosts = ini.parse(fs.readFileSync('./data/config.ini', 'utf-8'));

var dump = {
  name: 'hoge-dev',
  root: '~/',
  windows: [
    {
      web: {
        layout: "main-vertical",
        panes: []
      }
    },
    {
      db: {
        layout: "main-vertical",
        panes: []
      }
    }
  ]
};

_.each(_.keys(hosts.webservers), function(host) {
  var sshCommand = 'ssh $SSH_USERNAME@' + host;
  dump.windows[0].web.panes.push(sshCommand);
  dump.windows[0].web.panes.push(sshCommand + ' -t tailf /var/log/hoge/error.log');
});

_.each(_.keys(hosts.dbservers), function(host) {
  var sshCommand = 'ssh $SSH_USERNAME@' + host;
  dump.windows[1].db.panes.push(sshCommand);
  dump.windows[1].db.panes.push(sshCommand + ' -t tailf /var/log/db/db.log');
});

console.log(yaml.safeDump(dump));

最後の、yaml.safeDump() で objectをyamlに変換している。
出力結果は下記の通り。

name: hoge-dev
root: ~/
windows:
  - web:
      layout: main-vertical
      panes:
        - "ssh $SSH_USERNAME@foo.example.com"
        - "ssh $SSH_USERNAME@foo.example.com -t tailf /var/log/hoge/error.log"
        - "ssh $SSH_USERNAME@bar.example.com"
        - "ssh $SSH_USERNAME@bar.example.com -t tailf /var/log/hoge/error.log"
  - db:
      layout: main-vertical
      panes:
        - "ssh $SSH_USERNAME@one.example.com"
        - "ssh $SSH_USERNAME@one.example.com -t tailf /var/log/db/db.log"
        - "ssh $SSH_USERNAME@two.example.com"
        - "ssh $SSH_USERNAME@two.example.com -t tailf /var/log/db/db.log"
        - "ssh $SSH_USERNAME@three.example.com"
        - "ssh $SSH_USERNAME@three.example.com -t tailf /var/log/db/db.log"

サーバサイドJavaScript Node.js入門 (アスキー書籍)

サーバサイドJavaScript Node.js入門 (アスキー書籍)