web-dev-qa-db-ja.com

ansiblejson-コンテンツでアイテムを選択するためのクエリパス

以下のサンプルJSONでティガーの食べ物を選択するために使用できるjson-queryフィルターを知っている人はいますか? JSONは、大規模で比較的複雑なAWSBLOBの簡略化された代用です。

いくつかの背景:Ansibleにjson-queryフィルターがあることを発見してかなり嬉しかったです。 AWS JSON BLOBから要素を選択しようとしていたことを考えると、これはまさに必要なものであるかのように見えました。しかし、AWSオブジェクトにはタグがあり、タグでアイテムを選択する必要があったため、すぐに問題が発生しました。

Foods[Tags[(Key='For') & (Value='Tigger')]]などと同等のセレクターパスを試しましたが、うまく機能しませんでした。 https://www.npmjs.com/package/json-query などのスタンドアロンのjson-queryライブラリを使用するparent属性を使用できますが、 json-queryのコアアイデアからの逸脱であることは別として、Ansible。

問題を回避し、jsonpathセレクターを使用する方がよい場合があります。 jsonpathはjson-queryに似ており、xpathからの翻訳です。

{ "Foods" :
  [ { "Id": 456
    , "Tags":
      [ {"Key":"For", "Value":"Heffalump"}
      , {"Key":"Purpose", "Value":"Food"}
      ]
    }
  , { "Id": 678
    , "Tags":
      [ {"Key":"For", "Value":"Tigger"}
      , {"Key":"Purpose", "Value":"Food"}
      ]
    }
  , { "Id": 911
    , "Tags":
      [ {"Key":"For", "Value":"Roo"}
      , {"Key":"Purpose", "Value":"Food"}
      ]
    }
  ]
}

参考文献

5
Max Murphy

IDのリストが必要ですか?もしそうなら、試してみてください:

- debug: msg="{{ lookup('file','test.json') | from_json | json_query(query) }}"
  vars:
    query: "Foods[].{id: Id, for: (Tags[?Key=='For'].Value)[0]} | [?for=='Tigger'].id"

最初に必要なフィールドを持つ単純なオブジェクトを作成し、次にそれをフィルターにパイプします。

17