0
1

More than 3 years have passed since last update.

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

Posted at

はじめに

<バージョン>
ansible 2.9.7

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

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はそのまま正規表現が使えるので便利です。

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よりコンパクト
に書けるので、個人的にはこちらの方が使いやすく感じました。

出力
[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文で記入する
【Ansible】辞書型から任意の値を取り出してリストを作成する
【Ansible】外部の変数ファイルから変数の一部を読み込む(selectattr,map)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1