【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   

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です