Предоставление нескольких точечных экземпляров с instance_interruption_behavior с использованием Ansible - PullRequest
1 голос
/ 31 марта 2019

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

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

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

Есть ли способ заставить Ansible предоставлять несколько точечных экземпляров одного типа (аналогично атрибуту count в 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 module .

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 }}"

Pre Problem:

Приведенный выше пример модуля хорош и чист и позволяет мне настроить точечный экземпляр в соответствии с моими требованиями, используя ec2 модуль и атрибут count .

Тем не менее, он не позволяет мне установить instance_interruption_behavior для остановки(если я не беспокоюсь), это просто по умолчанию, чтобы прекратить.

Другие модули:

Будет выпущено Доступная версия 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 предоставить несколько экземпляров одного типа (аналогично атрибуту count в модуле ec2 ansible)?

1 Ответ

0 голосов
/ 31 марта 2019

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

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

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

...