【Ansible】気づいたら文字列型に変換されていた件について

f:id:hira98:20190916162123p:plain

【結論】

  • リスト型で定義した変数をwith_itemsで順に取り出して、include_tasksvarsを使って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での出力結果

f:id:hira98:20190916162210p:plain

sub_task.ymlでの出力結果

f:id:hira98:20190916162222p:plain

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での出力結果

f:id:hira98:20190916162237p:plain

sub_task.ymlでの出力結果

f:id:hira98:20190916162249p:plain

リスト型ではmain_taskとsub_taskでは同じ変数を出力しているため、当然値も型も同じになります。

しかし、辞書型ではmain_taskでは定義通りに出力されますが、sub_taskでは文字型に自動変換されるようです。

さいごに

Ansibleとうまく付き合うコツは、Ansibleの思想を理解することではなく、思想に基づいて実装された結果を淡々と記録して証跡を残して、同じ過ちを2度と繰り返さないことだと最近気づきました。