2013-07-22 2 views
10

내 사용자 데이터 스크립트를 실행하지 명령에서 공급된다사용자 데이터 (클라우드 초기화) 스크립트는 EC2

#! 
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.logtail -n 5이다 : 나는 또한 의도 한대로 curl http://169.254.169.254/latest/user-data 내 파일을 반환하는 것을 확인했습니다

[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 

에드.

다른 오류 또는 스크립트 출력이 발생하지 않습니다. 부팅시 사용자 데이터 스크립트를 올바르게 실행하려면 어떻게해야합니까?

답변

14

Cloud-init은 일반 bash 스크립트를 허용하지 않습니다. 인스턴스 (패키지, ssh 키 및 기타 물건)를 정의하는 YAML 파일을 먹는 짐승입니다.

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 

combined-userdata.txt는 여기에 붙여 넣을 파일입니다. 여기

더 많은 정보는 :

또한

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

주의, 이것은 매우 사용중인 이미지에 따라 달라집니다. 하지만 클라우드 기반 이미지이기 때문에 실제로 적용됩니다. cloud-init으로 명명되지 않은 다른 클라우드 개시자가 있습니다. 그러면 다른 것일 수 있습니다.

+2

아 - 모든 내용이 MIME로 인코딩되어야합니다. 나는 일반적인 amazon linux AMI를 사용하고 있지만, startup 로그에'cloud-init' 프로세스가 있으므로 우분투와 동일하다고 가정했습니다. – lollercoaster

+1

ec2-run-instances에 대해 스크립트를 MIME 인코딩 할 필요가 없습니다. Cloud-init은 특정 형식의 데이터가 필요할 수 있지만 아마존이 처리합니다. http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonLinuxAMIBasics.html#CloudInit MIME/Base64/gzip을 참조하십시오. 인코딩은 옵션입니다 - 스크립트는 #로 시작해야합니다! –

+0

좋은 점, OpenStack을 사용합니다 ... – lzap

12

실제로 cloud-init은 하나의 쉘 스크립트를 입력으로 허용합니다 (더 복잡한 설정을 위해 MIME 아카이브를 사용하고 싶을 수도 있음).

OP 스크립트의 문제는 첫 번째 줄이 잘못되었다는 것입니다. 이 같은 것을 사용해야합니다

#!/bin/sh 

이유는 클라우드 초기화는 사용자 스크립트를 인식 할 수 #!을 사용하는 반면, 운영 체제가 스크립트를 실행하기 위해 완전한 오두막 라인을 필요로한다는 것이다.

그래서 OP의 경우 클라우드 초기화가 올바르게 작동합니다 (즉, 다운로드하여 스크립트를 실행하려고 시도합니다). 그러나 운영 체제가 실제로이를 실행할 수 없습니다.


참조 : Shebang (Unix) 위키 백과

+2

[cloud-init에 관한 문서는 다소 오해의 소지가 있습니다.] (http://cloudinit.readthedocs.org/en/latest/topics/format.html#user-data-script), 여기에는 "Begins with : # # MIME 아카이브를 사용할 때! "또는"Content-Type : text/x-shellscript " 나는 누군가가 그것을 깨닫지 못할 수도있는 것을 볼 수있다 #! 주술사 다음의 경로를 포함해야합니다. –

+0

오해의 소지가있을뿐만 아니라 시작하기에 매우 가난합니다. 이것을 어떻게 조합하여 작동시켜야하는지에 대한 예는 거의없고, 일부 이미지에서는 깨져 보입니까? gcloud "그냥 작동". 왜 문서의 부족 (또는 부정확)? 파일 사용에 대한 예가 있어야하지만이 구문도 명확하지 않습니다. – mckenzm

2

에이 이제 오래된 몇 년이지만, 다른 사람의 이익을 위해 저도 같은 문제가 있었는데, 그것은 클라우드 초기화가 /etc/rc3.d 내부에서 두 번 실행 한 것으로 밝혀졌다. 폴더 내에서 이러한 파일을 삭제하면 사용자 데이터가 올바르게 실행될 수있었습니다.

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