【Ansible】気づいたら文字列型に変換されていた件について
【結論】
リスト型で定義した変数を
with_items
で順に取り出して、include_tasks
とvars
を使ってsub_taskに渡しても型変換されない。しかし、同じ処理を辞書型で実装すると、sub_taskに渡した変数は自動で文字列型に変換される。
【目次】
はじめに
前回全力でふざけてしまったので、今回は淡々と試したAnsibleソースと結果だけを書いていこうと思います。
リスト型で定義した変数をsub_taskに渡した場合
試したソース
【main_task.yml】
--- - hosts: localhost # 自分自身に接続する tasks: - set_fact: sample_data_list: - "10" - 10 - "" - - null - name: main_task debug: msg: "(var:{{item}} type:{{item | type_debug}})" with_items: - "{{ sample_data_list }}" - include_tasks: sub_task.yml vars: data: "{{ item }}" with_items: - "{{ sample_data_list }}"
【sub_task.yml】
--- - name: sub_task debug: msg: "(var:{{data}} type:{{data | type_debug}})"
実行結果
main_task.ymlでの出力結果
sub_task.ymlでの出力結果
main_taskとsub_taskでは同じ変数を出力しているため、当然値も型も同じになります。
辞書型で定義した変数をsub_taskに渡した場合
最初に説明したリスト型との差分は、データ定義を辞書型に変えただけです。
試したソース
【main_task.yml】
--- - hosts: localhost # 自分自身に接続する tasks: - set_fact: sample_data_dic: - { "data":"10" } - { "data":10 } - { "data":"" } - { "data": } - { "data":null } - name: main_task debug: msg: "(var:{{ item.data }} type:{{item.data | type_debug}})" with_items: - "{{ sample_data_dic }}" - include_tasks: sub_task.yml vars: data: "{{ item.data }}" with_items: - "{{ sample_data_dic }}"
【sub_task.yml】
--- - name: sub_task debug: msg: "(var:{{data}} type:{{data | type_debug}})"
実行結果
main_task.ymlでの出力結果
sub_task.ymlでの出力結果
リスト型ではmain_taskとsub_taskでは同じ変数を出力しているため、当然値も型も同じになります。
しかし、辞書型ではmain_taskでは定義通りに出力されますが、sub_taskでは文字型に自動変換されるようです。
さいごに
Ansibleとうまく付き合うコツは、Ansibleの思想を理解することではなく、思想に基づいて実装された結果を淡々と記録して証跡を残して、同じ過ちを2度と繰り返さないことだと最近気づきました。