buscando dicas para o escape correto de comandos sed dentro de yaml

0

Eu estou tendo dificuldade em encontrar o problema por que linhas de "code" quebram minha configuração do cloud-init. Basicamente eu estou chamando um objeto filho como parte da DigitalOcean API, que tem um formato YAML - eu consegui trabalhar mais, mas consegui reduzir alguns erros. Cheguei a essas linhas:

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

Todos eles funcionam bem se aplicados diretamente no shell remoto, mas tendem a se quebrar se passarem pela API DigitalOcean (objeto filho & YAML) - suponho que não atendi ao formato YAML, mas não consigo ver o que perdi escapar.

Alguma dica?

BTW: Olhando para o cloud-init-output.log, vejo que o blob do yam criado está escrito da seguinte forma:

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

Isso me faz pensar que preciso encontrar uma maneira de escapar do \n de qualquer maneira. Seria este o problema? como eu escapo disso?

    
por frank 08.04.2015 / 21:28

1 resposta

1

Não tenho 100% de certeza de que você pode especificar vários comandos como argumento para o runcmd, mas, se tiver, você deve torná-lo literalmente escalar em 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

Para ver o que um analisador YAML faz a partir disso, você pode fazer o round-trip do yaml e testá-lo. Se o acima estiver em um arquivo input.yml , então

  yaml rt input.yml

reclamará se não puder ser percorrido corretamente ¹.

Certifique-se de carregar esses dados de um arquivo, para que não haja problemas de escape adicionais causados pelo shell (ou python, perl, etc)

¹ Isso foi feito usando o utilitário yaml que vem com ruamel.yaml dos quais Eu sou o autor.

    
por 11.06.2015 / 11:19