2016年3月27日日曜日

Ansible の変数を操作して動的に変更する

Ansibleの変数で一部分だけを取得したり数値に変換して結果を
利用したいケースがあったので調べてみました。

ドキュメントを見るかぎりAnsibleはPythonで動作し変数はJinja2の
テンプレートシステムを利用しています。
変数を操作するときの文法はJinja2、Pythonにならい、
Jinja2に組み込まれているフィルタのほか、Ansibleに用意されている
フィルタなどを利用して変数の内容を動的に変更できるようです。

数字を数値に変換する


{{ value|int + 10 }}
valueが数字10のときは20になる

文字列の一部分を取得する

Pythonのスライス表記という方法を利用して実現していると思います。

{{ value[0:1] }}
valueが test のとき t になる

{{ value[0:2] }}
valueが test のとき te になる

{{ value[1:2] }}
valueが test のとき e になる

{{ value[1:] }}
valueが test のとき est になる
valueが foo1 のとき oo1 になる
valueが foo11 のとき oo11 になる

{{ value[:2] }}
valueが test のとき te になる

{{ hoge[3:]|int + 20 }}
valueが foo1 のとき 21 になる
valueが foo11 のとき 31 になる

指定する範囲の数値からランダムに値を取得する


{{ 59 |random }}
0~59の範囲でランダムに値が選ばれる

{{ 59 |random(step=15) }}
{{ [0,15,30,45] |random }}
0, 15, 30, 45のうち、どれか1つの値がランダムに選ばれる

cronの実行時間をランダムにしたいとき便利です。

ハッシュした値を取得する


{{ 'test' |hash('sha1') }}
sha1のハッシュ値になる

{{ 'password' |password_hash('sha512') }}
sha512のパスワードハッシュ値になる(ソルトはランダム)

{{ 'password' |password_hash('sha512', 'salt_value') }}
ソルトを指定する場合

password_hashはユーザのパスワードを設定するときに
利用できると思います。

他にもいろいろとフィルタがあるようですが、主に利用するケースを
挙げてみました。
バージョンによっては利用できないフィルタがあるので利用するときは
バージョンの確認が必要です。

今回確認したOS・バージョン
CentOS 6.7
ansible 1.9.2