大佬教程收集整理的这篇文章主要介绍了linux – AWS Cloudformation:如何在创建EC2时重用放在user-data参数中的bash脚本?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
嵌套堆栈“ec2-setup”:
{ "AWstemplateFormatVersion" : "2010-09-09","Parameters" : { // (...) some parameters here "userData" : { "Description" : "user data to be passed to instance","Type" : "String","Default": "" } },"resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance","Properties" : { "UserData" : { "Ref" : "userData" },// (...) some other properties here } } },// (...) }
现在在我的主模板中,我想引用上面给出的嵌套模板,并使用userData参数传递一个bash脚本.另外,我不想内联用户数据脚本的内容,因为我想为少数ec2实例重用它(所以每次我在主模板中声明ec2实例时我都不想复制脚本).
{ "AWstemplateFormatVersion": "2010-09-09","Parameters" : { "myUserData": { "Type": "String","Default" : { "Fn::Base64" : { "Fn::Join" : ["",[ "#!/bin/bash \n","yum update -y \n","# Install the files and packages from the Metadata\n","echo 'tralala' > /tmp/hahaha" ]]}} } },(...) "myEc2": { "Type": "AWS::CloudFormation::Stack","Properties": { "TemplateURL": "s3://path/to/ec2-setup.json","TimeoutInminutes": "10","Parameters": { // (...) "userData" : { "Ref" : "myUserData" } }
但是在尝试启动堆栈时出现以下错误:
该错误似乎是由于声明{Fn :: Base64(…)}是一个对象 – 而不是一个字符串(尽管它导致返回base64编码的字符串).
一切正常,如果我在调用嵌套模板时将我的脚本直接粘贴到参数部分(作为内联脚本)(而不是将字符串设置为参数):
"myEc2": { "Type": "AWS::CloudFormation::Stack","Properties": { "TemplateURL": "s3://path/to/ec2-setup.json","Parameters": { // (...) "userData" : { "Fn::Base64" : { "Fn::Join" : ["","echo 'tralala' > /tmp/hahaha" ]]}} }
但是我希望将userData脚本的内容保存在参数/变量中以便能够重用它.
有没有机会重复使用这样的bash脚本而不需要每次都复制/粘贴它?
1.将默认参数设置为字符串
您的原始尝试解决方案应该有效,只需稍作调整:您必须将默认参数声明为字符串,如下所示(使用YAML而不是JSON可以更容易/更容易地声明多行字符串内联):
AWstemplateFormatVersion: "2010-09-09" Parameters: myUserData: Type: String Default: | #!/bin/bash yum update -y # Install the files and packages from the Metadata echo 'tralala' > /tmp/hahaha (...) resources: myEc2: Type: AWS::CloudFormation::Stack Properties TemplateURL: "s3://path/to/ec2-setup.yml" TimeoutInminutes: 10 Parameters: # (...) userData: !Ref myUserData
然后,在您的嵌套堆栈中,在EC2实例的资源属性中应用任何必需的intrinsic functions(Fn::Base64
,以及Fn::Sub
,如果您需要在用户数据脚本中应用任何Ref
或Fn::GetAtt
函数,这非常有用):
AWstemplateFormatVersion: "2010-09-09" Parameters: # (...) some parameters here userData: Description: user data to be passed to instance Type: String Default: "" resources: EC2Instance: Type: AWS::EC2::Instance Properties: UserData: "Fn::Base64": "Fn::Sub": !Ref userData # (...) some other properties here # (...)
2.将脚本上传到S3
您可以将单个Bash脚本上载到S3存储桶,然后通过在模板中的每个EC2实例中添加最小用户数据脚本来调用脚本:
AWstemplateFormatVersion: "2010-09-09" Parameters: # (...) some parameters here ScriptBucket: Description: S3 bucket containing user-data script Type: String ScriptKey: Description: S3 object key containing user-data script Type: String resources: EC2Instance: Type: AWS::EC2::Instance Properties: UserData: "Fn::Base64": "Fn::Sub": | #!/bin/bash aws s3 cp s3://${ScriptBucket}/${ScriptKey} - | bash -s # (...) some other properties here # (...)
3.使用预处理器从单一来源内联脚本
最后,您可以使用模板预处理器工具(如troposphere或您自己的工具)从更紧凑/富有表现力的源文件中“生成”详细的CloudFormation可执行模板.这种方法将允许您消除源文件中的重复 – 尽管模板将包含“重复的”用户数据脚本,这只会出现在生成的模板中,因此不应该造成问题.
以上是大佬教程为你收集整理的linux – AWS Cloudformation:如何在创建EC2时重用放在user-data参数中的bash脚本?全部内容,希望文章能够帮你解决linux – AWS Cloudformation:如何在创建EC2时重用放在user-data参数中的bash脚本?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。