Предоставление нескольких точечных экземпляров с 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, чтобы сделать несколько умных шаблонов, прежде чем предоставлять шаблоны инфраструктуры, если это необходимо.