2014-12-04 2 views
6

Если я запускаю экземпляр EC2 (или набор экземпляров) в Ansible, как я могу позже ссылаться на этот экземпляр (или установить) и завершать их?Ansible: Как остановить экземпляр EC2, запущенный с помощью другой playbook

Это в книжных магазинах. Итак, в одной пьесе я уже запустил экземпляр, затем позже я хочу прекратить эти экземпляры с помощью другой пьесы.

Спасибо.

ответ

10

Вам нужно будет сделать что-то вроде этого (рабочий пример):

terminate.yml:

- name: terminate single instance 
    hosts: all 
    tasks: 
    - action: ec2_facts 
    - name: terminating single instance 
     local_action: 
     module: ec2 
     state: 'absent' 
     region: us-east-1 
     instance_ids: "{{ ansible_ec2_instance_id }}" 

прекратить экземпляр по адресу instance.example.com:

$ ansible-playbook -i instance.example.com, terminate.yml 

ec2 facts module запросит службу метаданных в экземпляре, чтобы получить идентификатор экземпляра. ec2 module используется для завершения экземпляра по его идентификатору.

Обратите внимание, что модуль ec2_facts должен запускаться на экземплярах, которые вы хотите завершить, и вы, вероятно, захотите использовать файл инвентаризации или dynamic inventory для поиска экземпляра (ов) по тегу вместо обращения к ним по имени хоста.

0

Когда вы изначально создавали эти экземпляры, убедитесь, что они однозначно идентифицируют/маркируют их. Затем в следующих прогонах вы можете использовать сценарий динамической инвентаризации для заполнения списка хостов, как показано здесь http://docs.ansible.com/intro_dynamic_inventory.html, а затем завершить экземпляры, соответствующие вашим тегам.

1

Я продолжу ответ jarv с рабочим примером, в котором вы можете завершить одиночную или группу серверов (ов) с помощью доступной пьесы.

Давайте предположим, вы хотите завершить экземпляр (ы), которые попадают под удалением группы в ваших хостах файл:

[delete] 
X.X.X.X # IP address of an EC2 instance 

Теперь ваш сборник пьес будут выглядеть следующим образом (в моем случае, я назвал это "ec2_terminate.yml"):

--- 
- hosts: delete 
    gather_facts: True 
    user: ubuntu 
    sudo: True 
    tasks: 

    # fetch instance data from the metadata servers in ec2 
    - ec2_facts: 

    # just show the instance-id 
    - debug: msg= "{{ hostvars[inventory_hostname]['ansible_ec2_instance_id'] }}" 

- hosts: delete 
    gather_facts: True 
    connection: local 
    vars: 
    region: "us-east-1" 
    tasks: 
    - name: destroy all instances 
     ec2: state='absent' 
      region={{ region }} 
      instance_ids={{ item }} 
      wait=true 
     with_items: hostvars[inventory_hostname]['ansible_ec2_instance_id'] 

Теперь запустите этот сборник пьес так:

ansible-playbook -i hosts ec2_terminate.yml 
+0

только один сервер, это, кажется, работает для меня после запуска ec2_facts: {{}} ansible_ec2_instance_id – radtek

2

Ну, если мы г йти использовать динамический инвентарь, то я рекомендую использовать count_tags и exact_count с модулем ec2 при создании экземпляров с create.yml:

--- 
- hosts: localhost 
    connection: local 
    gather_facts: false 
    vars_files: { ./env.yml } 
    tasks: 
    - name: Provision a set of instances 
    ec2: 
     instance_type: "{{ item.value.instance_type }}" 
     image: "{{ image }}" 
     region: "{{ region }}" 
     vpc_subnet_id: "{{ item.value.vpc_subnet_id }}" 
     tenancy: "{{ tenancy }}" 
     group_id: "{{ group_id }}" 
     key_name: "{{ key_name }}" 
     wait: true 
     instance_tags: 
      Name: "{{ env_id }}" 
      Type: "{{ item.key }}" 
     count_tag: 
      Type: "{{ item.key }}" 
     exact_count: "{{ item.value.count }}" 
    with_dict: "{{ servers }}" 
    register: ec2 

Файл env.yml имеет все эти переменные, и серверный словарь:

--- 
env_id: JaxDemo 
key_name: JaxMagicKeyPair 
image: "ami-xxxxxxxx" 
region: us-east-1 
group_id: "sg-xxxxxxxx,sg-yyyyyyyy,sg-zzzzzzzz" 
tenancy: dedicated 

servers: 
    app: 
     count: 2 
     vpc_subnet_id: subnet-xxxxxxxx 
     instance_type: m3.medium 
    httpd: 
     count: 1 
     vpc_subnet_id: subnet-yyyyyyyy 
     instance_type: m3.medium 
    oracle: 
     count: 1 
     vpc_subnet_id: subnet-zzzzzzzz 
     instance_type: m4.4xlarge 

Теперь, если вы хотите изменить количество серверов, просто измените счет в словаре серверов. Если вы хотите удалить все из них, мы все подсчитываем до 0.

Или, если хотите, скопировать создать.YML файл delete_all.yml и заменить

exact_count: "{{ item.value.count }}" 

с

exact_count: 0 
Смежные вопросы