2014-11-23 8 views
22

Tôi đã tìm kiếm rất nhiều chủ đề về "tập lệnh dữ liệu người dùng không hoạt động" trong vài ngày này, nhưng cho đến bây giờ, tôi chưa nhận được bất kỳ ý tưởng về trường hợp của tôi được nêu ra, xin vui lòng giúp tôi để tìm ra những gì đã xảy ra, cảm ơn rất nhiều!Các tập lệnh dữ liệu người dùng không chạy trên AMI tùy chỉnh của tôi, nhưng hoạt động trong Linux chuẩn của tôi

Theo AWS User-data giải thích:

Khi bạn khởi động một thể hiện ở Amazon EC2, bạn có tùy chọn thông qua dữ liệu người dùng đến ví dụ có thể được sử dụng để thực hiện nhiệm vụ cấu hình tự động thông thường và các kịch bản thậm chí chạy sau khi cá thể bắt đầu.

Vì vậy, tôi đã cố gắng để vượt qua sử dụng dữ liệu của riêng tôi khi dụ ra mắt, đây là sử dụng dữ liệu của tôi:

#/bin/bash

echo 'test'>/home! /ec2-user/user-script-output.txt

Nhưng không có file trong đường dẫn này: /home/ec2-user/user-script-output.txt

Tôi đã kiểm tra /var/lib/cloud/instance/user-data.txt, tệp này tồn tại và giống như tập lệnh dữ liệu người dùng của tôi.

Ngoài ra tôi đã kiểm tra nhật ký trong /var/log/cloud-init.log, không có thông báo lỗi.

Nhưng tập lệnh dữ liệu người dùng đang hoạt động nếu tôi khởi chạy phiên bản mới với Linux của Amazon (2014.09.01), nhưng tôi không chắc chắn về sự khác biệt giữa AMI (dựa trên Linux của Amazon) và Linux của Amazon.

Phần khác nhau duy nhất tôi thấy là nếu tôi chạy kịch bản này:

sudo yum danh sách cài đặt | grep cloud-init

My AMI:

đám mây init.noarch 0.7.2-8.33.amzn1 @ AMZN-chính

Amazon linux:

cloud-init.noarch 0.7.2-8.33.amzn1 cài đặt

Tôi không chắc đây là lý do?

Nếu bạn cần thêm thông tin, vui lòng cung cấp, vui lòng cho tôi biết điều gì đã xảy ra trong AMI của riêng tôi và cách khắc phục sự cố?

cảm ơn nhiều

Cập nhật

Chỉ cần tìm thấy một câu trả lời từ post này,

Nếu tôi thêm # đám mây boothook ở phía trên cùng của tập tin dữ liệu người dùng, nó hoạt động!

#cloud-boothook 
#!/bin/bash 
echo 'test' > /home/ec2-user/user-script-output.txt 

Nhưng vẫn không chắc chắn lý do.

Trả lời

0

Dữ liệu người dùng sẽ hoạt động tốt mà không sử dụng #cloud-boothook (được sử dụng để kích hoạt Dữ liệu người dùng trong thời gian sớm nhất có thể trong quá trình khởi động).

tôi bắt đầu một Amazon Linux AMI mới và sử dụng tài khoản của bạn Dữ liệu, cộng với một chút thêm:

#!/bin/bash 

echo 'bar' > /tmp/bar 
echo 'test' > /home/ec2-user/user-script-output.txt 
echo 'foo' > /tmp/foo 

này tạo thành công ba tập tin.

Tập lệnh dữ liệu người dùng được thực thi dưới dạng root, vì vậy cần có quyền tạo tệp ở bất kỳ vị trí nào.

Tôi nhận thấy rằng trong mã được cung cấp của bạn, một ví dụ đề cập đến /home/ec2-user/user-script/output.txt (với thư mục con) và một ví dụ đề cập đến /home/ec2-user/user-script-output.txt (không có thư mục con). Lệnh sẽ dễ hiểu nếu bạn cố gắng tạo một tệp trong thư mục không tồn tại, nhưng ví dụ "Cập nhật" của bạn dường như cho thấy rằng nó thực sự hoạt động.

