Используйте AWS CLI для запуска экземпляра, только если его состояние остановлено - PullRequest
0 голосов
/ 08 июня 2018

Я использую сервер 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 doesn't run the команда stop-instances`
  • остановочное задание находитстатус - running' so does run the команда stop-instances`, и она успешно

И во всех остальных случаях происходит сбой.

В Интернете имеется множество информации об использовании каждой команды, но ничегоЯ могу найти о том, как их сшить.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Зачастую это проще сделать на языке программирования.

Вот пример сценария, который я использую для остановки экземпляров, которые не имеют определенный тег, еслиони бегут.Он не совсем соответствует вашему варианту использования, но показывает, как извлечь экземпляры и базовую логику для тегов статуса и даже экземпляров.

#!/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', он завершает экземпляр.В противном случае это останавливает экземпляр.

0 голосов
/ 08 июня 2018

Если вы ищете один вкладыш в командной строке, вы можете сделать что-то вроде этого

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
...