Ansible: 배열의 변수를 성공적으로 일치시킨 후 _fact를 설정합니다.

Ansible: 배열의 변수를 성공적으로 일치시킨 후 _fact를 설정합니다.

다음 스크립트가 있습니다 ~ # cat demo.yml.

- name: demo
  hosts: localhost
  gather_facts: no

  vars:
    set:
      task:
        type: var1
    task:
    - type: var1
    - type: var2
    - type: var3
  
  tasks:
  - debug:
      var: set

  - debug:
      var: task

  - set_fact:
      task: 
        type: "{{set.task.type if item.type is search(set.task.type|join('|')) else 'absent'}}"
    loop: "{{task}}"
  
  - debug:
      var: task

산출:

PLAY [demo] ************************************************************************************************************************************************************************************************

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "set": {
        "task": {
            "type": "var1"
        }
    }
}

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "task": [
        {
            "type": "var1"
        },
        {
            "type": "var2"
        },
        {
            "type": "var3"
        }
    ]
}

TASK [set_fact] ********************************************************************************************************************************************************************************************
ok: [localhost] => (item={'type': 'var1'})
ok: [localhost] => (item={'type': 'var2'})
ok: [localhost] => (item={'type': 'var3'})

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "task": {
        "type": "var1"
    }
}

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

보시다시피 이것은 변수에 대해 잘 작동하며 새 값이 task.type다음으로 설정 되어 있습니다.변수 1.

그러나 문제는 내가 제공 set.task.type: var4하거나 다른 변수를 제공할 때입니다.

비율 task.type은 다음과 같이 설정됩니다.변수 4바꾸다결석한.

질문:

task.type: absentset.task.type배열의 값과 일치하지 않는 경우 새 값을 어떻게 설정합니까?

답변1

당신이 달성하고 싶은 것이 무엇인지도 나에게는 명확하지 않지만, 귀하의 질문에 관해서는

task.type: absentset.task.type배열의 값과 일치하지 않는 경우 새 값을 어떻게 설정합니까?

그리고

set.task.type존재하지 않는 값 task.type의 배열을 제공하기 전까지는 괜찮았습니다.(참고: 목록)

| join('|')이는 사전의 필터 때문인 것 같고 , loop나에게는 그것이 불필요해 보인다. 그래서 어떻게

변수가 set.task.type목록에 있는지 확인하십시오 task.type. 값이 존재하면 task.type해당 값으로 업데이트해야 합니다 set.task.type.

루프 실행 없음

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    # dictionary
    set: 
      task:
        type: var4

    # list
    task:
    - type: var1
    - type: var2
    - type: var3

  tasks:

  - debug:
      msg: "{{ set.task.type if task | join('|') is search(set.task.type) else 'absent' }}"

이렇게 하면 결과만 출력됩니다.

TASK [debug] *****
ok: [localhost] =>
  msg: absent

참고하시기 바랍니다.새로운 값을 설정하지 않음대신 새 개체가 만들어집니다. 그 이후에는 목록이 없고 task[*].type사전만 있을 것입니다 task.type.

추가 문서

관련 정보