+0

Cảm ơn cho câu trả lời, xin lỗi về điều đó, các /home/ec2-user/user-script/output.txt là typo, đã cố định nó, cho bây giờ tôi vẫn không biết tại sao nó không hoạt động nếu tôi xóa # cloud-boothook, vẫn cố gắng tìm ra – Kai

3

Như tôi đã thử nghiệm, có một số dữ liệu khởi động trong thư mục /var/lib/cloud. Sau khi tôi xóa thư mục đó, Dữ liệu người dùng tập lệnh hoạt động bình thường.

rm -rf /var/lib/cloud/* 
15

User_data chỉ chạy lúc khởi động đầu tiên. Vì hình ảnh của bạn là hình ảnh tùy chỉnh, tôi cho rằng nó đã được bắt đầu một lần và do đó user_data bị hủy kích hoạt.

Đối với cửa sổ, bạn có thể thực hiện bằng cách chọn hộp trong Ec2 Services Properties. Tôi đang xem tại thời điểm làm thế nào để làm điều đó một cách tự động ở phần cuối của việc tạo ra hình ảnh tùy chỉnh.

Đối với Linux, tôi cho rằng cơ chế này giống nhau và user_data cần phải được kích hoạt lại trên hình ảnh tùy chỉnh của bạn.

#cloud-boothook làm cho nó hoạt động bởi vì nó thay đổi tập lệnh từ cơ chế user_data thành cloud-boothook cơ chế chạy trên mỗi lần bắt đầu.


EDIT:

Đây là đoạn mã để kích hoạt lại bắt đầu trên cửa sổ sử dụng PowerShell:

$configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\Config.xml" 
[xml] $xdoc = get-content $configFile 
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2HandleUserData"} |%{ $_.State = "Enabled" } 
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2SetComputerName"} |%{ $_.State = "Enabled" } 
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile 

$configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\BundleConfig.xml" 
[xml] $xdoc = get-content $configFile 
$xdoc.SelectNodes("//Property") |?{ $_.Name -eq "AutoSysprep"} |%{ $_.Value = "Yes" } 
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile 

(Tôi biết linux câu hỏi tập trung, nhưng nó có thể giúp đỡ người khác ...)

0

Tôi đang sử dụng CentOS và logic cho userdata đơn giản:

  • Trong file cục bộ có một cuộc gọi cho một kịch bản initial.sh, nhưng có vẻ cho một lá cờ đầu tiên:

    if [ -f /var/tmp/initial ]; then 
        /var/tmp/initial.sh & 
    fi 
    

initial.sh là tập tin đó thực hiện dữ liệu người dùng, nhưng cuối cùng nó xóa cờ.Vì vậy, nếu bạn muốn AMI mới của mình thực thi lại dữ liệu người dùng, chỉ cần tạo lại cờ trước khi tạo hình ảnh:

touch /var/tmp/initial 
1

Tôi cũng gặp phải vấn đề tương tự trên Ubuntu 16.04 hvm AMI. Tôi đã nêu vấn đề hỗ trợ AWS nhưng tôi vẫn không thể tìm ra lý do chính xác/lỗi nào ảnh hưởng đến nó.

Nhưng tôi vẫn có thứ có thể giúp bạn.

Trước khi dùng AMI xóa/var/lib/thư mục đám mây (mỗi lần). Sau đó, trong khi tạo hình ảnh, đặt nó thành không khởi động lại.

Nếu những thứ này vẫn không hoạt động, bạn có thể kiểm tra thêm bằng cách buộc dữ liệu người dùng chạy thủ công. Cũng tailf /var/log/cloud-init-output.log cho trạng thái đám mây-init. Nó sẽ kết thúc với một cái gì đó như mô-đun: cuối cùng để làm cho dữ liệu người dùng của bạn chạy. Nó không nên bị mắc kẹt trên các mô-đun: config.

sudo rm -rf /var/lib/cloud/* sudo cloud-init init sudo cloud-init modules -m final

Tôi không có nhiều ý tưởng cho dù lệnh trên sẽ làm việc trên CentOS hay không. Tôi đã thử nghiệm nó trên Ubuntu.

Trong trường hợp của tôi, tôi cũng đã thử xóa/var/lib/cloud directory, nhưng vẫn không thể thực thi dữ liệu người dùng trong kịch bản của chúng tôi. Nhưng tôi đã đưa ra giải pháp khác cho nó. Những gì chúng tôi đã làm là chúng tôi đã tạo ra kịch bản với các lệnh trên và làm cho kịch bản đó chạy trong khi khởi động hệ thống.

Tôi đã thêm dòng dưới đây vào /etc/rc.local để làm cho nó xảy ra.

sudo bash /home/ubuntu/force-user-data.sh || exit 1

Nhưng ở đây là đánh bắt, nó sẽ thực thi kịch bản trên mỗi khởi động như vậy mà sẽ làm cho dữ liệu người dùng của bạn để chạy mỗi khi khởi động duy nhất, giống như # đám mây boothook. Không phải lo lắng, bạn chỉ có thể tinh chỉnh nó bằng cách chỉ xóa chính force-user-data.sh ở cuối. Vì vậy, force-user-data.sh của bạn sẽ trông giống như

#!/bin/bash sudo rm -rf /var/lib/cloud/* sudo cloud-init init sudo cloud-init modules -m final sudo rm -f /home/ubuntu/force-user-data.sh exit 0

tôi sẽ đánh giá cao nếu ai đó có thể đặt một số đèn trên lý do tại sao nó là không thể thực hiện các dữ liệu người dùng.

0

Tôi gặp nhiều rắc rối với điều này. Tôi sẽ cung cấp chi tiết đi bộ mặc dù.

nếp nhăn bổ sung của tôi là tôi đang sử dụng terraform để khởi tạo máy chủ thông qua cấu hình khởi chạy và nhóm tự động tính toán.

Tôi KHÔNG thể làm cho nó hoạt động bằng cách thêm các inline kịch bản trong lc.tf

user_data     = DATA << 
" 
#cloud-boothook 
#!/bin/bash 
echo 'some crap'\' 
" 
DATA 

tôi có thể lấy nó từ dữ liệu người dùng,

wget http://169.254.169.254/latest/user-data 

nhưng nhận thấy tôi đã nhận được nó với vẫn còn dấu ngoặc kép trong đó.

Đây là cách tôi làm cho nó hoạt động: Tôi đã di chuyển để kéo nó từ một mẫu thay vì những gì bạn thấy là những gì bạn nhận được.

user_data     = "${data.template_file.bootscript.rendered}" 

này có nghĩa là tôi cũng cần phải khai báo tập tin mẫu của tôi như vậy:

data "template_file" "bootscript" { 
    template = "${file("bootscript.tpl")}" 

} 

Nhưng tôi vẫn nhận được một lỗi trong đám mây các bản ghi init /var/log/cloud-init.log [CẢNH BÁO]: Dữ liệu người dùng không đa thành phần (văn bản/x-không-đa): 'Loại nội dung: văn bản/đám mây ...'

Sau đó, tôi tìm thấy this article about user data formatting user Điều đó có ý nghĩa, nếu dữ liệu người dùng có thể đến trong nhiều phần, có thể cloud-init cần lệnh cloud-init ở một nơi và kịch bản ở nơi khác.

Vì vậy bootscript.tpl của tôi trông như thế này:

Content-Type: multipart/mixed; boundary="//" 
MIME-Version: 1.0 

--// 
Content-Type: text/cloud-config; charset="us-ascii" 
MIME-Version: 1.0 
Content-Transfer-Encoding: 7bit 
Content-Disposition: attachment; filename="cloud-config.txt" 

#cloud-config 
cloud_final_modules: 
- [scripts-user, always] 

--// 
Content-Type: text/x-shellscript; charset="us-ascii" 
MIME-Version: 1.0 
Content-Transfer-Encoding: 7bit 
Content-Disposition: attachment; filename="userdata.txt" 

#!/bin/bash 
echo "some crap" 
--// 
Các vấn đề liên quan