hello-world
webエンジニアのメモ。とりあえずやってみる。

[chef]jsonlintコマンドを使ってrolesとnodesのjsonをチェックするスクリプトを書いた

公開日時

chefでcookした後に、rolesやnodesのjsonのカンマが抜けていてエラーになってしまうのが悲しいので、事前にチェックしたいと思いました。

探せば便利なコマンドがありそうな気がするのですが、うまく見つけられなかったのでシェルスクリプトで書いてみました。

事前に

npm install jsonlint -g

で jsonlint コマンドをインストールしておく必要があります

  • 以下を「jsonlint_chef」としてchefディレクトリに追加
#!/bin/sh

# before install: npm install jsonlint -g

DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)

CHECK_DIRS=("$DIR/roles/*.json" "$DIR/nodes/*.json")

function check_dirs {
  for dir in ${CHECK_DIRS[@]}
  do
    check_jsons ${dir}
  done
}

function check_jsons {
  for filepath in $1
  do
    echo ${filepath}
    jsonlint -q ${filepath}
  done
}

check_dirs
  • 実行権限付与
chmod 755 jsonlint_chef
  • 試してみる
./jsonlint_chef

# 各ファイルのチェックが走る
/Users/chef/roles/base.json
/Users/chef/nodes/sample_stg.json
[Error: Parse error on line 69:
...stg"]    }  }  "run_list": [    "r
--------------------^
Expecting 'EOF', '}', ',', ']', got 'STRING']

nodes/sample_stg.jsonで「,」が抜けているというのが表示されています。

何行目でエラーなのかが表示されるので該当ファイルを開いて修正。

これでcookの前に事前チェックしておけばいきなりjsonエラーでこける問題を回避できます。

もっといい方法ありそうですが、とりあえずはこんな感じです。

参考


Related #Chef

[chef]vagrant上の仮想マシンの場合のみ特定の処理を実行したい

aws上のAmazonLinuxとvagrant上のCentOS両方で使えるレシピを作成しようとした際に、vagrant上の仮想マシンのみ特定の処理を実行したいと思い調べてみました。

nginx1.4.1をchefでソースからインストールしてみる(websocket proxy)

以前、Vagrant上にNode.jsの環境構築を行いましたが、nginx1.3からwebsocketのproxyが可能になったとのことなので、最新の安定版であるnginx1.4.1をchefでインストールして、websocketのproxyができるまでを確認してみました。

[Mac]『入門Chef Solo』を読んで試してみた

伊藤直也さんの『 入門Chef Solo』を読んで、実際にVagrantを使って試してみた。

chefでruby-shadowのエラーが発生した場合の対処法

ユーザアカウント追加のレシピを適用した際にruby-shadowの部分で以下のようなエラーが発生しました。