用户数据脚本在没有给出原因的情况下失败

问题描述 投票:8回答:2

我正在使用Web控制台启动Amazon Linux实例(ami-fb8e9292),将数据粘贴到用户数据框中以在启动时运行脚本。如果我使用example given by amazon 启动Web服务器,则它可以工作。但是,当我运行自己的脚本(也是#!/bin/bash脚本)时,它不会运行。

如果查看var/log/cloud-init.log,则不会提供有关该主题的有用信息:

May 22 21:06:12 cloud-init[1286]: util.py[DEBUG]: Running command ['/var/lib/cloud/instance/scripts/part-001'] with allowed return codes [0] (shell=True, capture=False)
May 22 21:06:16 cloud-init[1286]: util.py[WARNING]: Failed running /var/lib/cloud/instance/scripts/part-001 [2]
May 22 21:06:16 cloud-init[1286]: util.py[DEBUG]: Failed running /var/lib/cloud/instance/scripts/part-001 [2]
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/cloudinit/util.py", line 637, in runparts
    subp([exe_path], capture=False, shell=True)
  File "/usr/lib/python2.6/site-packages/cloudinit/util.py", line 1528, in subp
    cmd=args)
ProcessExecutionError: Unexpected error while running command.
Command: ['/var/lib/cloud/instance/scripts/part-001']
Exit code: 2
Reason: -
Stdout: ''
Stderr: ''

如果我进入实例和sudo su并直接执行shell脚本:

/var/lib/cloud/instance/scripts/part-001

然后运行正常。另外,如果我模拟cloud-init运行它的方式,它也可以工作:

python
>>> import cloudinit.util
>>> cloudinit.util.runparts("/var/lib/cloud/instance/scripts/")

使用这些方法中的任何一种,如果我有意将错误引入脚本中,则会产生错误消息。如何调试有选择地缺少有用的调试输出?

amazon-ec2
2个回答
2
投票

我不确定所有人是否都会遇到这种情况,但是我遇到了这个问题,因此能够通过更改第一行来解决此问题:

#!/bin/bash -e -v

仅此:

#!/bin/bash

当然,现在我的脚本失败了,我不知道它能走多远,但是至少我过去了,没有在运行它。 :)


2
投票

我遇到了类似的问题,并且能够解决它。我意识到不会为sudo设置环境变量EC2_HOME。我在使用aws cli的configset中做了很多工作,为了使这些工作正常,需要设置EC2_HOME。因此,我进去并在我的configset和UserData中的所有地方删除了sudo。当我遇到问题时,我的UserData看起来像:

"UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
                                "#!/bin/bash\n",
                                "sudo yum update -y aws-cfn-bootstrap\n",

                                "# Install the files and packages and run the commands from the metadata\n",
                                "sudo /opt/aws/bin/cfn-init -v --access-key ", { "Ref" : "IAMUserAccessKey" }, " --secret-key ", { "Ref" : "SecretAccessKey" },  
                                "         --stack ", { "Ref" : "AWS::StackName" },
                                "         --resource NAT2 ",
                                "         --configsets config ",
                                "         --region ", { "Ref" : "AWS::Region" }, "\n"
                        ]]}}

更改后的我的UserData看起来像:

"UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
                                "#!/bin/bash -xe\n",
                                "yum update -y aws-cfn-bootstrap\n",

                                "# Install the files and packages and run the commands from the metadata\n",
                                "/opt/aws/bin/cfn-init -v --access-key ", { "Ref" : "IAMUserAccessKey" }, " --secret-key ", { "Ref" : "SecretAccessKey" },  
                                "         --stack ", { "Ref" : "AWS::StackName" },
                                "         --resource NAT2 ",
                                "         --configsets config ",
                                "         --region ", { "Ref" : "AWS::Region" }, "\n"
                        ]]}}

类似地,我删除了我在配置集中所做的所有sudo调用


0
投票

进行了一些谷歌搜索后,我找不到解决此问题的方法。我认为这对我来说是个问题,就是我在用户数据脚本中使用了反引号(这只是我没有根据的猜测),但是对我来说,init脚本在移出后就开始起作用了(这是冲突的代码)在我的用户数据中):

aws cloudformation describe-stack-events --stack-name ${AWS::StackName} --region ${AWS::Region} --query 'StackEvents[?LogicalResourceId==`MyLogicalResource`].{Status:ResourceStatus}' --output text

to

aws cloudformation describe-stack-events --stack-name ${AWS::StackName} --region ${AWS::Region} | jq -r .'StackEvents[] | select(.LogicalResourceId=="MyLogicalResource") | .ResourceStatus'

可悲的是,python调试消息根本没有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.