Erro no yaml - possivelmente devido a uma fuga errada, mas incapaz de identificar o problema

0

A linha abaixo causa um erro (... request body malformed."} ). É parte de um user-data.yml para uso com o cloud-init como parte da API digital do oceano para inicializar um servidor após a criação.

sed -ie '\$a\ \n\#Add logfile information\nlogfile /var/log/ntp.log' /etc/ntp.conf

Basicamente, ele deve fazer o seguinte:

  • acrescente uma linha vazia
  • adicione um comentário na próxima linha
  • adicione uma string a próxima linha

Estou carregando o user-data.yml de um script bash como segue:

curl -X POST "https://api.digitalocean.com/v2/droplets" \
-d'{"name":"'$droplet_name'",
"region": "'$region'",
"size": "'$size'",
"image": "'$image'",
"backups":false,
"ipv6":false,
"private_networking":false,
"user_data":
"'"$(cat /user-data.yaml)"'",
  "ssh_keys": '$root_ssh_pub_key'}' \
  -H "Authorization: Bearer $api_key" \
  -H "Content-Type: application/json"

Depois de algumas horas invadindo tudo, eu simplesmente posso ser cego de código.

    
por frank 19.03.2016 / 10:49

2 respostas

0

Seu sed dá "regex sem terminação" no meu sistema, você provavelmente quer fazer algo como:

echo abc > xy
sed -ie '$a\n#Add logfile information\nlogfile /var/log/ntp.log' xy
cat xy

que dá:

abc

#Add logfile information
logfile /var/log/ntp.log

Quanto ao upload de YAML, não tenho certeza se isso influencia ou não o que você acrescenta. Se você não puder verificar os dados enviados, recomendo gerar o YAML expandido, escrevendo-o para arquivar um xyz.yaml e, em seguida, fazer o upload com curl usando -d @xyz.yaml . Isso dá a você a chance de fazer o upload exato do esperado.

    
por 19.03.2016 / 12:48
0

Finalmente consertado sozinho ...

Você deve trabalhar com a API DO e seguir alguns tutoriais como this ( meio do artigo de referência) é provável que você execute um dos seguintes erros.

Erro 1 leva a algo como ...request body malformed Para resolver isso, certifique-se de que você não esqueceu de escapar de qualquer string / charackter no yaml.

O erro 2 não causará problemas à primeira vista. Sua solicitação de API é executada, a gotícula é girada e, a menos que você não tenha feito nenhuma fantasia, você pode até não notar (se você não verificar o que seu script fez no sistema ...). Verificar os logs do cloud-init, no entanto, mostrará que failed loading yaml blob . Isso é causado quando os characks que precisam de escape não escapam com frequência suficiente (?!).

Exemplo:

  • Isso resultará em erro 1 (perdeu para escapar do charckter dólar): sed -i -e '$a\ \n#Add logfile information\nlogfile /var/log/ntp.log' /etc/ntp.conf
  • Isso resultará em Erro 2 (o dólar é escapado corajosamente, mas escape simples não é suficiente aqui ...): sed -i -e '\$a\ \n#Add logfile information\nlogfile /var/log/ntp.log' /etc/ntp.conf

Então a solução é: sed -i -e '\$a\ \n#Add logfile information\nlogfile /var/log/ntp.log' /etc/ntp.conf

Se alguém realmente estiver lendo e entender o quão frustrada eu estou, por favor me avise se você puder explicar o que está acontecendo aqui ... - na verdade eu não estou realmente interessado nisso novamente, mas do outro lado eu estou sempre disposto a aprender.

A única razão que eu entenderia: Como o script bask puxa um yaml e esse grupo é enviado através do shell remoto no json, ele precisa de um pouco mais de "cuidado" e, portanto, de escapar em dobro!

    
por 19.03.2016 / 17:32

Tags