yaml에서 sed 명령을 올바르게 이스케이프하는 방법에 대한 팁을 찾고 있습니다.

yaml에서 sed 명령을 올바르게 이스케이프하는 방법에 대한 팁을 찾고 있습니다.

다음 "코드" 줄이 내 cloud-init 구성을 중단하는 이유를 파악하는 데 어려움을 겪고 있습니다. 기본적으로 저는 YAML 형식을 사용하는 DigitalOcean API의 일부로 하위 개체를 호출합니다. 대부분은 작동했지만 몇 가지 오류를 줄여 다음 줄로 요약할 수 있었습니다.

sed -i -n '/<Directory \/>/\{p;:a;N;/<\/Directory>/!ba;s/.*\n/    Options -Indexes\n    AllowOverride none\n    Require all denied\n/\};p'  /etc/httpd/conf/httpd.conf

sed -i -e '$a\ \n#Grant localhost  access to query or modify\nrestrict 127.0.0.1\nrestrict ::1' /etc/ntp.conf

sed -i -e '$a\ \n#Add local clock as backup\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10' /etc/ntp.conf

원격 셸에 직접 적용하면 모두 잘 작동하지만 DigitalOcean API(하위 개체 및 YAML)를 통해 적용하면 충돌이 발생하는 경향이 있습니다. YAML 형식을 따르지 않는다고 가정하지만 무엇을 볼 수 없습니다. 탈출하다 보니 실종됐어요.

어떤 팁이 있나요?

참고: cloud-init-output.log를 보면 생성된 yam blob이 다음과 같이 기록되어 있는 것을 볼 수 있습니다.

- sed -i -e '$a#Add local clock as backup
server 127.127.1.0
fudge 127.127.1.0 stratum 10' /etc/ntp.conf

무슨 일이 있어도 탈출할 방법을 찾아야 한다는 느낌이 들었습니다 \n. 이것이 문제가 될 수 있습니까? 어떻게 하면 이것을 피할 수 있나요?

답변1

여러 명령을 runcmd에 대한 인수로 지정할 수 있는지 100% 확신할 수는 없지만, 그렇게 하는 경우 YAML에서 리터럴 스칼라로 만들어야 합니다.

runcmd: |
  sed -i -n '/<Directory \/>/\{p;:a;N;/<\/Directory>/!ba;s/.*\n/    Options -Indexes\n    AllowOverride none\n    Require all denied\n/\};p'  /etc/httpd/conf/httpd.conf
  sed -i -e '$a\ \n#Grant localhost  access to query or modify\nrestrict 127.0.0.1\nrestrict ::1' /etc/ntp.conf
  sed -i -e '$a\ \n#Add local clock as backup\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10' /etc/ntp.conf

YAML 파서가 이를 어떻게 처리하는지 보려면 yaml을 왕복하고 테스트할 수 있습니다. 위의 내용이 파일에 input.yml있으면

  yaml rt input.yml

올바르게 앞뒤로 이동할 수 없으면 불평합니다.

셸(또는 Python, Perl 등)로 인해 발생하는 다른 이스케이프 문제가 없도록 이 데이터를 파일에서 업로드해야 합니다.


1이 작업은 포함된 유틸리티를 사용하여 수행 됩니다 .yamlrummel.yaml나는 그것의 저자입니다.

관련 정보