【Ansible】外部の変数ファイルから変数の一部を読み込む(json_query)

# はじめに
<バージョン>
ansible 2.9.7

以前の記事で、selectattrを用いて変数ファイルの一部を取得する方法を紹介しましたが、
json_queryでも可能なので紹介します。
以前の記事と同じ変数ファイルから、json_queryを用いて変数を読み込んでみましょう。

```yaml:input_vars.yml
---
input_vars:
  text:
    - type: a
      file: test1.txt
    - type: b
      file: test2.txt
    - type: c
      file: test3.txt
  yaml:
    - name: test4
      file: test4.yml
    - name: test5
      file: test5.yml
    - name: test6
      file: test6.yml
```

# Playbookの紹介
selectattrと同じ2つのパターンを試します
(1)vars_promptの入力(a,b,c)に基づいてtextという変数の中身を取り出す
　 → aと入力したら、{ type : a , file : test1.txt } という辞書を出力する
(2)yamlという変数内のnameの中身をすべて取り出す
　 → [test4, test5, test6] というリストを出力する
___ポイント___
前回の記事で紹介したポイントは割愛します
(1)json_queryで取得した結果はリスト型で取得されます。
　今回は要素が一つしかないのでfirstでリストの中身({ type : a , file : test1.txt } )を取得します。
(2)json_queryの検索条件は複雑になることが多いので、ここだけをvarsに書くと見やすくなります。
(3)json_queryはそのまま正規表現が使えるので便利です。

```yaml:json_query_test.yml
---
- name: select TEST
  hosts: localhost
  gather_facts: no
  vars_files:
    - input_vars.yml
  vars:
    ansible_python_interpreter: /usr/bin/python3
  vars_prompt:
    - name: "usr_input"
      prompt: |
              here are output lists!
              {% for i in input_vars['text'] %}
              {{ i['type'] }} : {{ i['file'] }}
              {% endfor -%}
      private: no
  tasks:
    - name: test1 set_fact
      set_fact:   
        select_info: "{{ input_vars['text'] | json_query(query_var)  | first }}"  # ポイント(1)
      vars:
        query_var: "[?type==`{{ usr_input }}`]"  # ポイント(2)

    - name: test1 debug select_info
      debug:
        msg: "{{ select_info }}"

    - name: test1 debug select_info file
      debug:
        msg: "{{ select_info['file'] }}"

    - name: test2 set_fact
      set_fact:
        yaml_name: "{{ input_vars['yaml'] | json_query('[*].name') }}"    #ポイント(3)

    - name: test2 debug yaml_name
      debug:
        msg: "{{ yaml_name }}"
```

# 出力結果
json_queryでも同様の結果を得ることが出来ました。
json_queryは検索条件の書き方が少し複雑かもしれませんが、selectattrよりコンパクト
に書けるので、個人的にはこちらの方が使いやすく感じました。

```text:出力
[ec2-user@ip-<ip-addr>]$ ansible-playbook json_query_test.yml
here are output lists!
a : test1.txt
b : test2.txt
c : test3.txt
: a

PLAY [select TEST] **********************************************************************************************************************

TASK [test1 set_fact] **********************************************************************************************************************
ok: [localhost]

TASK [test1 debug select_info] **********************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "file": "test1.txt",
        "type": "a"
    }
}

TASK [test1 debug select_info file] **********************************************************************************************************************
ok: [localhost] => {
    "msg": "test1.txt"
}

TASK [test2 set_fact] **********************************************************************************************************************
ok: [localhost]

TASK [test2 debug yaml_name] **********************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "test4",
        "test5",
        "test6"
    ]
}

PLAY RECAP **********************************************************************************************************************
localhost                  : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

# 関連記事
[【Ansible】promptをfor文で記入する](https://qiita.com/masa2223/items/5281dbaa012ad57bb79c)
[【Ansible】辞書型から任意の値を取り出してリストを作成する](https://qiita.com/masa2223/items/ed9717770c81d3693c39)
[【Ansible】外部の変数ファイルから変数の一部を読み込む(selectattr,map)](https://qiita.com/masa2223/items/6f035b9e598dc6f03058)