![가능한 조건 문제](https://linux55.com/image/223140/%EA%B0%80%EB%8A%A5%ED%95%9C%20%EC%A1%B0%EA%B1%B4%20%EB%AC%B8%EC%A0%9C.png)
이 스크립트는 총 RAM을 가져오고 해당 세트에 따라 A 및 BA와 같은 두 변수는 총 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_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의 경우입니다.