CentOS 7에서는 cloud-init를 사용하여 YAML 형식이 필요한 DigitalOcean API를 사용하여 Droplet을 생성합니다.
대부분의 부품은 제대로 작동하지만 아래 "runcmd"에서 실행되는 명령을 이스케이프 처리하는 데 문제가 있습니다.
#!/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
"}'
내가 받은 오류는 다음과 같습니다.
curl: (6) Could not resolve host: no
curl: (3) [globbing] unmatched close brace/bracket in column 63
답변1
그러한 입력에는 heredoc을 사용하십시오. 그리고 개행 문자와 따옴표는 구문 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
답변2
-d
구분된 문자열을 지정 $variable
하고 두 번째 명령에 대한 인수를 인용하려면 명령줄 옵션에 작은따옴표를 사용합니다 sed
.
아마도 $aAllowUsers SomeUser
그것이 당신이 원하는 것일 수도 있지만 확장 /PermitRootLogin/s/^.*$/PermitRootLogin no/
하고 싶은 것이 아닐 수도 있기 때문입니다 /bin/sh
. 백슬래시를 추가하면 도움이 됩니다.
- sed -i -e \'/PermitRootLogin/s/^.*$/PermitRootLogin no/\' /etc/ssh/sshd_config
YAML은 스칼라 값 중간에 작은따옴표가 있는 목록 항목에 대해 문제를 일으키지 않습니다.