[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エラーでこける問題を回避できます。
もっといい方法ありそうですが、とりあえずはこんな感じです。