使用ansible playbook启动已停止的AWS实例

时间:2015-12-28 14:45:08

标签: amazon-web-services ansible ansible-playbook

我正在尝试stop/startgrouphosts文件中列出的特定[target]个实例。 以下playbook可以正常停止实例。

---
- hosts: target
  remote_user: ubuntu

  tasks:
  - name: Gather facts
    action: ec2_facts

  - name: Stop Instances
    local_action:
        module: ec2
        region: "{{region}}"
        instance_ids: "{{ansible_ec2_instance_id}}"
        state: stopped

但是当我尝试启动这些实例时,它不起作用,因为ec2_facts无法ssh进入实例(因为它们现在已停止)并获得instance-ids

---
- hosts: target
  remote_user: ubuntu

  tasks:
  - name: start instances
    local_action:
        module: ec2
        region: "{{region}}"
        instance_ids: "{{ansible_ec2_instance_id}}"
        state: running

我已经看到了为主机使用dynamic inventory文件的文档以及对instance-ids进行硬编码的方法。我想启动其IPs列在target hostsread()组中的实例。

3 个答案:

答案 0 :(得分:4)

得到了解决方案,以下是适用于我的ansible-task

---
- name: Start instances
  hosts: localhost
  gather_facts: false
  connection: local
  vars:
    instance_ids:
      - 'i-XXXXXXXX'
    region: ap-southeast-1
  tasks:
    - name: Start the feature instances
      ec2:
        instance_ids: '{{ instance_ids }}'
        region: '{{ region }}'
        state: running
        wait: True

Here is the Blog post on How to start/stop ec2 instances with ansible

答案 1 :(得分:1)

您有两个选择:

选项1

使用AWS CLI使用其IP或名称查询已停止实例的实例ID。例如,要查询给定实例名称的实例标识:

shell: aws ec2 describe-instances --filters 'Name=tag:Name,Values={{inst_name}}' --output text --query 'Reservations[*].Instances[*].InstanceId'
register: inst_id

选项2

将Ansible升级到2.0版(在Hills和Far Away上)并使用新的ec2_remote_facts模块

- ec2_remote_facts:
    filters:
      instance-state-name: stopped

答案 2 :(得分:0)

您应该添加gather_facts: False以防止Ansible尝试通过SSH连接到主机,因为它们未运行:

- hosts: target
  remote_user: ubuntu
  gather_facts: false

如果您需要在实例启动后收集事实,那么您可以使用setup模块在​​启动后明确收集事实。

编辑:我刚刚意识到问题是您正在尝试访问ansible_ec2_instance_id因为实例已关闭而无法获得的事实。您可能希望查看this custom module called ec2_lookup,即使实例已关闭,也可以搜索获取AWS实例ID。使用此功能,您可以获得您感兴趣的实例列表,然后启动它们。