仅当AWS的状态已停止时,才使用AWS CLI启动实例

时间:2018-06-08 14:27:04

标签: amazon-web-services amazon-ec2 aws-cli

我正在运行Jenkins服务器,这是安装并运行的AWS CLI工具。服务器正在运行Ubuntu 16.04.3

我可以成功运行命令来启动和停止特定的AWS实例,即:

aws ec2 start-instances --region eu-west-2 --instance-ids i-65a4sd654as

我还可以运行命令来查找该实例的状态:

aws ec2 describe-instance-status --region eu-west-2 --instance-ids i-65a4sd654as

但我需要做的是运行两个Jenkins作业来检查特定实例的状态,然后只运行start-instances或'stop-instances'命令,如果状态为stopped或分别是“跑步”。

据推测,有一种方法可以运行一个命令并获取输出,然后使下一个命令以此为条件,但我无法弄清楚如何执行此操作。如果出现以下任何情况,我需要Jenkins工作才能显示成功:

  • 启动作业发现状态为running因此不运行start-instances命令
  • 启动作业发现状态为stopped' so does run the start-instances`命令,并且成功
  • 停止作业发现状态为stopped' so doesn't run the stop-instances`命令
  • 停止作业发现状态为running' so does run the stop-instances`命令,并且成功

在所有其他情况下失败。

网上有大量关于使用每个命令的信息,但我没有找到关于如何将它们拼接在一起的信息。

2 个答案:

答案 0 :(得分:2)

如果你在命令行上寻找一个班轮,你可以做这样的事情

if [[ $(aws ec2 describe-instances --instance-ids i-abcd1234defg5678 --query 'Reservations[].Instances[].State[].Name' --output text) = "running" ]] ; then \
    aws ec2 stop-instances --instance-ids i-abcd1234defg5678; \
    elif [[ $(aws ec2 describe-instances --instance-ids i-abcd1234defg5678 --query 'Reservations[].Instances[].State[].Name' --output text) = "stopped" ]] ; then \
    aws ec2 start-instances --instance-ids i-abcd1234defg5678 ; \
    fi

答案 1 :(得分:1)

在编程语言中执行此类操作通常更容易。

这是一个示例脚本,用于停止具有特定标记的实例(如果它们正在运行)。它与您的用例不完全匹配,但它显示了如何检索状态甚至实例标记上的实例和基础逻辑。

#!/usr/bin/env python

import boto.ec2

for region in [region for region in boto.ec2.regions() if region.name not in ['us-gov-west-1', 'cn-north-1']]:
  conn = boto.ec2.connect_to_region(region.name)
  reservations = conn.get_all_instances()
  for r in reservations:
    for i in r.instances:
      action = 'stop'
      if 'cleanup' in i.tags.keys():
        action = i.tags['cleanup'].lower()
      #print region.name, i.id, i.tags, i.state, action

      # Ignore ones marked as "ignore", or already terminated
      if action == 'ignore' or i.state == 'terminated':
        continue

      elif action in ['t', 'terminate']:
        print "Terminating", region.name, i.tags, i.state
        conn.terminate_instances([i.id])

      elif action == 'stop' and i.state != 'stopped':
        print "Stopping", region.name, i.tags, i.state
        conn.stop_instances([i.id])

它基本上抓取所有实例的列表,并选择stop的默认操作。然后,它会查看实例上是否有cleanup标记。

如果cleanup标记显示为ignore,则会单独保留该实例。如果实例标记为't'或'terminate',则终止实例。否则,将停止实例。