116 lines
3.8 KiB
YAML
116 lines
3.8 KiB
YAML
|
|
---
|
||
|
|
- name: Enterprise Scaling Event Scenario
|
||
|
|
hosts: all
|
||
|
|
become: yes
|
||
|
|
gather_facts: yes
|
||
|
|
vars:
|
||
|
|
scaling_threshold: 80
|
||
|
|
cooldown_period: 300
|
||
|
|
max_scale_up: 5
|
||
|
|
min_instances: 2
|
||
|
|
|
||
|
|
pre_tasks:
|
||
|
|
- name: Log scenario start
|
||
|
|
lineinfile:
|
||
|
|
path: "/var/log/scaling_scenario.log"
|
||
|
|
line: "{{ ansible_date_time.iso8601 }} - Starting scaling event scenario"
|
||
|
|
create: yes
|
||
|
|
|
||
|
|
- name: Check current load
|
||
|
|
command: uptime
|
||
|
|
register: system_load
|
||
|
|
changed_when: false
|
||
|
|
|
||
|
|
- name: Parse load average
|
||
|
|
set_fact:
|
||
|
|
load_1min: "{{ system_load.stdout.split(',')[0].split()[-1] | float }}"
|
||
|
|
load_5min: "{{ system_load.stdout.split(',')[1] | float }}"
|
||
|
|
load_15min: "{{ system_load.stdout.split(',')[2] | float }}"
|
||
|
|
|
||
|
|
tasks:
|
||
|
|
- name: Evaluate scaling conditions
|
||
|
|
set_fact:
|
||
|
|
scale_up_needed: "{{ load_5min > scaling_threshold }}"
|
||
|
|
scale_down_needed: "{{ load_5min < (scaling_threshold * 0.3) }}"
|
||
|
|
|
||
|
|
- name: Scale up web servers
|
||
|
|
include_role:
|
||
|
|
name: scale_up
|
||
|
|
tasks_from: web_servers
|
||
|
|
vars:
|
||
|
|
scale_count: "{{ [max_scale_up, (load_5min / 10) | int] | min }}"
|
||
|
|
when: scale_up_needed and "'webservers' in group_names"
|
||
|
|
|
||
|
|
- name: Scale up database servers
|
||
|
|
include_role:
|
||
|
|
name: scale_up
|
||
|
|
tasks_from: database_servers
|
||
|
|
vars:
|
||
|
|
scale_count: "{{ [2, (load_5min / 20) | int] | min }}"
|
||
|
|
when: scale_up_needed and "'databases' in group_names"
|
||
|
|
|
||
|
|
- name: Update load balancer configuration
|
||
|
|
include_role:
|
||
|
|
name: load_balancer
|
||
|
|
tasks_from: update_backends
|
||
|
|
when: scale_up_needed
|
||
|
|
|
||
|
|
- name: Scale down web servers
|
||
|
|
include_role:
|
||
|
|
name: scale_down
|
||
|
|
tasks_from: web_servers
|
||
|
|
vars:
|
||
|
|
scale_count: "{{ [(inventory_hostname | regex_findall('[0-9]+') | first | int) - min_instances, 1] | max }}"
|
||
|
|
when: scale_down_needed and "'webservers' in group_names" and (inventory_hostname | regex_findall('[0-9]+') | first | int) > min_instances
|
||
|
|
|
||
|
|
- name: Wait for cooldown period
|
||
|
|
pause:
|
||
|
|
seconds: "{{ cooldown_period }}"
|
||
|
|
when: scale_up_needed or scale_down_needed
|
||
|
|
|
||
|
|
- name: Verify scaling results
|
||
|
|
uri:
|
||
|
|
url: http://localhost/health
|
||
|
|
method: GET
|
||
|
|
status_code: 200
|
||
|
|
register: health_check
|
||
|
|
until: health_check.status == 200
|
||
|
|
retries: 5
|
||
|
|
delay: 10
|
||
|
|
when: "'webservers' in group_names"
|
||
|
|
|
||
|
|
- name: Update monitoring thresholds
|
||
|
|
include_role:
|
||
|
|
name: monitoring
|
||
|
|
tasks_from: update_alerts
|
||
|
|
vars:
|
||
|
|
new_threshold: "{{ scaling_threshold + 10 }}"
|
||
|
|
|
||
|
|
- name: Send scaling notification
|
||
|
|
mail:
|
||
|
|
to: "{{ scaling_notification_email | default('infra-team@company.com') }}"
|
||
|
|
subject: "Infrastructure Scaling Event - {{ inventory_hostname }}"
|
||
|
|
body: |
|
||
|
|
Scaling event completed on {{ inventory_hostname }}
|
||
|
|
|
||
|
|
Load averages: {{ load_1min }}, {{ load_5min }}, {{ load_15min }}
|
||
|
|
Action taken: {{ 'Scale Up' if scale_up_needed else 'Scale Down' if scale_down_needed else 'No Action' }}
|
||
|
|
Health check: {{ 'PASSED' if health_check.status == 200 else 'FAILED' }}
|
||
|
|
|
||
|
|
See /var/log/scaling_scenario.log for details
|
||
|
|
when: scaling_notification_email is defined
|
||
|
|
ignore_errors: yes
|
||
|
|
|
||
|
|
post_tasks:
|
||
|
|
- name: Generate scaling scenario report
|
||
|
|
template:
|
||
|
|
src: templates/scaling_scenario_report.j2
|
||
|
|
dest: "/var/log/scaling_scenario_report_{{ ansible_date_time.iso8601 }}.log"
|
||
|
|
vars:
|
||
|
|
scenario_outcome: "{{ 'SUCCESS' if health_check.status == 200 else 'WARNING' }}"
|
||
|
|
load_metrics: "{{ load_1min }}, {{ load_5min }}, {{ load_15min }}"
|
||
|
|
|
||
|
|
- name: Log scenario completion
|
||
|
|
lineinfile:
|
||
|
|
path: "/var/log/scaling_scenario.log"
|
||
|
|
line: "{{ ansible_date_time.iso8601 }} - Scaling event scenario completed"
|