目前,我的现场EC2配置游戏如下:
- name: Provisioning Spot instaces
ec2:
spot_price: 0.50
spot_wait_timeout: 300
assign_public_ip: no
aws_access_key: "{{ aws_id }}"
aws_secret_key: "{{ aws_key }}"
region: "{{ aws_region }}"
image: "{{ image_instance }}"
instance_type: "{{ large_instance }}"
key_name: "{{ ssh_keyname }}"
count: 3
state: present
group_id: "{{ cypher_priv_sg }}"
vpc_subnet_id: "{{ private_subnet_id }}"
wait: true
instance_tags:
Name: Cypher-Worker
#delete_on_termination: yes
register: ec2
那么,是否可以执行以下操作:
在配置(点)EC2实例时,我想逐步检查(如(40%。50%,60%,70%..))如果全部失败,则创建一个按需实例。 我该怎么做?
我可以在这里使用Blocks功能吗?如果是,那怎么办?
答案 0 :(得分:0)
示例:
shell: /some/command
register: result
when: ( result is not defined ) or ( result.rc != 0 )
with_items:
- 40
- 50
- 60
- 70
- 100 # on-demand
这将运行包含所有列出项目的任务,直到其中一项成功为止。
UPD:这是shell
模块的示例,我不知道ec2
模块输出结构,不要使用它。对于shell
模块,它可以正常工作。为什么要投票?
答案 1 :(得分:0)
这个怎么样:
- name: Create ec2 instance
ec2:
key_name: "{{ key }}"
group: "{{ group }}"
instance_type: "{{ itype }}"
image: "{{ image }}"
region: "{{ region }}"
wait: yes
wait_timeout: 500
volumes:
- device_name: /dev/xvda
volume_type: "{{ voltype }}"
volume_size: "{{ volsize }}"
monitoring: no
vpc_subnet_id: "{{ subnetid }}"
register: system
- name: Wait for ssh
wait_for: host={{ item.public_ip }} port=22 state=started
with_items:
- "{{ system.instances }}"
- name: Name the new instance
ec2_tag: resource={{ item.id }} region=eu-central-1 state=present
args:
tags:
Name: "{{ name }}"
with_items:
- "{{ system.instances }}"
您(尝试)创建您的实例并将其事实存储在system
中。如果您需要检查system
是否实际包含您需要的内容,您只需添加when: system.instances.id[0] is defined
,或者更进一步 - 检查您的新实例是否可以在端口22上访问,如上例所示。
您可以将这些条件检查用于其他任务,实现if-not逻辑 - 如果实例创建失败并且ssh无法访问它,则创建按需实例。
- name: Wait for ssh
wait_for: host={{ item.public_ip }} port=22 state=started
with_items:
- "{{ system.instances }}"
register: result
下一步:
when: '"ERROR" in result'