AMIMOTO AMIでJSON生成ツール”jo”を使用して、EC2 Systems ManagerのInventory Managerを使ってみる
個人的にトライしていることで、コマンドラインからJSONを生成する必要が出てきたので入れてみました。 参考記事 https://dev.classmethod.jp/tool/jo-installed-amazon-li […]
広告ここから
広告ここまで
目次
個人的にトライしていることで、コマンドラインからJSONを生成する必要が出てきたので入れてみました。
参考記事
https://dev.classmethod.jp/tool/jo-installed-amazon-linux-ec2-and-readed-manual-document/
AMIMOTO AMIの場合のインストールコマンド
AMIMOTO AMIではGitなどのコマンドがインストール済ですので、Amazon Linuxを利用した場合より手順が少なくなります。
[ec2-user@ip-172-30-1-95 jo]$ cd /tmp/ [ec2-user@ip-172-30-1-95 jo]$ git clone git://github.com/jpmens/jo.git [ec2-user@ip-172-30-1-95 jo]$ cd jo [ec2-user@ip-172-30-1-95 jo]$ autoreconf -i configure.ac:19: installing 'build-aux/install-sh' configure.ac:19: installing 'build-aux/missing' Makefile.am: installing 'build-aux/depcomp' [ec2-user@ip-172-30-1-95 jo]$ ./configure [ec2-user@ip-172-30-1-95 jo]$ make check [ec2-user@ip-172-30-1-95 jo]$ sudo make install make[1]: ディレクトリ `/tmp/jo' に入ります /bin/mkdir -p '/usr/local/bin' /usr/bin/install -c jo '/usr/local/bin' /bin/mkdir -p '/usr/local/share/man/man1' /usr/bin/install -c -m 644 jo.1 '/usr/local/share/man/man1' make[1]: ディレクトリ `/tmp/jo' から出ます [ec2-user@ip-172-30-1-95 jo]$ jo -v jo 1.0
joでJSONを作ってみる
key=value形式で引数を渡すと簡単にJSON化してくれます。
$ jo test=1234 sample=hoge
{"test":1234,"sample":"hoge"}
コマンド実行結果も代入可能です。
$ jo a=122 hoge=bbb wp=`wp core version --path=/var/www/vhosts/i-0a441b6f3a8dfa5dd/` | jq .
{
"a": 122,
"hoge": "bbb",
"wp": "4.7.2"
}
お行儀の良い書き方ではない気もしますが、-aオプションを組み合わせるとネストしたJSONも作れそうです。
$ jo -a $(jo a=b) $(jo b=c) | jq .
[
{
"a": "b"
},
{
"b": "c"
}
]
頑張ればEC2 Systems ManagerのInventory ManagerへのリクエストJSONなんかも作れます。
$ INSTANCEID=`/usr/bin/curl -s https://169.254.169.254/latest/meta-data/instance-id`
$ ITEMS=$(jo -a \
$(jo CaptureTime=$(date +%Y-%m-%dT%H:%M:%SZ) \
TypeName=Custom:SampleInvent \
Content=$(jo -a $(jo hoge=fuga)) \
SchemaVersion=\"1.0\") | sed 's/\\"//g')
$ aws ssm put-inventory --instance-id "${INSTANCEID}" --items "`echo ${ITEMS}`"
$ aws ssm list-inventory-entries --instance-id ${INSTANCEID} --type-name Custom:SampleInvent | jq .
{
"InstanceId": "i-0a441b6f3a8dfa5dd",
"TypeName": "Custom:SampleInvent",
"Entries": [
{
"hoge": "fuga"
}
],
"SchemaVersion": "1.0",
"CaptureTime": "2017-03-06T01:19:56Z"
}
Amazon Linuxだけなのかそういう仕様なのかまでちょっと調べれてないのですが、「1.0」という値を文字列として渡すところでちょっとハマったため、エスケープかけたのちにsedで除去しています。
sedするまえの値はこんな感じです。
$ jo -a $(jo CaptureTime=$(date +%Y-%m-%dT%H:%M:%SZ) TypeName=Custom:SampleInvent Content=$(jo -a $(jo hoge=fuga)) SchemaVersion=\"1.0\") | jq .
[
{
"CaptureTime": "2017-03-06T01:15:32Z",
"TypeName": "Custom:SampleInvent",
"Content": [
{
"hoge": "fuga"
}
],
"SchemaVersion": "\"1.0\""
}
]