저는 여러 작업에서 반복하지 않고 단일 지점에 로직을 유지하기 위해 많은 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_warnings
및
command_warnings
. 이런 종류의 경고도 방지 할 수있는 방법이 있습니까?
- 답변 # 1
- 답변 # 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))
관련 자료
- json - 파이썬에서 중복 텍스트 (딕셔너리 목록)에 중복 UUID를 방지하는 방법은 무엇입니까?
- python - Django에서 중복 신호를 방지하는 방법
- typescript - 결합 된 객체에서 중복 키 방지, {[t의 키에서 k] - t [k]}
- Django 모델은 두 가지 변수를 기반으로 중복 방지
- hibernate - 스프링 부트 API 중복 데이터 생성을 방지하는 방법
- python - pdf 또는 html 파일로 경고가 인쇄되지 않도록하는 방법이 있습니까?
- javascript - Firebase에 업로드 할 때 중복 이미지를 방지하는 방법은 무엇입니까?
- python - 제목 이름으로 복제본이 목록에 추가되지 않도록하려면 어떻게합니까? 이름으로 목록에서 항목을 어떻게 찾습니까?
- asp.net core - foreach 루프에서 중복 ID 필드 생성을 방지하는 방법은 무엇입니까?
- reactjs - 맵 루프 내에서 중복 onChange 값을 방지하는 방법
- java - Jtable 및 MYSQL (데이터베이스)에서 중복 항목을 방지하려면 어떻게해야합니까?
- foreach - 체크리스트 VBNET에서 중복 데이터 삽입 방지
- node.js - mongodb에서 중복 키 오류를 수정하고 방지하는 방법
- python - 순환 스택에서 중복 값을 방지하는 방법은 무엇입니까?
- asp.net - 여러 줄 텍스트 상자에 중복 입력을 방지 할 수 있습니까?
- php - Laravel Blade 파일에서 foreach 루프에 중복이 표시되지 않도록하려면 어떻게해야합니까?
- Ansible : 명령의 stdout을 새 변수에 저장 하시겠습니까?
- Azure Cloud에서 사용 가능한 동적 인벤토리가 작동하지 않습니다
- 오류! Ansible Controller에서 vars 파일 vars를 찾을 수 없음
- 사용 가능한 목록의 기본값을 사전으로 정의
- usnig echo 모듈을 사용할 때 발생 가능한 매핑 값 문제
- ansible - 플레이 북을 실행하는 동안 명령 줄에 여러 인벤토리 파일을 추가하는 방법
- 반환 된 json 데이터에서 속성을 가져 오는 데 사용할 수있는 플레이 북
- 내부에서 지원 가능한 조건을 차단합니다
- Ansible Git 클론 탈출 특수 문자
- amazon ec2 - instance_initiated_shutdown_behavior = 스팟 인스턴스에는 중지가 지원되지 않습니다
Ansible 2.9.0부터, 이것은
ANSIBLE_DUPLICATE_YAML_DICT_KEY
를 설정함으로써 달성 될 수 있습니다ignore
에 환경 변수 . 이 변수의 다른 가능한 값은warn
입니다. 이는 기본이며 원래 동작을 유지하며error
플레이 북 실행에 실패합니다.구현에 대한 자세한 내용은이 풀 요청을 참조하십시오.