11

我的用户数据脚本

#!
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按预期返回我的文件。

并且没有其他错误或我的脚本输出发生。如何让用户数据脚本在启动时正确执行?

4

4 回答 4

16

实际上,cloud-init 允许单个 shell 脚本作为输入(尽管您可能希望使用 MIME 存档进行更复杂的设置)。

OP 脚本的问题是第一行不正确。你应该使用这样的东西:

#!/bin/sh

这样做的原因是,虽然 cloud-init 用于#!识别用户脚本,但操作系统需要完整的 shebang 行才能执行脚本。

所以在 OP 的情况下发生的是 cloud-init 行为正确(即它下载并尝试运行脚本)但操作系统无法实际执行它。


参见:维基百科上的Shebang (Unix)

于 2014-09-05T08:42:09.200 回答
15

Cloud-init 不接受普通的 bash 脚本,就像那样。它是吃定义您的实例(包、ssh 密钥和其他东西)的 YAML 文件的野兽。

使用 MIME 您还可以发送任意 shell 脚本,但您必须对它们进行 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

combine-userdata.txt 是您要粘贴到那里的文件。

更多信息在这里:

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

另请注意,这在很大程度上取决于您使用的图像。但是你说它真的是基于云初始化的图像,所以这适用。还有其他未命名为 cloud-init 的云启动器 - 那么它可能会有所不同。

于 2013-07-24T07:10:43.440 回答
2

这已经有几年了,但是为了其他人的利益,我遇到了同样的问题,结果发现 cloud-init 从内部运行了两次/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
于 2015-06-22T21:12:51.603 回答
0

问题在于cloud-init不允许用户脚本在下次启动时运行。

首先通过执行以下命令删除 cloud-init 工件: rm /var/lib/cloud/instances/*/sem/config_scripts_user

然后您的用户数据必须如下所示:

#!/bin/bash 
echo "hello!"

然后启动你的实例。它现在可以工作(经过测试)。

于 2020-08-27T14:49:36.640 回答