Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在AWS基础设施中使用bash脚本从自动调用组标记安装包_Linux_Bash_Shell_Amazon Web Services_Aws Cli - Fatal编程技术网

Linux 在AWS基础设施中使用bash脚本从自动调用组标记安装包

Linux 在AWS基础设施中使用bash脚本从自动调用组标记安装包,linux,bash,shell,amazon-web-services,aws-cli,Linux,Bash,Shell,Amazon Web Services,Aws Cli,我正在尝试用bash为AWS自动缩放组编写脚本。这意味着,即使实例被终止,自动缩放组也会根据包名和值包号重新安装实例和标记中的所有包。 以下是AWS Cloudformation模板中的LaunchConfiguration组: "WorkerLC": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Properties" : { "ImageId": {"Ref" : "SomeAMI"}, "InstanceT

我正在尝试用bash为AWS自动缩放组编写脚本。这意味着,即使实例被终止,自动缩放组也会根据包名和值包号重新安装实例和标记中的所有包。 以下是AWS Cloudformation模板中的LaunchConfiguration组:

"WorkerLC": {
  "Type" : "AWS::AutoScaling::LaunchConfiguration",
  "Properties" : {
    "ImageId": {"Ref" : "SomeAMI"},
    "InstanceType" : "m3.medium",
    "SecurityGroups" : [{"Ref": "SecurityGroup"}],
    "UserData" : {
      "Fn::Base64": {
        "Fn::Join": [ "", [
          {"Fn::Join": ["", ["Engine=", {"Ref": "Env"},".app.net"," \n"]]},
          {"Fn::Join": ["", [
            "#!/bin/bash\n",
            "cd /app/\n",
            "./worker-install-package.sh"
          ]]}
        ]]
      }
    }
  }
}
我想从AutoscalingGroup的标签中提取如下内容:

"Worker": {
        "Type" : "AWS::AutoScaling::AutoScalingGroup",
        "Properties": {
            "LaunchConfigurationName": {"Ref": "Worker"},
            "LoadBalancerNames": [{"Ref": "WorkerELB"}],
            "AvailabilityZones": {"Ref": "AZs"},
            "MinSize" : "1",
            "MaxSize" : "1",
            "HealthCheckGracePeriod": 300,
            "Tags" : [
                {"Key": "WorkersScalingGroup", "Value": {"Fn::Join": ["", ["Offering-", {"Ref": "Env"} "-Worker-1"]]}, "PropagateAtLaunch": true},
                {"Key": "EIP", "Value": {"Ref": "WorkerIP"}, "PropagateAtLaunch": true},
                {"Key": "Environment", "Value": {"Ref": "Env"}, "PropagateAtLaunch": true}
            ]
        }
    }
所以,现在是困难的一部分。现在我尝试在Userdata中查找文本为“worker”的标记。因为我有两种类型的实例,每一种都附带其他两个包

这是我第一次用bash写东西。 以下是worker-install-package.sh:

#read tag for the installed package
EC2_REGION='us-east-1'
AWS_ACCESS_KEY='xxxxx'
AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxx'
InstanceID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`

PackageName=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key='worker' | cut -f5`

while read line
  if [ "$PackageNmae" = "worker" ]; then
     sudo -- sh -c "./install-package.sh ${PackageName} ${Value}"
     /opt/aws/apitools/ec2/bin/ec2-create-tags $InstanceID -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --tag "worker-${PackageName}"=$Value
  fi
done
我有两个问题。首先,如果我这样做是正确的。第二,是我如何能取包名值的值(它是一些包版本的数字)


谢谢

首先,作为最佳实践,不要在脚本中包含AWS密钥。而是在启动时将附加到实例(这可以在自动缩放组的启动配置中完成)

第二,你所做的只是一种方法,而且它肯定能起作用。实现这一点的另一种方法(适当但稍微复杂一点)是使用puppet或AWS opsworks之类的工具

然而,我并没有真正理解您在脚本中所做的事情,这似乎过于复杂了:为什么不在userdata脚本中包含您的包名?如果在更改/更新脚本时这只是一个灵活性问题,那么您可以将该脚本外包给S3 bucket,并让实例在创建时下载/执行它。这样,您就不需要读取标签

已经说过了,更多的是作为一个评论,如果你想继续阅读标签,那么我真的不理解你的脚本。如果您确实需要有关脚本的帮助,请提供这方面的更多详细信息(例如调试示例等):

当您评估PackageName时,这是否有效

PackageName=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key='worker' | cut -f5`
不确定为什么使用“key=worker”而不是“WorkersScalingGroup”进行筛选

然后调用以下if条件:

if [ "$PackageNmae" = "worker" ]; then
(我假设这里有输入错误,应该是PackageName)就在您呼叫的下方:

"worker-${PackageName}"

哪个会给“工人”

正如我在这里解释的那样:“…自动缩放组重新安装实例和所有来自标记的包,按包名和值包号…”您可以在AWS文档中阅读有关自动缩放组的内容。为什么我要用标签?当有人更改软件包版本时,它也会像这样更新标签:“/opt/aws/apitools/ec2/bin/ec2 create tags”只用于自动校准组谢谢,我在日常职业生活中使用ASG,不需要任何文档。我只是给你们一些见解让你们去探索:正如我所说的,你们的观点是正确的,并且会起作用,但你们可以使用AWS opsworks服务这样的服务做得更好。我不确定我是否正确理解了你的第二个问题,也许这就是我们误解的原因。我个人会依赖S3 bucket脚本/Opsworks,而不是标签来进行配置,但这取决于您的决定