やりたいこと
my_date
に時刻を格納して一意のキーとして利用としたい。
だが!
以下のように my_date
の定義方法(vars
かset_fact
)次第で挙動が異なっていたので、紹介したいと思います。
ちなみにvarsのみならず、group_vars、host_vars、vars_filesも同様な挙動を確認しています。
シーンによっては再帰的に利用できていいかもしれない。
vars_my_date.yml
- name: Test playbook
hosts: localhost
connection: local
gather_facts: False
vars:
# 時間を取得
my_date: "{{ lookup('pipe', 'date +%s') }}"
tasks:
- debug: msg="{{ my_date }}"
- pause: seconds=5
- debug: msg="{{ my_date }}"
1回目(1606815454
)と2回目(1606815459
)の実行結果でpause
の5秒があります。
つまり、代入したmy_date
を呼び出すたびにその値を再評価している動きになっています。
実行結果
TASK [debug] ********************************
Tuesday 01 December 2020 18:37:34 +0900 (0:00:00.120) 0:00:00.120 ******
ok: [localhost] => {
"msg": "1606815454"
}
TASK [pause] ********************************
Tuesday 01 December 2020 18:37:34 +0900 (0:00:00.037) 0:00:00.157 ******
Pausing for 5 seconds
(ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
ok: [localhost]
TASK [debug] ********************************
Tuesday 01 December 2020 18:37:39 +0900 (0:00:05.013) 0:00:05.171 ******
ok: [localhost] => {
"msg": "1606815459"
}
set_factで定義したらどうなるか?
set_fact_my_date.yml
- name: Test playbook
hosts: localhost
connection: local
gather_facts: False
tasks:
- set_fact:
my_date: "{{ lookup('pipe', 'date +%s') }}"
- debug: msg="{{ my_date }}"
- pause: seconds=5
- debug: msg="{{ my_date }}"
1、2回目の実行結果は1606815486
であり、変わっていないことがわかります。
実行結果
TASK [debug] ********************************
Tuesday 01 December 2020 18:38:07 +0900 (0:00:00.038) 0:00:00.160 ******
ok: [localhost] => {
"msg": "1606815486"
}
TASK [pause] ********************************
Tuesday 01 December 2020 18:38:07 +0900 (0:00:00.028) 0:00:00.188 ******
Pausing for 5 seconds
(ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
ok: [localhost]
TASK [debug] ********************************
Tuesday 01 December 2020 18:38:12 +0900 (0:00:05.014) 0:00:05.203 ******
ok: [localhost] => {
"msg": "1606815486"
}