Предоставление нескольких точечных экземпляров с instance_interruption_behavior с использованием Ansible

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

Я использую Ansible уже 1,5 года и знаю, что это не лучший инструмент для предоставления инфраструктуры, но для моих нужд этого достаточно.

Я использую AWS в качестве своего облачного провайдера

Есть ли способ заставить Ansible предоставлять несколько экземпляров spot одного и того же типа (аналогично атрибуту count в модуле ansible ec2) с параметром instance_interruption_behavior, установленным на stop(поведение) вместо завершения по умолчанию?

Моя цель:

Настройте несколько экземпляров EC2 с разнымиec2_spot_requests для Amazon. (выборочный запрос для каждого экземпляра) Но вместо использования по умолчаниюinstance_interruption_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 }}"


Главная проблема:

Как показано в приведенном выше фрагменте кода,модуль Ansible ec2_launch_template не поддерживает атрибут count, а модуль ec2_instance также не допускает его.

Есть ли способ заставить ansible предоставить несколько экземпляров одного типа (аналогично атрибуту count в модуле ec2 ansible)?

1 ответ

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

Есть модуль ec2_asg, который позволяет вам управлять автоматически масштабируемыми группами через ansible. Это позволит вам развернуть несколько экземпляров EC2 на основе этого шаблона запуска.

Другой способ решения этой проблемы - использование модулей облачной информации или терраформ, если шаблоны облачной информации AWS или планы терраформ поддерживают то, что вы хотите сделать. Это также позволит вам использовать шаблонный синтаксис Jinja2, чтобы сделать несколько умных шаблонов, прежде чем предоставлять шаблоны инфраструктуры, если это необходимо.

Другие вопросы по тегам