Ansible: var가 true일 때 작업을 건너뛰는 이유는 무엇입니까?

Ansible: var가 true일 때 작업을 건너뛰는 이유는 무엇입니까?

아래 예에서
db.x86_64.alpine.update가 true일 때 DEBUG 2를 건너뛰는 이유는
"when: db.x86_64.alpine.update|bool is true"를 시도했지만 이것도 실패했습니다.

변수 파일 db.yml

shell> cat db.yml
x86_64:
  alpine:
    update: true
    version_current: 3.14.0
    version_new: 3.15.

aarch64:
  alpine:
    update: true
    version_current: 3.14.0
    version_new: 3.15.0

스크립트

---
- name: Playbook test
  hosts: localhost
  tasks:
  - ansible.builtin.include_vars:
      file: db.yml
      name: db

  - name: DEBUG 1
    debug:
      var: db.x86_64.alpine.update |type_debug

  - name: DEBUG 2
    debug:
      msg:
        - "MESSAGE"
    when: db.x86_64.alpine.update is true

런타임 출력

PLAY [Playbook test] ******************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [ansible.builtin.include_vars] ***************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "db.x86_64.alpine.update |type_debug": "builtin_function_or_method"
}

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
skipping: [localhost]

PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

질문:
db.x86_64.alpine.update가 true일 때 메시지를 표시하는 방법

답변1

부울 값을 명시적으로 테스트할 필요는 없습니다. 조건의 값을 사용하십시오.

  - debug:
      msg: "MESSAGE"
    when: db.x86_64.alpine['update']

메시지가 인쇄됩니다

  msg: MESSAGE

문제는 속성이다고쳐 쓰다Python 사전 메서드와 충돌합니다. 바라보다참조 키:값 사전 변수.

  - debug:
      var: db.x86_64.alpine['update']
  - debug:
      var: db.x86_64.alpine['update']|type_debug

주어진

  db.x86_64.alpine['update']: true
  db.x86_64.alpine['update']|type_debug: bool

답변2

파일의 변수가 DICT를 반환하기 때문에...

그러면 다음과 같이 확인할 수 있습니다.

when: db.x86_64.alpine['update'] is true

디버깅:
db.yml은 <dict 개체의 내장 메서드 업데이트...>입니다.

내 환경:

  • 파이썬 3.6.8
  • 센토스 스트림 8
  • pip에서 Ansible 설치

관련 정보