Ansible 入れ子になってる変数と変数を合体させて、変数と認識させる方法


やりたいこと

タイトルでちょっとアレですが。。やりたいこととしてはインベントリに定義された変数を組み合わせたパターンから、varsのから呼び出す値を変えたい!ってことです。

こんな感じで。。


[インベントリ]
head=an #head変数には、ユーザー次第でanだったりteが入ったりする
tail=sible #tail変数には、ユーザー次第でsibleだったりstが入ったりする

[vars]
ansible:
  ansible: success!!! #head変数の値が`an`で、tail変数`sible`が定義された場合に出力したい
  test: test!!! #head変数の値が`te`で、tail変数`st`が定義された場合に出力したい

head変数とtail変数を合体させてansibleになればsuccess!!!
testになればtest!!!を出力したいという感じです。

実現方法

playbookのリスト内の変数を[]で括ります。これだけ。
今回は変数で定義された値を出力するだけのplaybookです。

[playbook]
---
- name: ansible変数合体
  debug:
    msg: "{{ ansible[head + tail] }}" 

結果

インベントリのhead変数の値がanで、tail変数にsibleが定義された場合の記載と出力結果が下記です。success!!!が出力されます。


[インベントリ]
head=an
tail=sible

[出力結果]
PLAY [all] ******************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************
ok: [test1]

TASK [var_practice : ansible変数合体] *******************************************************************************************************
ok: [test1] => {
    "msg": "success!!!"
}

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

インベントリのhead変数の値がteで、tail変数にstが定義された場合の出力結果が下記です。test!!!が出力されています。


[インベントリ]
head=te
tail=st

[出力結果]
PLAY [all] ******************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************
ok: [test1]

TASK [var_practice : ansible変数合体] *******************************************************************************************************
ok: [test1] => {
    "msg": "test!!!"
}

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

おまけ

変数と変数の間に_とかの文字列があっても出来ます。
文字列は""で括るんですが、ダブルクオーテーションを\の前に入れます。
playbookの記述以外は変わりません。


[playbook]
- name: ansible変数合体
  debug:
    msg: "{{ ansible[head + \"_\" + tail] }}" 

これでOK。

最後に

変数の呼び方とか用語があんまり知らないので、
使い方間違ってたりしたら指摘もらえると有難いです。

全く大した量では無いですが、GitHubに上げているので参考にしたい方はどうぞ。
tasksフォルダとvarsフォルダ以外使ってませんが。。