2014-02-06 85 views
3

我有一個大約200行的shell腳本。我想用它來引導一個ec2實例。是否有任何工具可用於將shell腳本轉換爲用戶數據AWS CloudFormation用戶數據

+1

有什麼理由你不只是複製腳本文件到文件,並與雲的形成執行? – Edwin

+0

我是一個新手到cloudformation。如果你正在談論從s3存儲桶中「wget」一個shell腳本並在更改權限後執行它,這是一個可行的選擇嗎? –

+0

我在回答你的問題,但後來我意識到userdata和CloudFormation之間可能存在一些混淆。他們是獨立的概念。你當然可以做一個wget,並用userdata來執行。您是否有其他原因使用雲陣列? – Edwin

回答

3

您可以用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) 
+0

謝謝。這很有幫助。 (y)我剛從S3中複製並執行它。 –

+0

這是純粹的天才。除了答案之外,我喜歡你如何評論命令的每個部分,並在最後使用echo'「來完成它。 – look

0

你需要考慮的特殊字符,如」 *,\,等。這對我的作品,但我不確定它是完整的涵蓋每一個案例。

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」:field。下面是一個例子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"