てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 変数名を変数で指定する

はじめに

vars lookup pluginは、変数名を引数にして変数の値を取得できます。

この性質を利用すると、変数名を変数で指定して、その値を取得できます。

簡単な例でご紹介します。

サンプル Playbook

値を取得したい変数名を、var_name 変数の値で指定します。(以下の場合 var1

1つめのタスクでは、単純に var1 の値を表示します。 2つめのタスクでは、loop で変数名の一部を可変にして、var1, var2, var3 の値を表示します。

- hosts: localhost
  gather_facts: no

  vars:
    var_name: var1  # 変数名を指定する変数
    var1: value1    # 取得対象の変数その1
    var2: value2    # 取得対象の変数その2
    var3: value3    # 取得対象の変数その3
    
  tasks:
    - name: lookup plugin
      debug:
        msg: "{{ lookup('vars', var_name) }}"   # 変数 var1 の指定と等価

    - name: using loop
      debug:
        msg: "{{ lookup('vars', 'var' + (item | string)) }}" # ループを利用して変数 var1, var2, var3 を指定 
      loop:
        - 1
        - 2
        - 3

Playbook 実行

Playbook を実行します。

$ ansible-playbook -i localhost, var.yml 

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

TASK [lookup plugin] **********************************************************************************************
ok: [localhost] => {
    "msg": "value1"
}

TASK [using loop] *************************************************************************************************
ok: [localhost] => (item=1) => {
    "msg": "value1"
}
ok: [localhost] => (item=2) => {
    "msg": "value2"
}
ok: [localhost] => (item=3) => {
    "msg": "value3"
}

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

参考

When should I use {{ }}? Also, how to interpolate variables or dynamic variable names

docs.ansible.com

別解

How do I access a variable of the first host in a group?

docs.ansible.com