3

我知道这似乎与过去提出的其他问题有关,但我觉得不是。你将成为这件事的评判者。

我已经使用 Ansible 1.5 年了,我知道它不是配置基础设施的最佳工具,但对于我的需要来说已经足够了。

我使用 AWS 作为我的云提供商

有没有办法让 Ansible 提供多个相同类型的现场实例(类似于ec2 ansible 模块中的 count 属性),并将instance_interruption_behavior设置为stop(行为)而不是默认的terminate

我的目标:

为 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模块和count属性。

然而,它不允许我将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 设置为停止(行为)。这就是我所做的:

- 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 属性)?

4

1 回答 1

1

一般来说,如果您一次管理大量 EC2 实例副本,您可能希望使用Auto-scaling 组EC2 Fleets

有一个ec2_asg模块,允许您通过 ansible 管理自动缩放组。这将允许您基于该启动模板部署多个 EC2 实例。

如果 AWS cloudformation 模板或 terraform 计划支持您想要做的事情,另一种解决此问题的技术是使用cloudformationterraform模块。这也可以让您使用 Jinja2 模板语法在必要时提供基础设施模板之前进行一些巧妙的模板生成。

于 2019-03-31T12:51:24.873 回答