ansible条件问题

ansible条件问题

该剧本获取总 RAM,并在此基础上设置两个变量,例如 A 和 B A 是总 RAM 的 40% B 是总 RAM 的 60%

任务是,如果 A 大于或等于 32,则 A 必须为 32,但如果小于 32,则保留 A,因为总 RAM 的 40% 与 B 相同,如果 B 大于或等于32,则 B 必须为 32,但如果小于 32,则保留 B,因为是总 RAM 的 60%

- 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_mb时候4192

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 的情况。

相关内容