使用 ansible 通过标签启动之前停止的 EC2 实例

Starting previously stopped EC2 instances by tags with ansible

我正在尝试创建一个剧本或角色,让我可以通过标签启动以前停止的 EC2 实例(例如,EC2 实例通过标签分配给清单中的静态组)。 ec2.ini 文件也更改为 return 有关已停止实例的信息。到目前为止我看到的唯一类似的例子是依靠ec2_facts得到instance_ids

ansible 网站上的官方 example 假定 regioninstance_ids 已经在 advance/hardcoded 中已知。


- name: Start sandbox instances
  hosts: localhost
  gather_facts: false
  connection: local
  vars:
    instance_ids:
      - 'i-xxxxxx'
      - 'i-xxxxxx'
      - 'i-xxxxxx'
    region: us-east-1
  tasks:
    - name: Start the sandbox instances
      ec2:
        instance_ids: '{{ instance_ids }}'
        region: '{{ region }}'
        state: running
        wait: True
        vpc_subnet_id: subnet-29e63245
        assign_public_ip: yes
  role:
    - do_neat_stuff
    - do_more_neat_stuff

最好我正在寻找一种解决方案,例如,如果可能的话,我可以从动态清单中获取必要的变量。

现有的 EC2 实例可以通过下面的操作启动,无需硬编码实例标识符或 EC2 区域。


--- ec2.yml
- hosts: aws
  gather_facts: false
  tasks:
  - name: start EC2 instance
    local_action:
      module: ec2
        state=running
        region={{ hostvars[inventory_hostname]['ec2_region'] }}
        instance_ids={{ hostvars[inventory_hostname]['ec2_id'] }}
    tags:
      - start-instance
</pre>

假设动态实例被标记,以下命令将启动实例:

$ ansible-playbook -i inventory --limit [instance static group name] --tags start-instance ec2.yml

首先,您必须将动态清单脚本告知 return 已关闭的主机。在 ec2.ini 文件中设置为 "False"。将其更改为 "True":

# By default, only EC2 instances in the 'running' state are returned. Set
# 'all_instances' to True to return all instances regardless of state.
all_instances = True

这是我使用的剧本:

---
- hosts: "{{ ip_list | default( 'ec2' ) }}"
  connection: ssh
  gather_facts: false
  tasks:
  - name: Start instance
    ec2:
      state: running
      instance_id: "{{ ec2_id }}"
      key_name: "{{ key_name }}"
      region: "{{ region }}"
      wait: true
    delegate_to: localhost

key_nameregion 在我的 group_vars/all 文件中定义,ec2_id来自ansible,带有主机信息,ip_list是在命令行定义的