2013-07-22 23 views
10

kịch bản sử dụng dữ liệu của tôidữ liệu người dùng (cloud-init) kịch bản không thực hiện trên EC2

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

mà được đưa từ lệnh:

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

nhưng khi tôi kiểm tra các tập tin /var/log/cloud-init.log , số tail -n 5 là:

[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 

Tôi cũng đã xác minh rằng curl http://169.254.169.254/latest/user-data trả về tệp của tôi theo ý định ed.

và không có lỗi nào khác hoặc đầu ra của tập lệnh của tôi xảy ra. làm thế nào để tôi nhận được tập tin dữ liệu người dùng thực thi khi khởi động đúng cách?

Trả lời

14

Cloud-init không chấp nhận các tập lệnh bash thuần túy, giống như vậy. Đó là một con thú ăn tập tin YAML định nghĩa cá thể của bạn (các gói, khóa ssh và các thứ khác).

Sử dụng MIME bạn cũng có thể gửi các tập lệnh shell tùy ý, nhưng bạn phải mã hóa 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 

Tệp kết hợp userdata.txt là tệp bạn muốn dán ở đó.

Thông tin thêm ở đây:

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

Cũng lưu ý, điều này rất phụ thuộc vào hình ảnh mà bạn đang sử dụng. Nhưng bạn nói nó thực sự là hình ảnh dựa trên đám mây, vì vậy điều này sẽ áp dụng. Có các trình khởi tạo đám mây khác không được đặt tên là cloud-init - sau đó nó có thể khác.

+2

ah Tôi thấy - mọi thứ phải được mã hóa MIME. Tôi đang sử dụng AMI Linux amazon chung, nhưng tôi thấy quy trình 'cloud-init' trong nhật ký khởi động, vì vậy tôi cho rằng nó giống với hương vị ubuntu. – lollercoaster

+1

Bạn không cần phải mã hóa MIME cho các phiên bản chạy ec2. Cloud-init có thể yêu cầu dữ liệu ở một định dạng cụ thể, nhưng Amazon sẽ xử lý dữ liệu đó cho bạn - xem http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonLinuxAMIBasics.html#CloudInit MIME/Base64/gzip mã hóa là tùy chọn - tập lệnh của bạn chỉ cần bắt đầu bằng #! –

+0

Điểm tốt, tôi sử dụng OpenStack ... – lzap

12

Thực tế, cloud-init cho phép một tập lệnh shell đơn lẻ làm đầu vào (mặc dù bạn có thể muốn sử dụng bản lưu trữ MIME cho các thiết lập phức tạp hơn).

Sự cố với tập lệnh của OP là dòng đầu tiên không chính xác. Bạn nên sử dụng một cái gì đó như thế này:

#!/bin/sh 

Lý do cho điều này là, trong khi đám mây-init sử dụng #! để nhận ra một kịch bản sử dụng, hệ điều hành cần có một dòng công việc hoàn chỉnh để thực thi kịch bản. Vì vậy, những gì đang xảy ra trong trường hợp của OP là điện toán đám mây-init hoạt động chính xác (tức là nó tải xuống và cố gắng chạy tập lệnh) nhưng hệ điều hành không thể thực thi nó.


Xem: Shebang (Unix) trên Wikipedia

+2

[Tài liệu trên điện toán đám mây-init có phần gây hiểu nhầm ở đây] (http://cloudinit.readthedocs.org/en/latest/topics/format.html#user-data-script), trong đó nó ghi "Bắt đầu bằng:' # ! 'hoặc' Loại nội dung: văn bản/x-shellscript' khi sử dụng một bản lưu trữ MIME. " Tôi có thể thấy một người nào đó có thể không nhận ra điều đó! cần bao gồm đường dẫn sau shebang. –

+0

Không chỉ gây hiểu nhầm mà còn rất kém để bắt đầu. Có rất ít ví dụ về cách làm việc này với nhau để làm việc, và sau đó nó bị hỏng cho một số hình ảnh? gcloud "chỉ hoạt động". Tại sao thiếu tài liệu (hoặc không chính xác)? Cũng cần có một ví dụ để sử dụng tệp, nhưng ngay cả cú pháp cho việc này cũng không rõ ràng. – mckenzm

2

Đây là một cặp vợ chồng tuổi bây giờ, nhưng đối với những người khác được hưởng lợi tôi đã cùng một vấn đề, và nó bật ra rằng đám mây-init được chạy hai lần, từ bên /etc/rc3.d. Xóa các tệp này bên trong thư mục cho phép userdata chạy đúng:

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 
Các vấn đề liên quan