260 lines
9.9 KiB
YAML
260 lines
9.9 KiB
YAML
---
|
|
# AWS Cleanup Playbook
|
|
|
|
- name: Clean up AWS resources
|
|
hosts: localhost
|
|
gather_facts: false
|
|
connection: local
|
|
vars_files:
|
|
- vars.yaml
|
|
vars:
|
|
delete_results: {}
|
|
|
|
tasks:
|
|
- name: Confirm cleanup
|
|
pause:
|
|
prompt: "This will delete all AWS resources for deployment ID {{ deployment_id }}. Continue? (yes/no)"
|
|
register: confirm_deletion
|
|
when: confirm_cleanup | default(true) | bool
|
|
|
|
- name: Check confirmation
|
|
assert:
|
|
that: confirm_deletion.user_input | default('yes') | lower == 'yes'
|
|
fail_msg: "Cleanup cancelled by user"
|
|
when: confirm_cleanup | default(true) | bool
|
|
|
|
# C2 server cleanup
|
|
- name: Terminate C2 instances
|
|
amazon.aws.ec2_instance:
|
|
state: absent
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
"tag:Name": "{{ c2_name }}"
|
|
register: c2_instances_result
|
|
when: cleanup_c2 | default(true) | bool
|
|
|
|
# Redirector cleanup
|
|
- name: Terminate redirector instances
|
|
amazon.aws.ec2_instance:
|
|
state: absent
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
"tag:Name": "{{ redirector_name }}"
|
|
register: redirector_instances_result
|
|
when: cleanup_redirector | default(true) | bool
|
|
|
|
# Tracker cleanup
|
|
- name: Terminate tracker instances
|
|
amazon.aws.ec2_instance:
|
|
state: absent
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
"tag:Name": "{{ tracker_name | default('t-' + deployment_id) }}"
|
|
register: tracker_instances_result
|
|
when: cleanup_tracker | default(true) | bool and track_deployment | default(false) | bool
|
|
|
|
# We need to wait a bit for instances to terminate before we can clean up security groups
|
|
- name: Wait for instances to terminate
|
|
pause:
|
|
seconds: 30
|
|
when: cleanup_c2 | default(true) | bool or cleanup_redirector | default(true) | bool or (cleanup_tracker | default(true) | bool and track_deployment | default(false) | bool)
|
|
|
|
# Delete key pairs
|
|
- name: Delete C2 EC2 key pair
|
|
amazon.aws.ec2_key:
|
|
name: "{{ c2_name }}"
|
|
region: "{{ aws_region }}"
|
|
state: absent
|
|
register: c2_key_result
|
|
when: cleanup_c2 | default(true) | bool
|
|
|
|
- name: Delete redirector EC2 key pair
|
|
amazon.aws.ec2_key:
|
|
name: "{{ redirector_name }}"
|
|
region: "{{ aws_region }}"
|
|
state: absent
|
|
register: redirector_key_result
|
|
when: cleanup_redirector | default(true) | bool
|
|
|
|
- name: Delete tracker EC2 key pair
|
|
amazon.aws.ec2_key:
|
|
name: "{{ tracker_name | default('t-' + deployment_id) }}"
|
|
region: "{{ aws_region }}"
|
|
state: absent
|
|
register: tracker_key_result
|
|
when: cleanup_tracker | default(true) | bool and track_deployment | default(false) | bool
|
|
|
|
# Security Groups
|
|
- name: Delete C2 security group
|
|
amazon.aws.ec2_security_group:
|
|
name: "{{ c2_name }}-sg"
|
|
region: "{{ aws_region }}"
|
|
state: absent
|
|
register: c2_sg_result
|
|
ignore_errors: yes
|
|
when: cleanup_c2 | default(true) | bool
|
|
|
|
- name: Delete redirector security group
|
|
amazon.aws.ec2_security_group:
|
|
name: "{{ redirector_name }}-sg"
|
|
region: "{{ aws_region }}"
|
|
state: absent
|
|
register: redirector_sg_result
|
|
ignore_errors: yes
|
|
when: cleanup_redirector | default(true) | bool
|
|
|
|
- name: Delete tracker security group
|
|
amazon.aws.ec2_security_group:
|
|
name: "{{ tracker_name | default('t-' + deployment_id) }}-sg"
|
|
region: "{{ aws_region }}"
|
|
state: absent
|
|
register: tracker_sg_result
|
|
ignore_errors: yes
|
|
when: cleanup_tracker | default(true) | bool and track_deployment | default(false) | bool
|
|
|
|
# VPC Resources
|
|
- name: Get VPCs
|
|
amazon.aws.ec2_vpc_net_info:
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
"tag:deployment_id": "{{ deployment_id }}"
|
|
register: vpc_info
|
|
|
|
- name: Get subnets
|
|
amazon.aws.ec2_vpc_subnet_info:
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
"tag:deployment_id": "{{ deployment_id }}"
|
|
register: subnet_info
|
|
|
|
- name: Get route tables
|
|
amazon.aws.ec2_vpc_route_table_info:
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
"tag:deployment_id": "{{ deployment_id }}"
|
|
register: route_table_info
|
|
|
|
- name: Get internet gateways
|
|
amazon.aws.ec2_vpc_igw_info:
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
"tag:deployment_id": "{{ deployment_id }}"
|
|
register: igw_info
|
|
|
|
# Get and delete any remaining network interfaces in these VPCs
|
|
- name: Get network interfaces in VPCs
|
|
amazon.aws.ec2_eni_info:
|
|
region: "{{ aws_region }}"
|
|
filters:
|
|
vpc-id: "{{ item.vpc_id }}"
|
|
loop: "{{ vpc_info.vpcs }}"
|
|
register: eni_info
|
|
|
|
- name: Delete network interfaces
|
|
amazon.aws.ec2_eni:
|
|
region: "{{ aws_region }}"
|
|
eni_id: "{{ item.1.network_interface_id }}"
|
|
state: absent
|
|
force_detach: true
|
|
loop: "{{ eni_info.results | subelements('network_interfaces', skip_missing=true) }}"
|
|
register: eni_deleted
|
|
ignore_errors: yes
|
|
|
|
# Delete VPC resources
|
|
- name: Delete route tables
|
|
amazon.aws.ec2_vpc_route_table:
|
|
region: "{{ aws_region }}"
|
|
vpc_id: "{{ item.vpc_id }}"
|
|
route_table_id: "{{ item.id }}"
|
|
state: absent
|
|
loop: "{{ route_table_info.route_tables }}"
|
|
register: route_tables_deleted
|
|
ignore_errors: yes
|
|
|
|
- name: Delete internet gateways
|
|
amazon.aws.ec2_vpc_igw:
|
|
region: "{{ aws_region }}"
|
|
vpc_id: "{{ item.attachments[0].vpc_id }}"
|
|
state: absent
|
|
loop: "{{ igw_info.internet_gateways }}"
|
|
register: igws_deleted
|
|
ignore_errors: yes
|
|
|
|
- name: Delete subnets
|
|
amazon.aws.ec2_vpc_subnet:
|
|
region: "{{ aws_region }}"
|
|
vpc_id: "{{ item.vpc_id }}"
|
|
cidr: "{{ item.cidr_block }}"
|
|
state: absent
|
|
loop: "{{ subnet_info.subnets }}"
|
|
register: subnets_deleted
|
|
ignore_errors: yes
|
|
|
|
# Wait before trying to delete VPCs to allow AWS to catch up on dependency deletions
|
|
- name: Wait for AWS to process subnet and gateway deletions
|
|
pause:
|
|
seconds: 15
|
|
|
|
- name: Delete VPCs
|
|
amazon.aws.ec2_vpc_net:
|
|
region: "{{ aws_region }}"
|
|
vpc_id: "{{ item.id }}"
|
|
state: absent
|
|
loop: "{{ vpc_info.vpcs }}"
|
|
register: vpcs_deleted
|
|
ignore_errors: yes
|
|
|
|
# Create summary of deleted resources
|
|
- name: Collect all deleted resources
|
|
set_fact:
|
|
resource_summary:
|
|
ec2_instances:
|
|
c2: "{{ c2_instances_result.instance_ids | default([]) }}"
|
|
redirector: "{{ redirector_instances_result.instance_ids | default([]) }}"
|
|
tracker: "{{ tracker_instances_result.instance_ids | default([]) }}"
|
|
key_pairs:
|
|
c2: "{{ c2_key_result.key.name | default('') | ternary([c2_key_result.key.name], []) }}"
|
|
redirector: "{{ redirector_key_result.key.name | default('') | ternary([redirector_key_result.key.name], []) }}"
|
|
tracker: "{{ tracker_key_result.key.name | default('') | ternary([tracker_key_result.key.name], []) }}"
|
|
security_groups:
|
|
c2: "{{ c2_sg_result.group_id | default('') | ternary([c2_sg_result.group_id], []) }}"
|
|
redirector: "{{ redirector_sg_result.group_id | default('') | ternary([redirector_sg_result.group_id], []) }}"
|
|
tracker: "{{ tracker_sg_result.group_id | default('') | ternary([tracker_sg_result.group_id], []) }}"
|
|
vpc_resources:
|
|
route_tables: "{{ route_tables_deleted.results | default([]) | map(attribute='item.id', default='') | select() | list }}"
|
|
internet_gateways: "{{ igws_deleted.results | default([]) | map(attribute='gateway_id', default='') | select() | list }}"
|
|
subnets: "{{ subnets_deleted.results | default([]) | map(attribute='subnet.id', default='') | select() | list }}"
|
|
network_interfaces: "{{ eni_deleted.results | default([]) | map(attribute='interface.id', default='') | select() | list }}"
|
|
vpcs: "{{ vpcs_deleted.results | default([]) | map(attribute='vpc.id', default='') | select() | list }}"
|
|
when: not disable_summary | default(false)
|
|
|
|
# Display summary of deleted resources
|
|
- name: Display cleanup summary
|
|
debug:
|
|
msg:
|
|
- "=========================================================="
|
|
- "CLEANUP SUMMARY FOR DEPLOYMENT ID: {{ deployment_id }}"
|
|
- "=========================================================="
|
|
- "EC2 INSTANCES DELETED:"
|
|
- " C2: {{ resource_summary.ec2_instances.c2 }}"
|
|
- " Redirector: {{ resource_summary.ec2_instances.redirector }}"
|
|
- " Tracker: {{ resource_summary.ec2_instances.tracker }}"
|
|
- ""
|
|
- "KEY PAIRS DELETED:"
|
|
- " C2: {{ resource_summary.key_pairs.c2 }}"
|
|
- " Redirector: {{ resource_summary.key_pairs.redirector }}"
|
|
- " Tracker: {{ resource_summary.key_pairs.tracker }}"
|
|
- ""
|
|
- "SECURITY GROUPS DELETED:"
|
|
- " C2: {{ resource_summary.security_groups.c2 }}"
|
|
- " Redirector: {{ resource_summary.security_groups.redirector }}"
|
|
- " Tracker: {{ resource_summary.security_groups.tracker }}"
|
|
- ""
|
|
- "VPC RESOURCES DELETED:"
|
|
- " Route Tables: {{ resource_summary.vpc_resources.route_tables }}"
|
|
- " Internet Gateways: {{ resource_summary.vpc_resources.internet_gateways }}"
|
|
- " Subnets: {{ resource_summary.vpc_resources.subnets }}"
|
|
- " Network Interfaces: {{ resource_summary.vpc_resources.network_interfaces }}"
|
|
- " VPCs: {{ resource_summary.vpc_resources.vpcs }}"
|
|
- "=========================================================="
|
|
when: not disable_summary | default(false) |