Como escapar em YAML da maneira correta?

3

No CentOS 7, estou usando o cloud-init para desmembrar um droplet usando a DigitalOcean API, que requer a formatação YAML.

Eu consegui a maioria das peças funcionando bem, mas luto para escapar dos comandos em execução no 'runcmd' abaixo:

#!/bin/sh

set -e     # Stop on first error

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

    users:
    - name: SomeUser
      groups: wheel
      shell: /bin/bash
      ssh-authorized-keys:
              - ssh-dss AAAABBBBCCCCDDDDD...

    runcmd:
    - sed -i -e '$aAllowUsers SomeUser' /etc/ssh/sshd_config
    - sed -i -e '/PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
    - service sshd restart
"}'

Os erros que recebo são:

curl: (6) Could not resolve host: no
curl: (3) [globbing] unmatched close brace/bracket in column 63
    
por frank 12.01.2015 / 11:21

2 respostas

1

Você está usando as aspas simples para as opções -d da linha de comando, tanto para especificar strings separadas por $variable quanto para citar o argumento para o segundo comando sed .

Para $aAllowUsers SomeUser , isso pode ser o que você deseja, mas, para /PermitRootLogin/s/^.*$/PermitRootLogin no/ , isso provavelmente não é o que você deseja que /bin/sh expanda. Colocar barras invertidas deve ajudar:

   - sed -i -e \'/PermitRootLogin/s/^.*$/PermitRootLogin no/\' /etc/ssh/sshd_config

O YAML não deve ter nenhum problema com esse item de lista com aspas simples no meio do valor escalar.

    
por 11.06.2015 / 11:09
2

Use heredoc para essa entrada. E você precisa escapar de novas linhas e citações porque elas não são permitidas na sua construção appliaction/json .

user_data=$(awk -v 'ORS=\n' 1 <<'HERE' | sed 's/"/\"/g'
#cloud-config

users:
- name: SomeUser
  groups: wheel
  shell: /bin/bash
  ssh-authorized-keys:
  - ssh-dss AAAABBBBCCCCDDDDD...

runcmd:
- sed -i -e '$aAllowUsers SomeUser' /etc/ssh/sshd_config
- sed -i -e '/PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
- service sshd restart
HERE
)

curl -X POST https://api.digitalocean.com/v2/droplets \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $api_key" \
-d - <<HERE 
{
  "name": "$droplet_name",
  "region": "$region",
  "size": "$size",
  "image": "$image", 
  "ssh_keys": "$root_ssh_pub_key",
  "backups": false,
  "ipv6": false,
  "private_networking": false,
  "user_data": "$user_data"
}
HERE
    
por 11.06.2015 / 14:59