我知道这似乎与过去提出的其他问题有关,但我认为并非如此。 您将成为法官。
我使用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属性)?
答案 0 :(得分:0)
通常,如果您要一次管理大量EC2实例的副本,则可能要使用Auto-scaling groups或EC2 Fleets。
有一个ec2_asg模块,您可以通过ansible管理自动扩展组。这样一来,您便可以根据该启动模板部署多个EC2实例。
解决此问题的另一种方法是,如果AWS cloudformation模板或terraform计划支持您要执行的操作,则使用cloudformation或terraform模块。这还将使您可以在需要时提供基础结构模板之前,使用Jinja2模板语法来生成一些聪明的模板。