>

저는 여러 작업에서 반복하지 않고 단일 지점에 로직을 유지하기 위해 많은 YAML 앵커 및 참조를 역할에 사용합니다. 다음은 매우 기본적인 예입니다.

- &sometask
  name: "Some Task"
  some_module: with a lot of parameters
  with_items: list_A
- <<: *sometask
  name: "Some OTHER Task"
  with_items: list_B

이 예제는 이것이 실제로 어떻게 유용한 지 보여주지는 않지만 유용합니다. dicts 목록을 반복하여 각 dict에서 다양한 키를 모듈로 전달하고 "when", "failed_when"및 "changed_when"조건이 매우 복잡한 것으로 가정하십시오. 당신은 단순히 건조하고 싶습니다.

따라서 전체 작업을 두 번 정의하는 대신 첫 번째 작업에 앵커를 사용하고 모든 내용을 새 작업으로 병합 한 다음 다른 부분을 재정의합니다. 잘 작동합니다.

확실히 말해서 이것은 기본 YAML 기능이며 Ansible 자체와는 아무런 관련이 없습니다.

위 정의의 결과 (그리고 YAML 파일을 구문 분석 할 때 Ansible이 보는 것)는 다음과 같이 평가됩니다 :

- name: "Some Task"
  some_module: with a lot of parameters
  with_items: list_A
- name: "Some Task"
  some_module: with a lot of parameters
  with_items: list_A
  name: "Some OTHER Task"
  with_items: list_B

Ansible 2에는 이제 작업에서 키가 여러 번 정의되었을 때 불평하는 기능이 있습니다. 여전히 작동하지만 플레이 북을 실행할 때 원하지 않는 소음이 발생합니다 :

TASK [Some OTHER Task] *******************************************************
 [WARNING]: While constructing a mapping from /some/file.yml, line 42, column 3, found a duplicate dict key (name).  Using last defined value only.
 [WARNING]: While constructing a mapping from /some/file.yml, line 42, column 3, found a duplicate dict key (with_items).  Using last defined value only.

가능한 구성으로 deprecation_warningscommand_warnings . 이런 종류의 경고도 방지 할 수있는 방법이 있습니까?


  • 답변 # 1

    Ansible 2.9.0부터, 이것은 ANSIBLE_DUPLICATE_YAML_DICT_KEY 를 설정함으로써 달성 될 수 있습니다   ignore 에 환경 변수 . 이 변수의 다른 가능한 값은 warn 입니다. 이는 기본이며 원래 동작을 유지하며 error 플레이 북 실행에 실패합니다.

    구현에 대한 자세한 내용은이 풀 요청을 참조하십시오.

  • 답변 # 2

    늦게 들어 오면 다른 답변에 동의하지 않고 YAML 병합을 승인합니다. 플레이 북 레이아웃은 매우 주관적이며 가장 적합한 것은 설명해야 할 구성에 따라 다릅니다.

    예, ansible에는 include 또는 with_items/with_dict 루프와 병합 기능이 있습니다

    YAML 병합에 대해 찾은 사용 사례는 작업에 특이 치가 거의없는 경우이므로 무시할 수있는 기본값은 가장 간결하고 읽기 쉬운 표현입니다. 완벽하게 유효한 구문에 대해 불만을 제기하는 것은 실망 스럽습니다.

    관련 가능한 코드의 주석은 The Devs가 사용자보다 더 잘 알고 있음을 암시합니다.

    와이즈 비즈

    PyYAML은 YAML 표준에서 키 우선 순위가 명시 적으로 처리되므로 "덮어 쓰기"키를 자동으로 허용합니다.

  • 답변 # 3

    Most of this is from yaml.constructor.SafeConstructor. We replicate it here so that we can warn users when they have duplicate dict keys (pyyaml silently allows overwriting keys)

    도 있습니다  구성 옵션이지만 이들 중 어느 것도 현재보고있는 출력을 침묵시키지 않습니다.

    이 메시지를 생성하는 코드는 다음과 같습니다. 와이즈 비즈

    system_warnings
    
    

    YAML 레퍼런스의 사용이 상당히 영리하지만 Ansible의 핵심 테넌트가 플레이 북과 작업의 사람이 읽을 수있게 되 자마자 이것이 언제라도 바뀔 것이라고 의심합니다. 블록은 현재 플레이 북 내의 작업으로 제한되는 것처럼 보이지만 작업에 대한 조건부 반복에 도움이됩니다.

    언제나 이러한 경고를 비활성화하고 어디로 가는지 알 수있는 옵션을 추가하여 풀 요청을 제출할 수 있습니다.

  • 답변 # 4

    Ansible의 작업 수준에서 재사용 가능한 기능을 만들려면 작업 포함을 살펴 봐야합니다. 작업 포함에는 with_items 등을 사용하여 반복하는 것과 같은 일을 더 자유롭게 할 수 있습니다. 고용주에서는 앵커/참조를 자유롭게 사용하지만 변수에 대해서만 사용합니다. 작업 포함, 플레이 북 포함 및 역할과 같이 Ansible에서 재사용 가능한 작업을 생성하는 기존의 여러 가지 방법을 고려할 때, 우리가 설명한 방식으로 작업에 앵커/참조를 사용할 필요가 없습니다.

    작업간에 모듈 인수를 복사하려면 템플릿 경로를 사용하십시오.

    ansible/lib/ansible/parsing/yaml/constructor.py
    
    

    알다시피, 앞에서 언급 한 재사용 기능 중 하나를 사용하면 얻을 수있는 루프 반복을 기반으로 다양한 인수를 쉽게 지원하지 않습니다.

    if key in mapping: display.warning('While constructing a mapping from {1}, line {2}, column {3}, found a duplicate dict key ({0}). Using last defined value only.'.format(key, *mapping.ansible_pos))

관련 자료

  • 이전 c - 입력 텍스트 GTK2 + Glade의 값을 얻는 방법
  • 다음 visual studio - MicrosoftBuild 1630 패키지가 netstandard 20 오류와 호환되지 않습니다