질문:

질문:

다음 스크립트를 사용합니다.

~ # cat play.yml

- name: MAIN PLAY
  hosts: localhost
  gather_facts: no

  vars:
    status:
      check1: present
      check2: ""

  tasks:
  - debug:
      var: status

  - name: Verify status
    set_fact:
      status_old: "{{status}}"
      status_new:
        check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
        check2: "{{'present' if status.check2 is defined and status.check2 != '' else 'absent'}}"
  
  - name: Combine facts
    set_fact:
      status: "{{status|combine(status_old, status_new, recursive=True) }}"

  - debug:
      var: status

산출:

PLAY [MAIN PLAY] **********************************************************************************************************************************************************************************************************************************************************

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "status": {
        "check1": "present",
        "check2": ""
    }
}

TASK [Verify status] ******************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [Combine facts] ******************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "status": {
        "check1": "present",
        "check2": "absent"
    }
}

보시다시피 이것이 작동하지만 두 번째 임무는 name: Combine facts쇼에 있어야 합니다.

질문:

변수가 존재하고 감지된 조건에 따라 특정 상태를 설정할 수 있는지 확인하는 더 좋은 방법이 있습니까?
여기서 목표는 작업을 제거 하고 "블록"을 사용하지 않고 name: Combine facts작업 아래에 모든 것을 설정하는 것입니다 .name: Verify status

나는 또한 이것을하려고 노력하고 있습니다 :

  - name: Verify status
    set_fact:
      status: "{{ status |combine(status_old, status_new, recursive=True) }}"
      vars:
        status_old: "{{status}}"
        status_new:
          check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
          check2: "{{'present' if check2 is defined and check2 != '' else 'absent'}}"

하지만 이제 출력에는 변화가 있습니다.

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "status": {
        "check1": "present",
        "check2": ""
    }
}

"set_fact"를 다음으로 설정하면

- name: Verify status
  set_fact:
    status:
      check2: present

status.check1사라진 것보다

ok: [localhost] => {
    "status": {
        "check2": "present"
    }
}

어떤 제안이 있으십니까?

답변1

status_old그것들을 설정 하고 status_new결합할 이유가 없습니다 . statusstate 의 값을 간단히 바꿀 수 있습니다 set_fact. 대신에:

  - name: Verify status
    set_fact:
      status_old: "{{status}}"
      status_new:
        check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
        check2: "{{'present' if status.check2 is defined and status.check2 != '' else 'absent'}}"
  
  - name: Combine facts
    set_fact:
      status: "{{status|combine(status_old, status_new, recursive=True) }}"

이렇게 하세요:

  - name: Verify status
    set_fact:
      status:
        check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
        check2: "{{'present' if status.check2 is defined and status.check2 != '' else 'absent'}}"

관련 정보