てくなべ (tekunabe)

ansible / network / automation

[Ansible] set_fact の利用を減らしたい時に考えること

はじめに

set_fact モジュールは、Playbook 内のタスクとして、新たな変数を定義できるモジュールです。

便利といえば便利なのですが、プログラムでいう変数の代入のようなことをタスクで実現させるには、少々大げさに感じることがあります。 set_fact モジュールにしかできない変数の定義方法もありますが、簡単な定義であれば他の方法でも定義できます。

この記事では、他の方法を検討するためのポイントをご紹介します。

前提 (set_fact を利用する場合)

以下のような Playbook をベースに考えます。set_fact モジュールで、test_var 変数を定義し、その値を debug モジュールで表示するという簡単なものです。

- hosts: localhost
  gather_facts: no

  tasks:
    - name: set_fact
      set_fact:
        test_var: hogehoge

    - name: debug test
      debug:
        msg: "{{ test_var }}"


■ Play レベルの vars でよいのではないか

set_fact モジュールではなく、Play レベルvars で定義する方法です。

- hosts: localhost
  gather_facts: no

  vars:
    test_var: hogehoge
    
  tasks:
    - name: debug test
      debug:
        msg: "{{ test_var }}"

タスクの数も減ります。Playbook の実行ログは以下のとおりです。

$ ansible-playbook -i localhsot, test_vars.yml 

PLAY [localhost] **************************************************************************************************

TASK [debug test] *************************************************************************************************
ok: [localhost] => {
    "msg": "hogehoge"
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

ただし、set_fact モジュールのように、ループとは併用できません。


■ Task レベルの vars でよいのではないか

set_fact モジュールではなく、Task レベルvars で定義する方法です。

- hosts: localhost
  gather_facts: no

  tasks:
    - name: debug test
      debug:
        msg: "{{ test_var }}"
      vars:
        test_var: hogehoge

実行ログは、前述のPlay レベルの vars で定義した場合と同じです。

ただし、スコープはこのタスクの範囲なので、他のタスクへの使いまわしはできません。逆にスコープを閉じ込めたい場合はメリットになるかも知れません。