我很确定我做错了事,我想知道正确的方法。
我面临的问题是:
我通常会这样解决:
$HOST=123.123.123.1 $TASK=task1 ssh ubuntu@$HOST task_runner $TASK &
$HOST=123.123.123.2 $TASK=task2 ssh ubuntu@$HOST task_runner $TASK &
$HOST=123.123.123.3 $TASK=task3 ssh ubuntu@$HOST task_runner $TASK &
...
我希望更好地做到这一点,所以我想方设法让它变得更容易:
理想情况下,我想覆盖整个生命周期,端到端。
最后,我想要一些非常简单的东西。因为它是一次性的任务,所以我真的不想处理大量的配置选项和布线。
答案 0 :(得分:3)
您可以使用Ansible来合理地执行此操作。
你的Ansible剧本看起来像是:
- name: Stage instance(s)
hosts: local
connection: local
gather_facts: false
vars:
keypair: mykeypair
instance_type: m1.small
security_group: sg-123456abc
image: ami-123456abc
vpc_subnet_id: subnet-123456abc
count: 5
tasks:
- name: Create spot instance
ec2:
spot_price: 0.24
spot_wait_timeout: 600
keypair: {{ keypair }}
group_id: {{ security_group }}
instance_type: {{ instance_type }}
image: {{ image }}
vpc_subnet_id: {{ vpc_subnet_id }}
assign_public_ip: no
count: {{ count }}
wait: yes
register: ec2
- name: Add new instances to host group
add_host: hostname={{item.private_ip}} groupname=task_minions
with_items: ec2.instances
- name: Wait for the instances to boot by checking the ssh port
wait_for: host={{item.private_dns_name}} port=22 delay=60 timeout=320 state=started
with_items: ec2.instances
- name: Configure instance(s)
hosts: task_minions
remote_user: ec2-user
tasks:
- name: Some configuration
yum:
...
- name: Run tasks
hosts: task_minions
remote_user: ec2-user
tasks:
- name: Run all tasks on all task_minions
command:
task_runner {{ item }}
with_items:
- task_1
- task_2
...
- name: Terminate instance(s)
hosts: localhost
connection: local
tasks:
- name: Terminate instances that were previously launched
ec2:
state: 'absent'
instance_ids: '{{ ec2.instance_ids }}'
我对其他配置管理工具的经验较少,但我相信它们也可以使用。
答案 1 :(得分:1)
要尝试/思考的几件事:
1)你应该考虑从图像+运行启动时间代码的钩子构建一个AMI,其中包含你需要的一切。这应该允许您使用此AMI启动图像,而不必担心构建它
2)使用SQS队列来分派任务。通过这种方式,工作人员可以从该队列中拔出,您可以很容易地告诉他们什么时候完成。 (队列变为0,没有消息在飞行中)。
3)额外的超棒。将SQS调度与自动调整相结合:http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-using-sqs-queue.html这样,只要有工作,您就可以自动调整旋转/旋转实例。你唯一需要做的就是将事情推向队列。
4)对于超级巨大的超级棒。完成上面的所有操作+将所有内容放入CloudFormation模板并启动Cloudformation堆栈。如果您需要修改设置(更改图像,队列,配置等),您只需调整模板并重新部署。
希望这有帮助。