--- - 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"