User-data (cloud-init) script не выполняется на EC2

мои пользовательские данные script

#!
set -e -x
echo `whoami`
su root
yum update -y
touch ~/PLEASE_WORK.txt

который подается из команды:

ec2-run-instances ami-05355a6c -n 1 -g mongo-group -k mykey -f myscript.sh -t t1.micro -z us-east-1a

но когда я проверяю файл /var/log/cloud-init.log, tail -n 5:

[CLOUDINIT] 2013-07-22 16:02:29,566 - cloud-init-cfg[INFO]: cloud-init-cfg ['runcmd']
[CLOUDINIT] 2013-07-22 16:02:29,583 - __init__.py[DEBUG]: restored from cache type DataSourceEc2
[CLOUDINIT] 2013-07-22 16:02:29,686 - cloud-init-cfg[DEBUG]: handling runcmd with freq=None and args=[]
[CLOUDINIT] 2013-07-22 16:02:33,691 - cloud-init-run-module[INFO]: cloud-init-run-module ['once-per-instance', 'user-scripts', 'execute', 'run-parts', '/var/lib/cloud/data/scripts']
[CLOUDINIT] 2013-07-22 16:02:33,699 - __init__.py[DEBUG]: restored from cache type DataSourceEc2

Я также подтвердил, что curl http://169.254.169.254/latest/user-data возвращает мой файл по назначению.

и никаких других ошибок или результатов моего script не происходит. как я могу получить скрипт пользовательских данных для правильной загрузки?

Ответ 1

Cloud-init не принимает простые сценарии bash, точно так же. Это зверь, который ест файл YAML, который определяет ваш экземпляр (пакеты, ключи ssh и другие материалы).

Используя MIME, вы также можете отправлять произвольные сценарии оболочки, но вы должны MIME-кодировать их.

$ cat my-boothook.txt
#!/bin/sh
echo "Hello World!"
echo "This will run as soon as possible in the boot sequence"

$ cat my-user-script.txt
#!/usr/bin/perl
print "This is a user script (rc.local)\n"

$ cat my-include.txt
# these urls will be read pulled in if they were part of user-data
# comments are allowed.  The format is one url per line
http://www.ubuntu.com/robots.txt
http://www.w3schools.com/html/lastpage.htm

$ cat my-upstart-job.txt
description "a test upstart job"
start on stopped rc RUNLEVEL=[2345]
console output
task
script
echo "====BEGIN======="
echo "HELLO From an Upstart Job"
echo "=====END========"
end script

$ cat my-cloudconfig.txt
#cloud-config
ssh_import_id: [smoser]
apt_sources:
 - source: "ppa:smoser/ppa"

$ ls
my-boothook.txt     my-include.txt      my-user-script.txt
my-cloudconfig.txt  my-upstart-job.txt

$ write-mime-multipart --output=combined-userdata.txt \
   my-boothook.txt:text/cloud-boothook \
   my-include.txt:text/x-include-url \
   my-upstart-job.txt:text/upstart-job \
   my-user-script.txt:text/x-shellscript \
   my-cloudconfig.txt

$ ls -l combined-userdata.txt 
-rw-r--r-- 1 smoser smoser 1782 2010-07-01 16:08 combined-userdata.txt

Комбинированный userdata.txt - это файл, который вы хотите вставить туда.

Подробнее здесь:

https://help.ubuntu.com/community/CloudInit

Также обратите внимание, что это сильно зависит от используемого вами изображения. Но вы говорите, что это действительно основанный на облаке образ, поэтому это применимо. Существуют другие инициаторы облаков, которые не называются cloud-init - тогда это может быть другим.

Ответ 2

Фактически, cloud-init позволяет использовать одну оболочку script в качестве входного (хотя вы можете использовать архив MIME для более сложных настроек).

Проблема с OP script заключается в том, что первая строка неверна. Вы должны использовать что-то вроде этого:

#!/bin/sh

Причиной этого является то, что, в то время как cloud-init использует #! для распознавания пользователя script, операционная система нуждается в полной строке shebang для выполнения script.

Итак, что происходит в случае OP, так это то, что cloud-init ведет себя правильно (т.е. загружает и пытается запустить script), но операционная система не может его выполнить.


Смотрите: Шебанг (Unix) в Википедии

Ответ 3

Сейчас уже пару лет, но для других я получал такую ​​же проблему, и оказалось, что cloud-init работает дважды, изнутри /etc/rc3.d. Удаление этих файлов внутри папки позволило правильной работе userdata:

lrwxrwxrwx  1 root root   22 Jun  5 02:49 S-1cloud-config -> ../init.d/cloud-config
lrwxrwxrwx  1 root root   20 Jun  5 02:49 S-1cloud-init -> ../init.d/cloud-init
lrwxrwxrwx  1 root root   26 Jun  5 02:49 S-1cloud-init-local -> ../init.d/cloud-init-local