考えられる条件の問題

考えられる条件の問題

このスクリプトは合計RAMを取得し、そのセットに応じて、AおよびBAなどの2つの変数は合計RAMの40%です。 Bは合計RAMの60%です。

作業は、Aが32以上であればAは32でなければなりませんが、32未満であればBが32以上であれば、RAM全体の40%がBと等しいので、Aを維持することです。この場合、Bは32でなければなりませんが、32より小さい場合はRAM全体の60%なので、Bを維持します。

- name: get total RAM
  set_fact:
    total_ram_mb: "{{ ansible_memtotal_mb }}"

- name: calculate min & max values
  set_fact:
    A: "{{ (total_ram_mb * 0.4 / 1024) | int }}"
    B: "{{ (total_ram_mb * 0.6 / 1024) | int }}"

- debug:
    var: A

- debug:
    var: B

- name: limit min value
  set_fact:
    A: "{{ 32 if A >= 32 else A }}"

- name: limit max value
  set_fact:
    B: "{{ 32 if B >= 32 else B }}"

- debug:
    var: A

- debug:
    var: B

ただし、後続のジョブABは常に32に設定されます。 Aが大きいか等しいか小さい場合でも、私の仮想マシンのメモリは8Gです。問題がどこにあるのかわかりません。

これが演劇の結果です。

[root@autom ansible]# ansible-playbook -i inv.txt memory.yml

PLAY [es] ********************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [es1]
ok: [es2]

TASK [memory : get total RAM] *****************************************************************************************************************
ok: [es1]
ok: [es2]

TASK [memory : calculate min & max values] ****************************************************************************************************
ok: [es1]
ok: [es2]

TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
    "A": "3"
}
ok: [es2] => {
    "A": "3"
}

TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
    "B": "4"
}
ok: [es2] => {
    "B": "4"
}

TASK [memory : limit min value] ***************************************************************************************************************
ok: [es1]
ok: [es2]

TASK [memory : limit max value] ***************************************************************************************************************
ok: [es1]
ok: [es2]

TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
    "A": "32"
}
ok: [es2] => {
    "A": "32"
}

TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
    "B": "32"
}
ok: [es2] => {
    "B": "32"
}

答え1

どのバージョンのAnsibleを実行していますか?作成したスクリプトを試してみると、次のエラーで失敗します。

TASK [limit min value] **********************************************************************************
fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ 32 if A >= 32 else A }}): '>=' not supported between instances of 'str' and 'int'. '>=' not supported between instances of 'str' and 'int'"}

int次のように明示的な変換を実行するように操作を変更すると、

- name: limit min value
  set_fact:
    A: "{{ 32 if A|int >= 32 else A }}"

- name: limit max value
  set_fact:
    B: "{{ 32 if B|int >= 32 else B }}"

そうすれば、スクリプトが意図したとおりに動作するようでした。いつ:total_rm_mb4192

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "A": "1"
}

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "B": "2"
}

いつ63993:

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "A": "24"
}

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "B": "32"
}

Ansible バージョン 2.15.1 の場合です。

関連情報