【问题标题】:AWS CloudFormation UserdataAWS CloudFormation 用户数据
【发布时间】:2014-02-06 13:10:45
【问题描述】:

我有一个大约 200 行的 shell 脚本。我想用它来引导一个 ec2 实例。是否有任何工具可用于将 shell 脚本转换为用户数据

【问题讨论】:

  • 您是否有理由不将脚本文件复制到文件并使用云形成执行?
  • 我是 cloudformation 的新手。如果您正在谈论从 s3 存储桶“wget”一个 shell 脚本并在更改权限后执行它,这是一个可行的选择吗?
  • 我在回答您的问题,但后来我意识到 userdata 和 CloudFormation 之间可能存在一些混淆。它们是独立的概念。您当然可以只使用用户数据执行 wget 和执行。您使用云形成还有其他原因吗?
  • 如果是这样,请将问题标记为“已解决”。

标签: amazon-web-services amazon-cloudformation user-data


【解决方案1】:

您可以使用 perl(摘自我的 Bash 脚本之一)来完成:

SOURCE_FILE=$1
perl -p -e 's/\"/\\"/g;' "${SOURCE_FILE}"            |  # Escape of "
perl -p -e 's/^(.*)$/"\1\\n",/g;'                    ;  # Add a " at the beginning of each lines + Add a " at the end of each lines \n",
echo '""'
# Add "" as the last line of the file (to match the , from the previous line)

【讨论】:

  • 谢谢。这很有帮助。 (y) 我只是简单地从 S3 复制并执行它。
  • 这真是天才。不仅仅是答案,我喜欢你如何评论命令的每个部分,并在最后用 echo '""' 完成它。
【解决方案2】:

您需要考虑特殊字符,例如 '、*、\ 等。这对我有用,但我不确定它是否能涵盖所有情况。

echo -n '"' ; sed ':again; N; $!b again; s/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g; s/$/\\n/;' $1 | tr -d '\n' ; echo '"'

这将产生一个长字符串,可以放入 "UserData": { "Fn::Base64": 字段。这是一个示例 shell 脚本:

#!/bin/bash

echo $(date "+%F %R:%S") ":: get metadata"
MD=/etc/profile.d/metadata.sh
echo "# AWS metadata" >  $MD
metadata=$(curl -sf http://169.254.169.254/latest/dynamic/instance-identity/document)
echo declare -x metadata=\'$metadata\' >> $MD

echo $(date "+%F %R:%S") ":: yum update"
yum -y update

echo $(date "+%F %R:%S") ":: awscli update"
yum -y install python-pip
rm -rf /tmp/pip-build-root/ ; pip install awscli --upgrade

echo $(date "+%F %R:%S") ":: set a cronjob"
echo '*/15 * * * *    ~/bin/cronjob.sh' > /var/spool/cron/root

echo $(date "+%F %R:%S") ":: userdata complete"

转换为 CloudFormation:

"#!/bin/bash\n\necho $(date \"+%F %R:%S\") \":: get metadata\"\nMD=/etc/profile.d/metadata.sh\necho \"# AWS metadata\" >  $MD\nmetadata=$(curl -sf http://169.254.169.254/latest/dynamic/instance-identity/document)\necho declare -x metadata=\\'$metadata\\' >> $MD\n\necho $(date \"+%F %R:%S\") \":: yum update\"\nyum -y update\n\necho $(date \"+%F %R:%S\") \":: awscli update\"\nyum -y install python-pip\nrm -rf /tmp/pip-build-root/ ; pip install awscli --upgrade\n\necho $(date \"+%F %R:%S\") \":: set a cronjob\"\necho '*/15 * * * *    ~/bin/cronjob.sh' > /var/spool/cron/root\n\necho $(date \"+%F %R:%S\") \":: userdata complete\"\n"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2021-05-25
    • 2020-09-12
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多