はじめに
(聞かれると「あれ、どうだったかな・・」と不安になるシリーズ)
以下の記事を拝見して思ったのですが、
register
や set_fact
した変数は Play を跨いで有効です。
言い換えると Playbook スコープです。
set_fact
モジュール には、以下のように明記してあります。
The set_fact module takes key=value pairs as variables to set in the playbook scope.
register
については明記はみあたりません。
一応、試した結果を掲載します。
- 動作確認環境
- Ansible 2.9.6
※ Play ってどんな単位だっけ?という場合はこちら
[Ansible] Playbook の書き出しを - hosts か hosts か迷ったら - てくなべ (tekunabe)
検証
かんたんな Playbook で検証します。
Playbook
1 Play 目で register
や set_fact
した変数を、それぞれ 1 Play 目で表示します。
--- # Play 1 - name: play1 hosts: localhost connection: local gather_facts: false tasks: - name: command test command: echo "register in play1" register: res_command # register する - name: set_fact test set_fact: fact_test: "set_fact in play1" # set_fact する # Play 2 - name: play2 hosts: localhost connection: local gather_facts: false tasks: - name: debug register var debug: var: res_command.stdout # 1 Play目で register した変数 - name: debug set_fact debug: var: fact_test # 1 Play目で set_fact した変数
実行
Playbook を実行します。
$ ansible-playbook -i localhost, beyond_play.yml PLAY [play1] ***************************************************************************************************** TASK [command test] ********************************************************************************************** changed: [localhost] TASK [set_fact test] ********************************************************************************************* ok: [localhost] PLAY [play2] ***************************************************************************************************** TASK [debug register var] **************************************************************************************** ok: [localhost] => { "res_command.stdout": "register in play1" } TASK [debug set_fact] ******************************************************************************************** ok: [localhost] => { "fact_test": "set_fact in play1" } PLAY RECAP ******************************************************************************************************* localhost : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
無事に Play を跨いで、変数が有効であることが確認できました。
たとえば、仮想化基盤の以下のような作業のときに活かせるやり方だと思います。