AWX, Ansible, haproxy рдФрд░ CROC рдХреНрд▓рд╛рдЙрдб рдХреЗ рд╕рд╛рде DIY рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ

рдЫрд╡рд┐


рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдЯрд▓реЗрд╕ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдФрд░ рдЕрд▓рд╛рд░реНрдо рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд╕рдВрдЧрдд API рдХреЗ рд╕рд╛рде AWS рдореЗрдВ CloudWatch рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рдЕрдм рд╣рдо рдмреИрд▓реЗрдВрд╕рд░ рдФрд░ рдСрдЯреЛрдореИрдЯрд┐рдХ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рдЯреИрдЧ (рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд░рд┐рд╕реЛрд░реНрд╕ рдЯреИрдЧрд┐рдВрдЧ рдПрдкреАрдЖрдИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд╕реЗрд╡рд╛ рдЦреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдпрд╣ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдХрд░реЗрдВред


рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рдиреНрдпреВрдирддрдо рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг: DNS -> 2 рдмреИрд▓реЗрдВрд╕рд░реНрд╕ -> 2 рдмреИрдХреЗрдВрдбред рдЗрд╕ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рджреЛрд╖-рд╕рд╣рд┐рд╖реНрдгреБ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рдЗрд╕ рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЫреЛрдбрд╝реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдмреИрдХрдПрдВрдбред рд▓реЗрдХрд┐рди рдореИрдВ рдмреИрдХрдПрдВрдб рд╕рд░реНрд╡рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдирд╛ рдФрд░ рд╡рд╛рдкрд╕ рджреЛ рддрдХ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпрд╣ рд╣рдорд╛рд░рд╛ рдХрд╛рдо рд╣реЛрдЧрд╛ред рд╕рднреА рдЙрджрд╛рд╣рд░рдг рднрдВрдбрд╛рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред


рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪрд╛


рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рд╣рдо рдЯреЗрд░рд╛рдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ (рд╡реАрдкреАрд╕реА, рд╕рдмрдиреЗрдЯ, рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдЧреНрд░реБрдк, рд╡реАрдПрдо) рдХреА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред


рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ:


main.tf
variable "ec2_url" {} variable "access_key" {} variable "secret_key" {} variable "region" {} variable "vpc_cidr_block" {} variable "instance_type" {} variable "big_instance_type" {} variable "az" {} variable "ami" {} variable "client_ip" {} variable "material" {} provider "aws" { endpoints { ec2 = "${var.ec2_url}" } skip_credentials_validation = true skip_requesting_account_id = true skip_region_validation = true access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "${var.region}" } resource "aws_vpc" "vpc" { cidr_block = "${var.vpc_cidr_block}" } resource "aws_subnet" "subnet" { availability_zone = "${var.az}" vpc_id = "${aws_vpc.vpc.id}" cidr_block = "${cidrsubnet(aws_vpc.vpc.cidr_block, 8, 0)}" } resource "aws_security_group" "sg" { name = "auto-scaling" vpc_id = "${aws_vpc.vpc.id}" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["${cidrsubnet(aws_vpc.vpc.cidr_block, 8, 0)}"] } ingress { from_port = 8080 to_port = 8080 protocol = "tcp" cidr_blocks = ["${cidrsubnet(aws_vpc.vpc.cidr_block, 8, 0)}"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_key_pair" "key" { key_name = "auto-scaling-new" public_key = "${var.material}" } resource "aws_instance" "compute" { count = 5 ami = "${var.ami}" instance_type = "${count.index == 0 ? var.big_instance_type : var.instance_type}" key_name = "${aws_key_pair.key.key_name}" subnet_id = "${aws_subnet.subnet.id}" availability_zone = "${var.az}" security_groups = ["${aws_security_group.sg.id}"] } resource "aws_eip" "pub_ip" { instance = "${aws_instance.compute.0.id}" vpc = true } output "awx" { value = "${aws_eip.pub_ip.public_ip}" } output "haproxy_id" { value = ["${slice(aws_instance.compute.*.id, 1, 3)}"] } output "awx_id" { value = "${aws_instance.compute.0.id}" } output "backend_id" { value = ["${slice(aws_instance.compute.*.id, 3, 5)}"] } 

рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдЗрдХрд╛рдЗрдпрд╛рдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдзреБрдирд┐рдХ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдФрд╕рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЙрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - terraform.tfvars:


terraform.tfvars
 ec2_url = "https://api.cloud.croc.ru" access_key = "project:user@customer" secret_key = "secret-key" region = "croc" az = "ru-msk-vol51" instance_type = "m1.2small" big_instance_type = "m1.large" vpc_cidr_block = "10.10.0.0/16" ami = "cmi-3F5B011E" 

рдЯреЗрд░рд╛рдлреЙрд░реНрдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:


рдЯреЗрд░рд╛рдлреЙрд░реНрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ
 yes yes | terraform apply -var client_ip="$(curl -s ipinfo.io/ip)/32" -var material="$(cat <ssh_publick_key_path>)" 

рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕реЗрдЯрдЕрдк


рдКрдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП VMs рдХреЛ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЙрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореЙрдирд┐рдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореЙрдиреАрдЯрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рд╣реЛрдЧрд╛ред рдХреБрдЫ рдореАрдЯреНрд░рд┐рдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд╣рдо рд╢рдХреНрддрд┐ рдХреЛ рдмрдврд╝рд╛ рдпрд╛ рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдирд┐рдЧрд░рд╛рдиреА рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрд▓рд╛рд░реНрдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдХреНрд▓рд╛рдЙрдб рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо CPU рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рд╛рд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рдирд┐рдЧрд░рд╛рдиреА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдРрд╕реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдпреЛрдЧ (рдЧрддрд┐ / pps), рдбрд┐рд╕реНрдХ рдЙрдкрдпреЛрдЧ (рдЧрддрд┐ / iops)ред


рдХреНрд▓рд╛рдЙрдбрд╡реЙрдЪ рдбрд╛рд▓-рдореЗрдЯреНрд░рд┐рдХ-рдЕрд▓рд╛рд░реНрдо
 export CLOUDWATCH_URL=https://monitoring.cloud.croc.ru for instance_id in <backend_instance_ids>; do \ aws --profile <aws_cli_profile> --endpoint-url $CLOUDWATCH_URL \ cloudwatch put-metric-alarm \ --alarm-name "scaling-low_$instance_id" \ --dimensions Name=InstanceId,Value="$instance_id" \ --namespace "AWS/EC2" --metric-name CPUUtilization --statistic Average \ --period 60 --evaluation-periods 3 --threshold 15 --comparison-operator LessThanOrEqualToThreshold; done for instance_id in <backend_instance_ids>; do \ aws --profile <aws_cli_profile> --endpoint-url $CLOUDWATCH_URL \ cloudwatch put-metric-alarm\ --alarm-name "scaling-high_$instance_id" \ --dimensions Name=InstanceId,Value="$instance_id" \ --namespace "AWS/EC2" --metric-name CPUUtilization --statistic Average\ --period 60 --evaluation-periods 3 --threshold 80 --comparison-operator GreaterThanOrEqualToThreshold; done 

рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


--profile - aws-cli рд╕реЗрдЯрд┐рдВрдЧ рдкреНрд░реЛрдлрд╛рдЗрд▓, ~ / .aws / config рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдХреНрд╕реЗрд╕ рдХреАрдЬрд╝ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдВ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВред


- рдЖрдпрд╛рдо - рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдЕрд▓рд╛рд░реНрдо рдКрдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдЪрд░ $ inst_id рд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред


--namespace - рдиреЗрдорд╕реНрдкреЗрд╕ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдореЗрдЯреНрд░рд┐рдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


-рдореЗрдЯреНрд░рд┐рдХ-рдирд╛рдо - рдирд┐рдЧрд░рд╛рдиреА рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдирд╛рдоред


--рд╡рд╛рд╕реНрддрд╡рд┐рдХ - рдореАрдЯреНрд░рд┐рдХ рдореВрд▓реНрдп рдПрдХрддреНрд░реАрдХрд░рдг рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдоред


--period - рдорд╛рди рд╕рдВрдЧреНрд░рд╣ рдШрдЯрдирд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рдмреАрдЪ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ред


- рдЕрд╡рдореВрд▓реНрдпрди-рдЕрд╡рдзрд┐рдпреЛрдВ - рдПрдХ рдЕрд▓рд╛рд░реНрдо рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдВрддрд░рд╛рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ред


- рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб - рдЕрд▓рд╛рд░реНрдо рд░рд╛рдЬреНрдп рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореАрдЯреНрд░рд┐рдХ рд╕реАрдорд╛ рдореВрд▓реНрдпред


-comparison- рдСрдкрд░реЗрдЯрд░ - рдПрдХ рд╡рд┐рдзрд┐ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдереНрд░реЗрд╢реЛрд▓реНрдб рдорд╛рди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдмреИрдХрдПрдВрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рд╛рд░реНрдо рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рд╕реНрдХреЗрд▓рд┐рдВрдЧ-рдХрдо- <рдЙрджрд╛рд╣рд░рдг-рдЖрдИрдбреА> рдЕрд▓рд╛рд░реНрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕реАрдкреАрдпреВ 3 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП 15% рд╕реЗ рдХрдо рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред рд╕реНрдХреЗрд▓рд┐рдВрдЧ-рд╣рд╛рдИ- <рдЙрджрд╛рд╣рд░рдг-рдЖрдИрдбреА> рдЕрд▓рд╛рд░реНрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕реАрдкреАрдпреВ 3 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП 80% рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред


рдЯреИрдЧ рдЕрдиреБрдХреВрд▓рди


рдирд┐рдЧрд░рд╛рдиреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЦреЛрдЬ рдФрд░ рдЙрдирдХреЗ рдирд╛рдо (рд╕реЗрд╡рд╛ рдХреА рдЦреЛрдЬ)ред рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдм рдХрд┐рддрдиреЗ рдмреИрдХреЗрдВрдб рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рд▓реЙрдиреНрдЪ рдХрд┐рдП рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдЙрдирдХреЗ рдирд╛рдо рднреА рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрд▓рд╛рдЙрдб рдХреЗ рдмрд╛рд╣рд░ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреИрд▓реЗрдВрд╕ рдХреЙрдиреНрдлрд┐рдЧ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реБрд▓ рдФрд░ рдХреМрдВрд╕рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдХ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдЯреИрдЧ рд╣реИрдВред рдЯреИрдЧ рд╣рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреИрдЧ (рд╡рд░реНрдгрди-рдЯреИрдЧ) рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдХреЗ, рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреВрд▓ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рддрдиреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдЖрдИрдбреА рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЙрджрд╛рд╣рд░рдг рдЖрдИрдбреА рд╣реЛрд╕реНрдЯрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред VPC рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдВрддрд░рд┐рдХ DNS рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпреЗ id / hostnames рдЖрдВрддрд░рд┐рдХ рдЖрдИрдкреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред


рд╣рдо рдмреИрдХрдПрдВрдб рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдФрд░ рдмреИрд▓реЗрдиреНрдХрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:


ec2 рдмрдирд╛рдиреЗ рдХреЗ рдЯреИрдЧ
 export EC2_URL="https://api.cloud.croc.ru" aws --profile <aws_cli_profile> --endpoint-url $EC2_URL \ ec2 create-tags --resources "<awx_instance_id>" \ --tags Key=env,Value=auto-scaling Key=role,Value=awx for i in <backend_instance_ids>; do \ aws --profile <aws_cli_profile> --endpoint-url $EC2_URL \ ec2 create-tags --resources "$i" \ --tags Key=env,Value=auto-scaling Key=role,Value=backend ; done; for i in <haproxy_instance_ids>; do \ aws --profile <aws_cli_profile> --endpoint-url $EC2_URL \ ec2 create-tags --resources "$i" \ --tags Key=env,Value=auto-scaling Key=role,Value=haproxy; done; 

рдЬрд╣рд╛рдВ:


- рд╕реНрд░реЛрдд - рд╕рдВрд╕рд╛рдзрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЬрд┐рд╕рдореЗрдВ рдЯреИрдЧ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред


-рдЯреИрдЧ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд░реНрдгрди-рдЯреИрдЧ рд╕реАрдЖрд░рдУрд╕реА рдХреНрд▓рд╛рдЙрдб рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред


рдСрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕реЗрдЯрдЕрдк


рдЕрдм рдЬрдм рдмрд╛рджрд▓ рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╣рдо рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдЕрд▓рд╛рд░реНрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рдзрд┐рдХ рдирд┐рдЧрд░рд╛рдиреА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдореЗрдВ рд▓рдЧреЗрдЧреА рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧреАред рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдг рдпрд╣рд╛рдВ рд▓рдЧрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо AWX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред AWX рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ Ansible рдЯреЙрд╡рд░ рдХрд╛ рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рдХрд┐ Ansible рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдкрд╛рдж рд╣реИред рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╕рдордп-рд╕рдордп рдкрд░ рд╣рдорд╛рд░реА рд╕реБрдЧрдо рдкреНрд▓реЗрдмреБрдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╣реИред


AWX рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдХреА рдкреГрд╖реНрда рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред AWX рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ Ansible рдЯреЙрд╡рд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рднреА рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред AWX рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдкреНрд▓реЗрдмреБрдХ рдЪрд▓рд╛рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдХрд╛рдЗрдпрд╛рдБ рдмрдирд╛рдХрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


  • рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рд░реВрдк:
    - AWS рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ - CROC рдХреНрд▓рд╛рдЙрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
    - рдорд╢реАрди рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ - рдирд╡ рдирд┐рд░реНрдорд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП ssh рдХреБрдВрдЬрд┐рдпрд╛рдБред
    - SCM рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ - рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдПред
  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рдРрд╕реА рд╕рдВрд╕реНрдерд╛ рд╣реИ рдЬреЛ рдкреНрд▓реЗрдмреБрдХ рд╕реЗ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдЧреАред
  • рд▓рд┐рдкрд┐рдпреЛрдВ - ansible рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯред
  • рдЗрдиреНрд╡реЗрдВрдЯрд░реА рдПрдХ рдРрд╕реА рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рдкреНрд▓реЗрдмреБрдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдЧреАред
  • рдЯреЗрдореНрдкреНрд▓реЗрдЯ - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд▓реЗрдмреБрдХ рдХреЙрд▓ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕, рдЗрдиреНрд╡реЗрдВрдЯрд░реА рдФрд░ рдкреНрд▓реЗрдмреБрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
  • рд╡рд░реНрдХрдлрд╝реНрд▓реЛ - рдкреНрд▓реЗрдмреБрдХ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд╛ рдПрдХ рдХреНрд░рдоред

рдСрдЯреЛрд╕реНрдХреЛрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  • scale_up - рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЙрдЪреНрдЪ рдЕрд▓рд╛рд░реНрдо рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ;
  • рдЕрдЧрд░ рдХрд┐рд╕реА рд▓реЛ рдЕрд▓рд╛рд░реНрдо рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рддреЛ рд╕реНрдХреЗрд▓_рдбрд╛рдЙрди - рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рдорд╛рдкреНрддрд┐ред

Scale_up рднрд╛рдЧ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


  • "рдЕрд▓рд╛рд░реНрдо" рд░рд╛рдЬреНрдп рдореЗрдВ рдЙрдЪреНрдЪ рдЕрд▓рд╛рд░реНрдо рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд▓рд╛рдЙрдб рдирд┐рдЧрд░рд╛рдиреА рд╕реЗрд╡рд╛ рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░реЗрдВ;
  • рдпрджрд┐ рд╕рднреА рдЙрдЪреНрдЪ рдЕрд▓рд╛рд░реНрдо "рдУрдХреЗ" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ, рддреЛ рд╕реНрдХреЗрд▓_рдЕрдк рдХреЛ рд╢реЗрдбреНрдпреВрд▓ рд╕реЗ рдкрд╣рд▓реЗ рд░реЛрдХ рджреЗрдВ;
  • рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдЯреИрдЧ, рд╕рдмрдиреЗрдЯ, рд╕реБрд░рдХреНрд╖рд╛_рдЧреНрд░реБрдк, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ;
  • рдПрдХ рдЪрд▓ рд░рд╣реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдФрд░ рдирд┐рдореНрди рдЕрд▓рд╛рд░реНрдо рдмрдирд╛рдПрдВ;
  • рдПрдХ рдирдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдВрджрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рдмрд╕ nginx рд╣реЛрдЧрд╛);
  • рд╣рд╛рдЗрдкреЛрдХреНрд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ рдирдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╢реБрд░реВ рд╣реЛред

create-instance.yaml
 --- - name: get alarm statuses describe_alarms: region: "croc" alarm_name_prefix: "scaling-high" alarm_state: "alarm" register: describe_alarms_query - name: stop if no alarms fired fail: msg: zero high alarms in alarm state when: describe_alarms_query.meta | length == 0 - name: create instance ec2: region: "croc" wait: yes state: present count: 1 key_name: "{{ hostvars[groups['tag_role_backend'][0]].ec2_key_name }}" instance_type: "{{ hostvars[groups['tag_role_backend'][0]].ec2_instance_type }}" image: "{{ hostvars[groups['tag_role_backend'][0]].ec2_image_id }}" group_id: "{{ hostvars[groups['tag_role_backend'][0]].ec2_security_group_ids }}" vpc_subnet_id: "{{ hostvars[groups['tag_role_backend'][0]].ec2_subnet_id }}" user_data: | #!/bin/sh sudo yum install epel-release -y sudo yum install nginx -y cat <<EOF > /etc/nginx/conf.d/dummy.conf server { listen 8080; location / { return 200 '{"message": "$HOSTNAME is up"}'; } } EOF sudo systemctl restart nginx loop: "{{ hostvars[groups['tag_role_backend'][0]] }}" register: new - name: create tag entry ec2_tag: ec2_url: "https://api.cloud.croc.ru" region: croc state: present resource: "{{ item.id }}" tags: role: backend loop: "{{ new.instances }}" - name: create low alarms ec2_metric_alarm: state: present region: croc name: "scaling-low_{ item.id }}" metric: "CPUUtilization" namespace: "AWS/EC2" statistic: Average comparison: "<=" threshold: 15 period: 300 evaluation_periods: 3 unit: "Percent" dimensions: {'InstanceId':"{{ item.id }}"} loop: "{{ new.instances }}" - name: create high alarms ec2_metric_alarm: state: present region: croc name: "scaling-high_{{ item.id }}" metric: "CPUUtilization" namespace: "AWS/EC2" statistic: Average comparison: ">=" threshold: 80.0 period: 300 evaluation_periods: 3 unit: "Percent" dimensions: {'InstanceId':"{{ item.id }}"} loop: "{{ new.instances }}" 

Create-inst.yaml рдореЗрдВ, рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рд╕рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдмрдирд╛рдирд╛, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЯреИрдЧ рдХрд░рдирд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЕрд▓рд╛рд░реНрдо рдмрдирд╛рдирд╛ред Nginx рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЛ рдХреНрд▓рд╛рдЙрдб-рдЗрдирд┐рдЯ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд▓рдЪреАрд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдЕрдкрдбреЗрдЯ- lb.yaml рдореЗрдВ /etc/haproxy/haproxy.cfg рдлрд╝рд╛рдЗрд▓ рдХреЛ haproxy рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдкреБрдирдГ рд▓реЛрдб haproxy рд╕реЗрд╡рд╛ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


рдЕрджреНрдпрддрди-lb.yaml
 - name: update haproxy configs template: src: haproxy.cfg.j2 dest: /etc/haproxy/haproxy.cfg - name: add new backend host to haproxy systemd: name: haproxy state: restarted 

рдЬрд╣рд╛рдБ haproxy.cfg.j2 haproxy рд╕реЗрд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ:


haproxy.cfg.j2
 # {{ ansible_managed }} global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats timeout 30s user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend loadbalancing bind *:80 mode http default_backend backendnodes backend backendnodes balance roundrobin option httpchk HEAD / {% for host in groups['tag_role_backend'] %} server {{hostvars[host]['ec2_id']}} {{hostvars[host]['ec2_private_ip_address']}}:8080 check {% endfor %} 

рдЪреВрдБрдХрд┐ рд╡рд┐рдХрд▓реНрдк httpchk рд╡рд┐рдХрд▓реНрдк рдХреЛ haproxy config рдХреЗ рдмреИрдХреЗрдВрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, haproxy рд╕реЗрд╡рд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмреИрдХреЗрдВрдб рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХреА рдЕрд╡рд╕реНрдерд╛рдУрдВ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░реЗрдЧреА рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪреЛрдВ рдХреЗ рдмреАрдЪ рдпрд╛рддрд╛рдпрд╛рдд рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░реЗрдЧреАред


рд╕реНрдХреЗрд▓_рдбрд╛рдЙрди рднрд╛рдЧ рдореЗрдВ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • рдЪреЗрдХ рд╕реНрдЯреЗрдЯ рд▓реЛ рдЕрд▓рд╛рд░реНрдо;
  • рдпрджрд┐ "рдЕрд▓рд╛рд░реНрдо" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рдХрдо рдЕрд▓рд╛рд░реНрдо рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдирд╛рдЯрдХ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ;
  • рдЙрди рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЕрд▓рд╛рд░реНрдо рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХрдо рдЕрд▓рд╛рд░реНрдо рд╣реИ;
  • рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЕрдВрддрд┐рдо рдЬреЛрдбрд╝реА рдХрд╛ рдирд┐рд╖реЗрдз, рднрд▓реЗ рд╣реА рдЙрдирдХреЗ рдЕрд▓рд╛рд░реНрдо рдЕрд▓рд╛рд░реНрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрдВ;
  • рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдерд╛ред

рдирд╖реНрдЯ-instance.yaml
 - name: look for alarm status describe_alarms: region: "croc" alarm_name_prefix: "scaling-low" alarm_state: "alarm" register: describe_alarms_query - name: count alarmed instances set_fact: alarmed_count: "{{ describe_alarms_query.meta | length }}" alarmed_ids: "{{ describe_alarms_query.meta }}" - name: stop if no alarms fail: msg: no alarms fired when: alarmed_count | int == 0 - name: count all described instances set_fact: all_count: "{{ groups['tag_role_backend'] | length }}" - name: fail if last two instance remaining fail: msg: cant destroy last two instances when: all_count | int == 2 - name: destroy tags for marked instances ec2_tag: ec2_url: "https://api.cloud.croc.ru" region: croc resource: "{{ alarmed_ids[0].split('_')[1] }}" state: absent tags: role: backend - name: destroy instances ec2: region: croc state: absent instance_ids: "{{ alarmed_ids[0].split('_')[1] }}" - name: destroy low alarms ec2_metric_alarm: state: absent region: croc name: "scaling-low_{{ alarmed_ids[0].split('_')[1] }}" - name: destroy high alarms ec2_metric_alarm: state: absent region: croc name: "scaling-high_{{ alarmed_ids[0].split('_')[1] }}" 

рдирд╖реНрдЯ-рдЖрд╡реГрддреНрддрд┐ редyaml рдореЗрдВ, рдЕрд▓рд╛рд░реНрдо рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЙрд╕рдХреЗ рдЯреИрдЧ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рд╛рд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╢рд░реНрддреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред


рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреИрдЧ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдЯреИрдЧ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЗ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВред
AWXред


рдХрд╛рд░реНрдп, рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗрдЯ рдХрд░рдирд╛


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕реЗрдЯ AWX рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЗрдХрд╛рдЗрдпрд╛рдБ рдмрдирд╛рдПрдЧрд╛:


AWX-configure.yaml
 --- - name: Create tower organization tower_organization: name: "scaling-org" description: "scaling-org organization" state: present - name: Add tower cloud credential tower_credential: name: cloud description: croc cloud api creds organization: scaling-org kind: aws state: present username: "{{ croc_user }}" password: "{{ croc_password }}" - name: Add tower github credential tower_credential: name: ghe organization: scaling-org kind: scm state: present username: "{{ ghe_user }}" password: "{{ ghe_password }}" - name: Add tower ssh credential tower_credential: name: ssh description: ssh creds organization: scaling-org kind: ssh state: present username: "ec2-user" ssh_key_data: "{{ lookup('file', 'private.key') }}" - name: Add tower project tower_project: name: "auto-scaling" scm_type: git scm_credential: ghe scm_url: <repo-name> organization: "scaling-org" scm_branch: master state: present - name: create inventory tower_inventory: name: dynamic-inventory organization: "scaling-org" state: present - name: copy inventory script to awx copy: src: "{{ role_path }}/files/ec2.py" dest: /root/ec2.py - name: create inventory source shell: | export SCRIPT=$(tower-cli inventory_script create -n "ec2-script" --organization "scaling-org" --script @/root/ec2.py | grep ec2 | awk '{print $1}') tower-cli inventory_source create --update-on-launch True --credential cloud --source custom --inventory dynamic-inventory -n "ec2-source" --source-script $SCRIPT --source-vars '{"EC2_URL":"api.cloud.croc.ru","AWS_REGION": "croc"}' --overwrite True - name: Create create-instance template tower_job_template: name: "create-instance" job_type: "run" inventory: "dynamic-inventory" credential: "cloud" project: "auto-scaling" playbook: "create-instance.yaml" state: "present" register: create_instance - name: Create update-lb template tower_job_template: name: "update-lb" job_type: "run" inventory: "dynamic-inventory" credential: "ssh" project: "auto-scaling" playbook: "update-lb.yaml" credential: "ssh" state: "present" register: update_lb - name: Create destroy-instance template tower_job_template: name: "destroy-instance" job_type: "run" inventory: "dynamic-inventory" project: "auto-scaling" credential: "cloud" playbook: "destroy-instance.yaml" credential: "ssh" state: "present" register: destroy_instance - name: create workflow tower_workflow_template: name: auto_scaling organization: scaling-org schema: "{{ lookup('template', 'schema.j2')}}" - name: set scheduling shell: | tower-cli schedule create -n "3min" --workflow "auto_scaling" --rrule "DTSTART:$(date +%Y%m%dT%H%M%SZ) RRULE:FREQ=MINUTELY;INTERVAL=3" 

рдкрд┐рдЫрд▓реА рд╕реНрдирд┐рдкреЗрдЯ, рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдкреНрд▓реЗрдмреБрдХ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдФрд░ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд▓реЗрдмреБрдХ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред


рдкреНрд▓реЗрдмреБрдХ рдореЗрдВ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдСрдЯреЛрд╕рд╛рд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реЗрдЯ рдХрд░рдирд╛ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


schema.j2
 - failure_nodes: - id: 101 job_template: {{ destroy_instance.id }} success_nodes: - id: 102 job_template: {{ update_lb.id }} id: 103 job_template: {{ create_instance.id }} success_nodes: - id: 104 job_template: {{ update_lb.id }} 

рдкрд┐рдЫрд▓рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдЖрд░реЗрдЦ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЕрдиреБрдХреНрд░рдоред рдЗрд╕ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓рд╛ рдЪрд░рдг (success_nodes) рдХреЗрд╡рд▓ рддрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдкрд┐рдЫрд▓рд╛ рд╡рд╛рд▓рд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реЛред рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд╛ рдЪрд┐рддреНрд░рдордп рдЪрд┐рддреНрд░рдг рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣


рдирддреАрдЬрддрди, рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдХреНрд░рд┐рдПрдЯ-рдЗрдВрд╕реНрдЯреЗрд╕ рдкреНрд▓реЗрдмреБрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░, рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕реНрдерд┐рддрд┐, рдирд╖реНрдЯ-рдЖрд╡реГрддреНрддрд┐ рдФрд░ / рдпрд╛ рдЕрдкрдбреЗрдЯ-рдПрд▓рдмреА рдкреНрд▓реЗрдмреБрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдПрдХреАрдХреГрдд рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╢реЗрдбреНрдпреВрд▓ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдСрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣рд░ рддреАрди рдорд┐рдирдЯ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдЧреА, рдЕрд▓рд╛рд░реНрдо рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ред


рдХрд╛рд░реНрдп рдкрд░реАрдХреНрд╖рдг


рдЕрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, http рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП wrk рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред


wrk install
 ssh -A ec2-user@<aws_instance_ip> sudo su - cd /opt yum groupinstall 'Development Tools' yum install -y openssl-devel git git clone https://github.com/wg/wrk.git wrk cd wrk make install wrk /usr/local/bin exit 

рд╣рдо рд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЙрдб рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


рдирд┐рдЧрд░рд╛рдиреА
 function CPUUtilizationMonitoring() { local AWS_CLI_PROFILE="<aws_cli_profile>" local CLOUDWATCH_URL="https://monitoring.cloud.croc.ru" local API_URL="https://api.cloud.croc.ru" local STATS="" local ALARM_STATUS="" local IDS=$(aws --profile $AWS_CLI_PROFILE --endpoint-url $API_URL ec2 describe-instances --filter Name=tag:role,Values=backend | grep -i instanceid | grep -oE 'i-[a-zA-Z0-9]*' | tr '\n' ' ') for instance_id in $IDS; do STATS="$STATS$(aws --profile $AWS_CLI_PROFILE --endpoint-url $CLOUDWATCH_URL cloudwatch get-metric-statistics --dimensions Name=InstanceId,Value=$instance_id --namespace "AWS/EC2" --metric CPUUtilization --end-time $(date --iso-8601=minutes) --start-time $(date -d "$(date --iso-8601=minutes) - 1 min" --iso-8601=minutes) --period 60 --statistics Average | grep -i average)"; ALARMS_STATUS="$ALARMS_STATUS$(aws --profile $AWS_CLI_PROFILE --endpoint-url $CLOUDWATCH_URL cloudwatch describe-alarms --alarm-names scaling-high-$instance_id | grep -i statevalue)" done echo $STATS | column -s ',' -o '|' -N $(echo $IDS | tr ' ' ',') -t echo $ALARMS_STATUS | column -s ',' -o '|' -N $(echo $IDS | tr ' ' ',') -t } export -f CPUUtilizationMonitoring watch -n 60 bash -c CPUUtilizationMonitoring 

60 рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдмрд╛рд░ рдкрд┐рдЫрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдкреАрдпреВ рдпреВрдЯрд┐рд▓рд╛рдЗрдЬреЗрд╢рди рдореАрдЯреНрд░рд┐рдХ рдХреЗ рдЕрдВрддрд┐рдо рдорд┐рдирдЯ рдХреЗ рдФрд╕рдд рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрддреА рд╣реИ рдФрд░ рдмреИрдХрдПрдВрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рд╛рд░реНрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рддреА рд╣реИред


рдЕрдм рдЖрдк рд░реЗрдХ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реЛрдб рдХреЗ рддрд╣рдд рдмреИрдХреЗрдВрдб рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


рдХреБрд▓реНрд╣рд╛рдбрд╝реА рдЪрд▓рд╛рдирд╛
 ssh -A ec2-user@<awx_instance_ip> wrk -t12 -c100 -d500s http://<haproxy_instance_id> exit 

рдЕрдВрддрд┐рдо рдЖрджреЗрд╢ 500 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛, 12 рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ 100 http рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓ рджреЗрдЧрд╛ред


рд╕рдордп рдХреЗ рд╕рд╛рде, рдирд┐рдЧрд░рд╛рдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рджреМрд░рд╛рди рд╕реАрдкреАрдпреВ рдпреВрдЯрд┐рд▓рд╛рдЗрдЬреЗрд╢рди рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдЖрдБрдХрдбрд╝рд╛ рдореВрд▓реНрдп 300% рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ 180 рд╕реЗрдХрдВрдб рдмрд╛рдж, StateValue рдзреНрд╡рдЬ рдХреЛ рдЕрд▓рд╛рд░реНрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд░ рджреЛ рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдСрдЯреЛрд╕реНрдХреЛрдкрд┐рдВрдЧ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рдорд╛рди рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рд╖рд┐рджреНрдз рд╣реИред рдпрд╣реА рд╣реИ, рд╣рд░ рджреЛ рдорд┐рдирдЯ рдореЗрдВ, рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рдХреЛрдк рдХреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреА, рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдмреИрдХреЗрдВрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЙрдЪреНрдЪ рдЕрд▓рд╛рд░реНрдо рдареАрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддреЗред рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, wrk scale_down рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕рднреА рд▓реЗрдХрд┐рди рджреЛ рдмреИрдХрдПрдВрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред


рдПрдХ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдЙрдЯрдкреБрдЯ:


рдирд┐рдЧрд░рд╛рдиреА рдкрд░рд┐рдгрд╛рдо
 # start test i-43477460 |i-AC5D9EE0 "Average": 0.0 | "Average": 0.0 i-43477460 |i-AC5D9EE0 "StateValue": "ok"| "StateValue": "ok" # start http load i-43477460 |i-AC5D9EE0 "Average": 267.0 | "Average": 111.0 i-43477460 |i-AC5D9EE0 "StateValue": "ok"| "StateValue": "ok" # alarm state i-43477460 |i-AC5D9EE0 "Average": 267.0 | "Average": 282.0 i-43477460 |i-AC5D9EE0 "StateValue": "alarm"| "StateValue": "alarm" # two new instances created i-1E399860 |i-F307FB00 |i-43477460 |i-AC5D9EE0 "Average": 185.0 | "Average": 215.0 | "Average": 245.0 | i-1E399860 |i-F307FB00 |i-43477460 |i-AC5D9EE0 "StateValue": "insufficient_data"| "StateValue": "insufficient_data"| "StateValue": "alarm"| "StateValue": "alarm" # only two instances left after load has been stopped i-935BAB40 |i-AC5D9EE0 "Average": 0.0 | "Average": 0.0 i-935BAB40 |i-AC5D9EE0 "StateValue": "ok"| "StateValue": "ok" 

рд╕реАрдЖрд░рдУрд╕реА рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рднреА, рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рдЯреИрдм рдкрд░ рдЙрджрд╛рд╣рд░рдг рдкреГрд╖реНрда рдкрд░ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЧреНрд░рд╛рдлрд╝ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рджреЗрдЦреЗрдВ рдЕрд▓рд╛рд░реНрдо рдЕрд▓рд╛рд░реНрдо рдЯреИрдм рдкрд░ рдирд┐рдЧрд░рд╛рдиреА рдкреГрд╖реНрда рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рдСрдЯреЛрд╕реНрдХреЛрд▓рд┐рдВрдЧ рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЕрднреА рддрдХ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИ (рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрднреА рдХреЗ рд▓рд┐рдП)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рд▓рдЧрднрдЧ рдорд╛рдирдХ, рдЙрдкрдХрд░рдг рдЬреИрд╕реЗ рдЯреЗрд░рд╛рдлреЙрд░реНрдо, рдПрдВрд╕рд┐рдмрд▓, рдПрдирд╡-рдХреНрд▓рд╛рдИ рдФрд░ рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдорд╛рди рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдкреАрдЖрдИ рд╣реИрдВред

Source: https://habr.com/ru/post/hi456826/


All Articles