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\""
      }
    ]
    

    参考

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark