検証環境はこちらを利用しています。
CentOS Linux release 7.9.2009 (Core)
python version 2.7.5
ansible 2.9.23
インベントリに変数を書いて利用する方法を検証していきます。
変数には文字・数字・アンダースコアが使用でき、先頭は文字である必要があります。
ハイフンやスペース、ドット、数字のみの変数は定義するとエラーになりました。
[test:vars]
var-test="This is test message."
var-testを定義して、アドホックコマンドを実行してみるとエラーになりました。
[root@ansible-ctl ~]# ansible node1 -a "echo {{ var-test }}"
node1 | FAILED | rc=-1 >>
The task includes an option with an undefined variable. The error was: Unable to look up a name or access an attribute in template string (echo {{ var-test }}).
Make sure your variable name does not contain invalid characters like '-': unsupported operand type(s) for -: 'AnsibleUndefined' and 'AnsibleUndefined'
[root@ansible-ctl ~]#
この変数のハイフンをアンダースコアにして、再実行してみます。
[test:vars]
var_test="This is test message."
var_testとしてアドホックコマンドを実行してみます。
[root@ansible-ctl ~]# ansible node1 -a "echo {{ var_test }}"
node1 | CHANGED | rc=0 >>
This is test message.
[root@ansible-ctl ~]#
今度はエラーにならず、変数に設定した値が表示されました。
上で試したのがグループ変数になります。インベントリを次のように定義していて、グループtestに対する変数としてvar_testを定義しています。
[web:children]
test
[test]
node1 ansible_host=192.168.157.137
[test:vars]
var_test="This is test message."
変数にはもう一つ、ホスト変数というものがあります。
インベントリにあるホスト名の後ろの箇所が、ホスト変数になります。
ここではnode1のIPアドレスを指定するためにansible_hostを使用しています。
node1 ansible_host=192.168.157.137
このホスト変数にグループ変数を同じ名前で定義した場合、どうなるのか試してみます。
[test]
node1 ansible_host=192.168.157.137 var_test="host var"
[test:vars]
var_test="This is test message."
ホスト変数の方が表示されました。この場合、グループ変数よりホスト変数の方が優先されるようです。
[root@ansible-ctl ~]# ansible node1 -a "echo {{ var_test }}"
node1 | CHANGED | rc=0 >>
host var
[root@ansible-ctl ~]#
まとめ
・変数名には使えない文字がある。特にハイフンは使ってしまいそうになるため注意が必要。
・各ホスト毎に値を変えたい場合はホスト変数を使用し、グループ単位で値を変えたい場合はグループ変数を使用するのが良さそう。
・変数には優先順位があるため、同じ変数名を使用する際はどこに書いたものが適用されるのか把握しながら使用する。
参考: https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_variables.html#playbooks-variables
コメント