我正在运行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`命令,并且成功在所有其他情况下失败。
网上有大量关于使用每个命令的信息,但我没有找到关于如何将它们拼接在一起的信息。
答案 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',则终止实例。否则,将停止实例。