はじめに
<バージョン>
ansible 2.9.7
以前の記事で、selectattrを用いて変数ファイルの一部を取得する方法を紹介しましたが、
json_queryでも可能なので紹介します。
以前の記事と同じ変数ファイルから、json_queryを用いて変数を読み込んでみましょう。
---
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はそのまま正規表現が使えるので便利です。
---
- 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)