使用Ansible通过instance_interruption_behavior设置多个竞价型实例

时间:2019-03-31 10:41:09

标签: amazon-ec2 ansible ansible-2.x amazon-ec2-spot-market

我知道这似乎与过去提出的其他问题有关,但我认为并非如此。 您将成为法官。

我使用Ansible已有1.5年了,我知道它不是配置基础结构的最佳工具,但就我的需求而言就足够了。

我正在使用AWS作为云提供商

是否有任何方法可以使Ansible通过设置多个相同类型的竞价型实例(类似于 ec2 ansible模块中的count属性) instance_interruption_behavior 设置为 stop (行为),而不是默认的 终止 >?

我的目标:

使用与Amazon不同的 ec2_spot_requests 设置多个EC2实例。 (每个实例的现货请求) 但我不想使用默认的 instance_interruption_behavior 终止,而是希望将其设置为stop(behavior)

我到目前为止所做的事情:

我知道Ansible具有以下模块来处理ec2基础设施。 主要是

ec2。 https://docs.ansible.com/ansible/latest/modules/ec2_module.html

不要与 ec2_instance模块

https://docs.ansible.com/ansible/latest/modules/ec2_instance_module.html

我可以使用ec2模块设置竞价型实例,到目前为止,如下所示:

ec2:
  key_name: mykey
  region: us-west-1
  instance_type: "{{ instance_type }}"
  image: "{{ instance_ami }}"
  wait: yes
  wait_timeout: 100
  spot_price: "{{ spot_bid }}"
  spot_wait_timeout: 600
  spot_type: persistent
  group_id: "{{ created_sg.group_id }}"
  instance_tags:
    Name: "Name"
  count: "{{ my_count }}"
  vpc_subnet_id: " {{ subnet }}"
  assign_public_ip: yes
  monitoring: no
  volumes:
    - device_name: /dev/sda1
      volume_type: gp2
      volume_size: "{{ volume_size }}"

问题解决前

上面的示例模块非常干净,可以使用 ec2 模块和 计数 属性。

但是,不允许我将 instance_interruption_behavior 设置为停止(除非我感到疲倦),它只是默认情况下终止。

其他模块:

要在 Ansible版本2.8.0 上发布(目前仅在开发中可用),其中有一个新模块,名为: ec2_launch_template

https://docs.ansible.com/ansible/devel/modules/ec2_launch_template_module.html

此模块为您提供了更多属性,使您可以结合使用ec2_instance模块将所需的instance_interruption_behavior设置为stop(behavior)。 这就是我所做的:

- hosts: 127.0.0.1
  connection: local
  gather_facts: True
  vars_files:
    - vars/main.yml
  tasks:
    - name: "create security group"
      include_tasks: tasks/create_sg.yml

    - name: "Create launch template to support interruption behavior 'STOP' for spot instances"
      ec2_launch_template:
        name: spot_launch_template
        region: us-west-1
        key_name: mykey
        instance_type: "{{ instance_type }}"
        image_id: "{{ instance_ami }}"
        instance_market_options:
          market_type: spot
          spot_options:
            instance_interruption_behavior: stop
            max_price: "{{ spot_bid }}"
            spot_instance_type: persistent
        monitoring:
          enabled: no
        block_device_mappings:
          - device_name: /dev/sda1
            ebs:
              volume_type: gp2
              volume_size: "{{ manager_instance_volume_size }}"
      register: my_template

- name: "setup up a single spot instance"
  ec2_instance:
    instance_type: "{{ instance_type }}"
    tags:
      Name: "My_Spot"
    launch_template:
      id: "{{ my_template.latest_template.launch_template_id }}"
    security_groups:
      - "{{ created_sg.group_id }}"


主要问题:

如上面的代码片段所示, ec2_launch_template Ansible模块不支持 count 属性并且 ec2_instance模块 也不允许。

是否有任何方式导致ansible提供相同类型的多个实例(类似于ec2 ansible模块中的count属性)?

1 个答案:

答案 0 :(得分:0)

通常,如果您要一次管理大量EC2实例的副本,则可能要使用Auto-scaling groupsEC2 Fleets

有一个ec2_asg模块,您可以通过ansible管理自动扩展组。这样一来,您便可以根据该启动模板部署多个EC2实例。

解决此问题的另一种方法是,如果AWS cloudformation模板或terraform计划支持您要执行的操作,则使用cloudformationterraform模块。这还将使您可以在需要时提供基础结构模板之前,使用Jinja2模板语法来生成一些聪明的模板。