2013-07-22 21 views
10

mój skrypt użytkownika danedane użytkowników (cloud-startowych) skrypt nie wykonywanie na EC2

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

który jest zasilany z poleceniem:

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

ale kiedy sprawdzić plik /var/log/cloud-init.log The tail -n 5 jest:

[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 

ja również sprawdzeniu, że curl http://169.254.169.254/latest/user-data wraca mój plik jako zamierzają ed.

i nie ma żadnych innych błędów ani wyników mojego skryptu. w jaki sposób mogę poprawnie załadować skrypt danych użytkownika podczas uruchamiania?

Odpowiedz

14

Cloud-init nie akceptuje zwykłych skryptów Bash, tak po prostu. To bestia, która zjada plik YAML, który definiuje twoją instancję (pakiety, klucze ssh i inne rzeczy).

Za pomocą MIME można również wysyłać dowolne skrypty powłoki, ale trzeba je kodować 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 

Połączony plik userdata.txt to plik, który chcesz wkleić.

Więcej informacji tutaj:

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

Należy również pamiętać, to bardzo zależy od obrazu, którego używasz. Ale mówisz, że to jest naprawdę obraz oparty na chmurze, więc to dotyczy. Istnieją inne inicjatory chmurowe, które nie są nazywane chmurą-init - wtedy może być inaczej.

+2

ah widzę - wszystko musi być kodowane MIME. Używam generycznego AMI amazon linux, ale widzę proces 'cloud-init' w dziennikach uruchamiania, więc założyłem, że był taki sam jak smak ubuntu. – lollercoaster

+1

Nie musisz używać skryptów MIME dla instancji-uruchomień ec2. Cloud-init może wymagać danych w określonym formacie, ale Amazon się o to troszczy - patrz http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonLinuxAMIBasics.html#CloudInit MIME/Base64/gzip kodowania są opcjonalne - Twój skrypt musi zacząć od #! –

+0

Dobrze, że używam OpenStack ... – lzap

12

Właściwie, cloud-init zezwala na skrypt powłoki pojedynczej jako dane wejściowe (choć możesz chcieć użyć archiwum MIME do bardziej złożonych konfiguracji).

Problem ze skryptem OP polega na tym, że pierwszy wiersz jest niepoprawny. Należy używać coś takiego:

#!/bin/sh 

Powodem tego jest to, że podczas gdy chmury startowych używa #! rozpoznawać skrypt użytkownika, system operacyjny potrzebuje kompletną linię shebang w celu wykonania skryptu.

To, co dzieje się w przypadku OP, polega na tym, że cloud-init zachowuje się poprawnie (to znaczy pobiera i próbuje uruchomić skrypt), ale system operacyjny nie jest w stanie go wykonać.


Patrz: Shebang (Unix) Wikipedia

+2

[Dokumentacja dotycząca chmury-init jest tu nieco myląca] (http://cloudinit.readthedocs.org/en/latest/topics/format.html#user-data-script), gdzie stwierdza: "Zaczyna się od:' # ! 'lub' Content-Type: text/x-shellscript' podczas korzystania z archiwum MIME. " Widzę, jak ktoś może nie zdawać sobie z tego sprawy #! musi zawierać ścieżkę po shebangu. –

+0

Nie tylko wprowadzające w błąd, ale bardzo ubogie, aby zacząć. Istnieje bardzo niewiele przykładów tego, jak należy je połączyć, a następnie jest on uszkodzony w przypadku niektórych obrazów? gcloud "po prostu działa". Dlaczego brak (lub niepoprawna) dokumentacji? Powinien istnieć przykład użycia pliku, ale nawet składnia tego nie jest jasna. – mckenzm

2

Jest kilka lat teraz, ale inni korzystają miałem ten sam problem, i okazało się, że chmura-startowych biegał dwa razy, od wewnątrz /etc/rc3.d. Usunięcie tych plików w folderze pozwoliło userdata aby funkcjonować poprawnie:

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