てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] register や set_fact した変数は Play を跨げる

はじめに

(聞かれると「あれ、どうだったかな・・」と不安になるシリーズ)

以下の記事を拝見して思ったのですが、

zaki-hmkc.hatenablog.com

registerset_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 目で registerset_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 を跨いで、変数が有効であることが確認できました。

たとえば、仮想化基盤の以下のような作業のときに活かせるやり方だと思います。

  • 1Play目: ホストを対象にして、仮想マシンを生成、情報の取得
  • 2Play目: 仮想マシンを対象にして、1Play目で取得した情報を利用した処理