【Ansible】システム情報を使用して動的に変数値を計算
はじめに
ミドルウェアのパラメータを設定する際、「搭載メモリの1/4」のような計算値を設定したいことがあります。
このようなケースにおいて、Ansibleを使用してシステム情報の取得と計算をどのように行えばよいか調べてみました。
前提条件
以下環境で検証しています。
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.3 (Ootpa)
$ pip3 list
Package Version
------------ -------
ansible 3.1.0
ansible-base 2.10.7
(略)
システム情報の取得
システム情報は、Playbook実行時にファクト変数として収集され、タスクやテンプレートの中で参照できます。
パラメータの計算でよく使いそうなファクト変数は以下の通りです。
変数名 | 意味 | 値の例 |
---|---|---|
ansible_processor_cores | CPUコア数 | 8 |
ansible_memtotal_mb | 物理メモリサイズ(MB) | 7977 |
ansible_devices.<ディスクデバイス名>.size | ディスクサイズ | 40.00 GB |
参考:
https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_variables.html#fact
変数値の計算
ファクト変数の値をそのまま変数値に使用する場合は、ファクト変数名をそのまま参照します。
var1: {{ ansible_processor_cores }}
ファクト変数の値の計算結果を変数値に使用する場合は、Jinja2の文法に従い演算子を使用します。
var2: {{ (ansible_processor_cores * 2) + 1 }}
数値の割り算を行う場合は、計算結果が小数点以下の値を持ちます。整数に変換したい場合は、Jinja2組み込みフィルターのint
を使用します。
この変数だけ具体的な内容になってしまいますが、以下はPostgreSQLの共有メモリの設定例です。搭載メモリの1/4の値を整数化し、末尾にMB
の文字列を追加しています。
shared_buffers: "{{ (ansible_memtotal_mb / 4) | int }}MB"
参考:
https://jinja.palletsprojects.com/en/2.11.x/templates/#math
https://jinja.palletsprojects.com/en/2.11.x/templates/#list-of-builtin-filters
実行結果
今まで紹介した変数値の計算をPlaybookの中で実行してみます。
- hosts: localhost
vars:
var1: "{{ ansible_processor_cores }}"
var2: "{{ (ansible_processor_cores * 2) + 1 }}"
shared_buffers: "{{ (ansible_memtotal_mb / 4) | int }}MB"
tasks:
- name: debug1
debug:
msg: "var1: {{ var1 }}"
- name: debug2
debug:
msg: "var2: {{ var2 }}"
- name: debug3
debug:
msg: "shared_buffers: {{ shared_buffers }}"
実行結果は以下のようになりました。
$ ansible-playbook -i localhost, -c local sample-playbook.yml
PLAY [localhost] *************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [localhost]
TASK [debug1] ****************************************************************************************************
ok: [localhost] => {
"msg": "var1: 2"
}
TASK [debug2] ****************************************************************************************************
ok: [localhost] => {
"msg": "var2: 5"
}
TASK [debug3] ****************************************************************************************************
ok: [localhost] => {
"msg": "shared_buffers: 930MB"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0