yq를 사용하여 yaml에서 DNS 서버를 변경하는 방법은 무엇입니까?

yq를 사용하여 yaml에서 DNS 서버를 변경하는 방법은 무엇입니까?

이것은 내 yaml 파일입니다.

network:
  ethernets:
    ens160:
      addresses:
      - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
        - 1.1.1.1
        - 2.2.2.2
        - 3.3.3.3
        - 4.4.4.4
        search:
        - our.domain

ens160 아래의 모든 DNS 주소를 두 개의 특정 주소로 바꿔야 합니다. 이것을 사용해 보세요:

yq write -i /etc/netplan/00-installer-config.yaml  '.network.ethernets.ens160.nameservers.addresses' ['10.10.10.53','10.10.10.54']

그러나 이것이 하는 일은 모든 목록 항목을 다음과 같은 목록으로 전송하는 것뿐입니다.

network:
  ethernets:
    ens160:
      addresses:
        - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
          - 1.1.1.1
          - 2.2.2.2
          - 3.3.3.3
          - 4.4.4.4
        search:
          - our.domain

나는 그것을 원하지 않습니다. 다음과 같이 출력이 필요합니다.

network:
  ethernets:
    ens160:
      addresses:
      - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
        - 10.10.10.53
        - 10.10.10.54
        search:
        - our.domain

어떻게 해야 할지 확실하지 않습니다 yq. 어떻게 해야 합니까?

답변1

어떤 이유로든 apt 저장소에서 해당 버전을 가져올 수 없습니다.

결국 최신 버전을 설치했고 이 명령을 사용하면 작동합니다.

yq -i '.network.ethernets.ens160.nameservers.addresses = ["10.10.10.53","10.10.10.54"]' /etc/netplan/00-installer-config.yaml

답변2

익숙하지 않음마이크 파라yq, 환경 변수를 통해 새 네임서버 주소의 JSON 배열을 전달한 다음 다음을 사용하여 문서의 올바른 경로에 삽입할 것입니다 env().

$ addrs='["10.10.10.53","10.10.10.54"]' yq '.network.ethernets.ens160.nameservers.addresses = env(addrs)' file
network:
  ethernets:
    ens160:
      addresses:
        - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses: ["10.10.10.53", "10.10.10.54"]
        search:
          - our.domain

-i"in-place" 변환을 수행하고 출력을 예쁘게 인쇄하는 옵션을 추가합니다 -P(질문의 예상 출력에 표시된 것처럼 배열이 여러 줄로 확장됩니다).

내가 아는 한, Mike Farah는 yq위 명령에 표시된 대로 JSON 배열로 인코딩하지 않고는 별도의 매개변수를 배열로 사용할 수 없습니다. 그리고안드레이 키슬류크yq, 잘 알려진 JSON 프로세서를 jq둘러싼 래퍼 인 경우 다음을 수행할 수 있습니다.

$ yq -y '.network.ethernets.ens160.nameservers.addresses = $ARGS.positional' file --args 10.10.10.53 10.10.10.54
network:
  ethernets:
    ens160:
      addresses:
        - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
          - 10.10.10.53
          - 10.10.10.54
        search:
          - our.domain

...이것은 Mike를 사용한 것과 거의 동일 yq하지만 명령줄 끝에 추가하여 더 많은 네임서버 주소를 추가할 수 있습니다. 항상 배열이 있으므로 $ARGS.positional명령줄에 문자열만 제공하면 결과 문서에는 올바른 형식의 개별 요소 목록이 포함됩니다.

또는 옵션과 함께 사용하면 yq"내부" 편집이 가능합니다.-i--in-place

관련 정보