この記事は、Ansible Advent Calendar 2022 (Adventar 版) の 18日目の記事です。
はじめに
あらためて考えると「あれ、どうだっけ?」となることの一つに、変数の評価タイミングがあります。
インベントリ変数や、Play変数、vars_files
、set_fact
、include_vars
で定義した変数をそれぞれ2回参照したときの比較結果を、ど忘れしたときのために記しておきます。
- 環境
- ansible-core 2.14.1
ファイル構成
. ├── eval_vars.yml # Playbook ├── host_vars │ └── localhost.yml # インベントリ変数 └── vars ├── files.yml # vars_files で指定する対象 └── included.yml # include_vars で指定する対象
変数ファイルの中身はそれぞれ以下のとおりです。すべて中身は "{{ now }}"
で、変数名だけ定義した場所が区別できるように変えています。
host_vars/localhost.yml
--- now_host_vars: "{{ now() }}"
vars/files.yml
(vars_files で指定する対象)
--- now_vars_files: "{{ now() }}"
vars/included.yml
(include_vars で指定する対象)
--- now_include_vars: "{{ now() }}"
Playbook
Playbook は以下のとおりです。先程定義した変数ファイルたちをいろいろな方法で読み込みつつ、Play 変数 now_play_vars
、set_fact
で定義する変数 now_set_fact
は、Playbook 内で定義します。2回変数を debug
で表示しますが、間に 1秒 pause
をかけます。これにより、 "{{ now }}"
が変わったり変わらなかったりするところ比較するのが目的です。
--- - name: Test evaluating vars hosts: localhost gather_facts: false connection: local vars: now_play_vars: "{{ now() }}" vars_files: - files.yml tasks: - name: set_fact ansible.builtin.set_fact: now_set_fact: "{{ now() }}" - name: include_vars ansible.builtin.include_vars: file: included.yml - name: debug vars 1 ansible.builtin.debug: msg: - "{{ now_host_vars }} now_host_vars" - "{{ now_play_vars }} now_play_vars" - "{{ now_vars_files }} now_vars_files" - "{{ now_set_fact }} now_set_fact" - "{{ now_include_vars }} now_include_vars" - name: pause ansible.builtin.pause: seconds: 1 - name: debug vars 2 ansible.builtin.debug: msg: - "{{ now_host_vars }} now_host_vars" - "{{ now_play_vars }} now_play_vars" - "{{ now_vars_files }} now_vars_files" - "{{ now_set_fact }} now_set_fact" - "{{ now_include_vars }} now_include_vars"
実行結果
Playbook の実行結果です。
% ansible-playbook -i localhost, eval_vars.yml PLAY [Test evaluating vars] ************************************************************************************* TASK [set_fact] ************************************************************************************************* ok: [localhost] TASK [include_vars] ********************************************************************************************* ok: [localhost] TASK [debug vars 1] ********************************************************************************************* ok: [localhost] => { "msg": [ "2022-12-18 11:40:59.351505 now_host_vars", "2022-12-18 11:40:59.353803 now_play_vars", "2022-12-18 11:40:59.355511 now_vars_files", "2022-12-18 11:40:59.228503 now_set_fact", "2022-12-18 11:40:59.358674 now_include_vars" ] } TASK [pause] **************************************************************************************************** Pausing for 1 seconds (ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort) ok: [localhost] TASK [debug vars 2] ********************************************************************************************* ok: [localhost] => { "msg": [ "2022-12-18 11:41:00.455484 now_host_vars", "2022-12-18 11:41:00.458050 now_play_vars", "2022-12-18 11:41:00.460399 now_vars_files", "2022-12-18 11:40:59.228503 now_set_fact", "2022-12-18 11:41:00.462725 now_include_vars" ] } PLAY RECAP ****************************************************************************************************** localhost : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
set_fact
で取得した now()
だけが変化しなかったことが分かります。