web-dev-qa-db-ja.com

ansibleのjsonのような変数の読み取り

私はansibleが初めてであり、ansibleロールのjsonファイルから値を読み取るのに問題があります。私の変数には次のような値があります:

{
  "queue": {
    "first": {
      "car": "bmw",
      "year": "1990",
      "model": "x3",
      "color": "blue"
    },
    "second": {
      "car": "bmw",
      "year": "2000",
      "model": "318",
      "color": "red"
    }
  }
}

他の変数と比較するためだけに色の値を印刷しようとしています。 with_dictを使用して、jsonオブジェクト(jsonVarという変数に格納されている)を次のように繰り返します。

- name: test loop
  with_dict: "{{jsonVar}}"
  Shell:  |
        if echo "blue" | grep -q "${{item.value.color}}" ; then
           echo "success"

これまでのところ、ifステートメントからjsonから「blue」への色の値の比較を取得することはできません。私は何か間違ったことをしているのだろうかと思っていましたか?前もって感謝します!

14
tkyass

fileというルックアッププラグインを使用してjsonファイルを読み取り、from_json jinja2フィルターに渡すことができます。 jsonVarだけでなくwith_dictをループする必要があるため、jsonVar['queue']ループにも誤りがありました。動作する完全なコードは次のとおりです。

---
- hosts: your_Host
  vars:
    jsonVar: "{{ lookup('file', 'var.json') | from_json }}"
  tasks:
    - name: test loop
      with_dict: "{{ jsonVar['queue'] }}"
      Shell: |
        if echo "blue" | grep -q "{{ item.value.color }}" ; then
            echo "success"
        fi
13

|を使用できますjson_queryフィルター。

http://docs.ansible.com/ansible/playbooks_filters.html#json-query-filter

ただし、入力するファイルも適切な形式であることを確認してください。そうでない場合は、2つのフィルターを使用できます。

例:-{{ variable_name | from_json | json_query('')}}

あなたの場合、これは助けになると思います:

tasks: print the color
set_fact:
  color1 : "{{ jsonVar | from_json | json_query('queue.[0].['color']')}}"
  color2 : "{{ jsonVar | from_json | json_query('queue.[1].['color']')}}"

ただし、Ansibleバージョンなどの要件に注意してください

8
VaibhavKrishna