
рднрдЧрд╡рд╛рди рдореЗрдВ рд╣рдо рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рдХреА рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
- рдЕрдЬреНрдЮрд╛рдд DevOps рдЗрдВрдЬреАрдирд┐рдпрд░
рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдФрд░ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдИрдЯреА рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджрд╕рд┐рдпреЛрдВ, рд╕реИрдХрдбрд╝реЛрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдЬрд╛рд░реЛрдВ рдЖрднрд╛рд╕реА рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рддреИрдпрд╛рд░ рдЫрд╡рд┐рдпрд╛рдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рд╕рднреА рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ, рддреЛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдмрд╛рд░ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЫрд╡рд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рддрдиреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рдЙрддрдиреА рдорд╢реАрдиреЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрди рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдХрдИ рджрд░реНрдЬрди рдХреА рднреА рд╕рд░реНрд╡рд┐рд╕рд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдХрдИ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдХрдИ рдХреНрд▓рд╛рдЙрдб рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рддрдерд╛рдХрдерд┐рдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рддрдВрддреНрд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЬрдм рдпрд╣ рдЪрд▓рддрд╛ рд╣реИ рд╕реНрдЯрд╛рд░реНрдЯ рдЕрдкред
рдПрдХ рдбрд┐рдЧреНрд░реА рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓реЗрдЦ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛:
- рдЕрдореЗрдЬрд╝рди ec2
- рдпреБрдХрд▓рд┐рдкреНрдЯреБрд╕
- рдирд┐рдВрдмреБрд▓рд╛ рдирд┐рд░реНрджреЗрд╢рдХ
- VMWare vCloud рдирд┐рджреЗрд╢рдХ
1. рд╕реАрдПрд▓рдЖрдИ рдпрд╛ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрд╡рд▓реЛрдХрди1.1 рдЕрдореЗрдЬрд╝реЕрди рдИрд╕реА 2рдРрдордЬрд╝реЙрди рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдореБрдлреНрдд рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рд┐рдВрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдХрд░реНрд▓ 169.254.169.254/latest/user-dataIP рдкрддрд╛ 169.254.169.254 рдЖрднрд╛рд╕реА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ IP2 рд╕реЗрд╡рд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕реНрд░реЛрдд рдЖрдИрдкреА рдкрддреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдореЗрдЬрд╝реЕрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдорд╛рдирдХ рдкреНрд░рдгрд╛рд▓реА рдХреА рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдмреИрд╢ рдФрд░ рдкрд╛рд╡рд░ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд╖рдорддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рд╢реЗрдмрдВрдЧ (#!) рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЙрдмрдВрдЯреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХреНрд▓рд╛рдЙрдб рдЗрдирд┐рдЯ рдкреИрдХреЗрдЬ рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рд╕рд╣рд┐рдд рд╕рднреА рдорд╛рдирдХ рд╕рд┐рд╕реНрдЯрдо рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдХрдВрд╕реЛрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ,
<script> netsh advfirewall set allprofiles state off </script>
рдФрд░ рдкрд╛рд╡рд░ рд╢реЗрд▓ рдкрд░ рдХреЛрдб:
<powershell> $source = "http://www.example.com/myserverconfig.xml" $destination = "c:\myapp\myserverconfig.xml" $wc = New-Object System.Net.WebClient $wc.DownloadFile($source, $destination) </powershell>
рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЙрдб рдлрд╝реЙрд░реНрдореЗрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реЗ рд╕рд░реНрд╡рд░ рд╕реНрдЯреИрдХ рдХреЛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "AvailabilityZone" : { "Description" : "Name of an availability zone to create instance", "Default" : "us-east-1c", "Type" : "String" }, "KeyName" : { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Default" : "test", "Type" : "String" }, "InstanceSecurityGroup" : { "Description" : "Name of an existing security group", "Default" : "default", "Type" : "String" } }, "Resources" : { "autoconftest" : { "Type" : "AWS::EC2::Instance", "Properties" : { "AvailabilityZone" : { "Ref" : "AvailabilityZone" }, "KeyName" : { "Ref" : "KeyName" }, "SecurityGroups" : [{ "Ref" : "InstanceSecurityGroup" }], "ImageId" : "ami-31308xxx", "InstanceType" : "t1.micro", "UserData" : { "Fn::Base64" : { "Fn::Join" : ["",[ "#!/bin/bash","\n", "instanceTag=WebServer","\n", "confDir=/etc/myconfig","\n", "mkdir $confDir","\n", "touch $confDir/$instanceTag","\n", "IPADDR=$(ifconfig eth0 | grep inet | awk '{print $2}' | cut -d ':' -f 2)","\n", "echo $IPADDR myhostname","\n", "hostname myhostname","\n" ]] } } }
рдпрджрд┐ рдорд╢реАрди рдХреЗ рд╢реБрд░реВ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛ рдЖрдкрдХреЛ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЖрдкрдХреА рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╡реЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рдПрдХ рдЫрд╡рд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЫрд╡рд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрди рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдХрд▓реНрдк рдХреБрдВрдЬреА рдХреА рдПрдХ рд╕реВрдЪреА = рдПрдХ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рдореВрд▓реНрдп:
рдЧреНрд░реЗрдЧреНрд▓реЙрдЬрд╝рд░ = "192.168.1.1"; рд╢реЗрдлрд╝реНрдиреЛрдбреЗрдирдо = "рд╢реЗрдлрд╝_рдиреЛрдбреЗрдирд╛рдо /рдирд╛рдо 1"; рд╢реЗрдлрд╝рдЯрд╛рдЙрдиреНрдЯреЗрдЬ = "рд░реЗрд╕рд┐рдкреА 1редрдЯреИрдЯрд░ 1 = рд╡реИрд▓реНрдпреВ 1, рд░реЗрд╕рд┐рдкреА 1редрдЯреИрдЯрд░ 2 = рдХрд╕реНрдЯрдо 2: рдХрд╕реНрдЯрдордкреИрд░рдореАрдЯрд░ 1 = рд╡реИрд▓реНрдпреВ 1"; рд╢реЗрдлрд╕реЗрдВрдЯрд░ = "192.168.1.38; 4,000; 4000; , php ";рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмреИрд╢ рдкрд░ рдкреВрд░реА рд▓рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
function get_userdata { user_data=$(curl -w "%{http_code}" -s http://169.254.169.254/latest/user-data) result_code=${user_data:(-3)} if [ -z "$user_data" ] || [ $result_code != "200" ] then echo "$CurrentDate: Couldn't receive user-data. Result code: $result_code" return 1 else export user_data=${user_data%%$result_code} return 0 fi }
рдФрд░ рдлрд┐рд░, рд╕реВрдЪреА рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛:
function get_userdata_value { IFS=';' for user_data_list in $user_data do user_data_name=${user_data_list%%=*} if [ $user_data_name = $1 ] then user_data_value=${user_data_list#*=} user_data_value=$(echo $user_data_value | tr -d '\"') return 0 fi done return 1 }
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЫрд╡рд┐ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ рдпрд╛ рд╢реЗрдлрд╝ рдпрд╛ рдХрдардкреБрддрд▓реА рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕реА рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╛рд╡рд░ рд╢реЗрд▓ рдкрд░ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
1.2 рдпреВрдХреЗрд▓рд┐рдкреНрдЯрд╕рдпрд╣ рдЙрддреНрдкрд╛рдж рдЕрдореЗрдЬрд╝реЕрди рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдЗрдВрдЬрди рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рез.рей рдирд┐рдВрдмреБрд▓рд╛рдпрд╣ рдЙрддреНрдкрд╛рдж рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдпреБрд╡рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдирд┐рдЬреА рдХреНрд▓рд╛рдЙрдб рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдФрд░ KVM рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдерд╛рдкрдХ рдЕрдореЗрдЬрд╝реЕрди рд╕реЗ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдЕрдореЗрдЬрд╝реЕрди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕рдВрдЧрддрддрд╛ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдЖрдИрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреБрдВрдЬреА = рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рд╣реИрдВред
рд╕рднреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓рд┐рдВрдХ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
192.0.0.192/latest/attributes рдпрд╛ 169.254.169.254/latest/attributesрдЙрджрд╛рд╣рд░рдг:
рдХрд░реНрд▓ 169.254.169.254/latest/attributes
nimbula_compressed_size
nimbula_decompressed_size
chefserver
рд╣реЛрд╕реНрдЯ рдирд╛рдо
рдХреБрдВрдЬреА рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
рдХрд░реНрд▓ 169.254.169.254/latest/attributes/chefserver
192.168.1.45:4000рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкреВрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╢реБрд░реБрдЖрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕рд┐рд╕реНрдЯрдо рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмреИрд╢ рдирдореВрдирд╛ рдХреЛрдб:
function get_value { user_data_value=$(curl curl -w "%{http_code}" -s http://169.254.169.254/latest/attributes/"$1") result_code=${user_data_value:(-3)} if [ -z "$user_data_value" ] || [ $result_code != "200" ] then echo "$CurrentDate: $1 variable is not set, skip it, return code: $result_code" >> $LogFile return 1 else user_data_value=${user_data_value%%$result_code} return 0 fi }
1.4 VMWare vCloud рдирд┐рджреЗрд╢рдХрд╕рдВрд╕реНрдХрд░рдг 1.5 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, vCloud рдирд┐рджреЗрд╢рдХ рдиреЗ vAP (рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░) рдХреЗ рднреАрддрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдХреБрдВрдЬреА = рдорд╛рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде XML рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<Metadata xmlns="http://www.vmware.com/vcloud/v1.5"> <MetadataEntry> <Key>app-owner</Key> <Value>Foo Bar</Value> </MetadataEntry> <MetadataEntry> <Key>app-owner-contact</Key> <Value>415-123-4567</Value> </MetadataEntry> <MetadataEntry> <Key>system-owner</Key> <Value>John Doe</Value> </MetadataEntry> </Metadata>
рдФрд░ рдлрд┐рд░, рд╕рдВрдмрдВрдзрд┐рдд vApp рдХреЗ рд▓рд┐рдП URL рдкрд░ рдПрдХ POST рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ:
$ curl -i -k -H "рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ: рдЖрд╡реЗрджрди / * + xml; рд╕рдВрд╕реНрдХрд░рдг = 1.5" -H "x-vcloud-рдкреНрд░рд╛рдзрд┐рдХрд░рдг: jmw43CwPAKdQS7t / EWd0HsP00 / 9 / QFyd / 2k / USs8uZtY =" -H "рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдЖрд╡реЗрджрди / vnd.vmware.vcloud.metadata + xml "-X POST 10.20.181.101/api/vApp/vapp-1468a37d-4ede-4cac-9385-627674b0b59f/metadata -d @ рдореЗрдЯрд╛рдбреЗрдЯрд╛-рдЕрдиреБрд░реЛрдзредрдЖрдк рдПрдХ GET рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╕рднреА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
$ рдХрд░реНрд▓-рдЖрдИ-рдПрдЪ-рдПрдЪ "рдЖрд╡реЗрджрди / * + xml; рд╕рдВрд╕реНрдХрд░рдг = 1.5" -рдПрдЪ "рдПрдХреНрд╕-рд╡рдХреНрд▓рд╛рдЙрдб-рдкреНрд░рд╛рдзрд┐рдХрд░рдг: jmw43CwPAKdQS7t / EWd0HsP0 + 9 / QFyd / 2k / USs8uZtY =" -X GET 10.20.181.101.101 /ap/ vApp / vapp-1468a37d-4ede-4cac-9385-627678b0b59f / рдореЗрдЯрд╛рдбрд╛рдЯрд╛ редрд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреБрдВрдЬреА рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд░реЛрдз рдлреЙрд░реНрдо рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
$ рдХрд░реНрд▓-рдЖрдИ-рдПрдЪ-рдПрдЪ "рдЖрд╡реЗрджрди / * + xml; рд╕рдВрд╕реНрдХрд░рдг = 1.5" -рдПрдЪ "рдПрдХреНрд╕-рд╡рдХреНрд▓рд╛рдЙрдб-рдкреНрд░рд╛рдзрд┐рдХрд░рдг: jmw43CwPAKdQS7t / EWd0HsP0 + 9 / QFyd / 2k / USs8uZtY =" -X GET 10.20.181.101.101 /ap/ vApp / vapp-1468a37d-4ede-4cac-9385-627678b0b59f / рдореЗрдЯрд╛рдбреЗрдЯрд╛ / рдПрд╕реЗрдЯ-рдЯреИрдЧрдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ XML рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред
рдпрд╣рд╛рдБ vCloud рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ :
рдмреНрд▓реЙрдЧ vmware2. рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ, рдЬреИрд╕реЗ: рдмрд╛рд╡рд░реНрдЪреА рдФрд░ рдХрдардкреБрддрд▓реАреи.рез рдорд╣рд╛рд░рд╛рдЬрдпрд╣ рдЪреБрдирдирд╛ рдХрд┐ рд╢реЗрдл рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдорд╢реАрди рдХреИрд╕реЗ рдорд┐рд▓рддреА рд╣реИ, рд╡рд╣ рдЖрдкрдХрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╕рд┐рд╕реНрдЯрдо рдЗрдореЗрдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рд╣реИрдВ: рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рдХреЗ рджреМрд░рд╛рди рдорд╢реАрди рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдХреЛ рдХрдо рдХрд░рддреА рд╣реИ, рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдореЗрд╢рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдЦреНрддреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЙрди рднреВрдорд┐рдХрд╛рдУрдВ рдФрд░ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдорд╢реАрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╢реЗрдл рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдпрджрд┐ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╢реЗрдл рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╡реИрджреНрдпрддрд╛ (рдбрд╛рдЙрдирд▓реЛрдб) рдХреБрдВрдЬреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреА рд╣реЛрдЧреА (рдбреЗрдЯрд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬрд┐рд╕реЗ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ:
rolefile="/etc/chef/role.json" function get_role { get_value "chefrole" if [ $? = 0 ] then chefrole=$user_data_value else echo "$CurrentDate: Couldn't get any Chef role, use base role only." chefrole="base" fi commas_string=${chefrole//[!,]/} commas_count=${#commas_string} echo '{ "run_list": [ ' > $rolefile IFS="," for line in $ep_chefrole do if [ $commas_count = 0 ] then echo "\"role[$line]\" " >> $rolefile else echo "\"role[$line]\", " >> $rolefile fi commas_count=$(($commas_count-1)) done echo ' ] }' >> $rolefile }
рдФрд░ рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ:
function set_chef { if [ -d $chef_dir ] && [ -e $chef_bin ] then service $chef_service stop sleep 10 echo -e "chef_server_url \"http://$1\"" > $chef_dir/client.rb echo -e "log_location \"$chef_log\"" >> $chef_dir/client.rb echo -e "json_attribs \"$rolefile\"" >> $chef_dir/client.rb echo -e "interval $chef_interval" >> $chef_dir/client.rb echo "$CurrentDate: Writing $chef_dir/client.rb" service $chef_service start else echo "$CurrentDate: Chef directory $chef_dir or chef binary $chef_bin does not exist. Exit." exit 1 fi }
Json_attributes рдкреИрд░рд╛рдореАрдЯрд░ рднреВрдорд┐рдХрд╛рдУрдВ рдФрд░ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде JSON рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдЬрдм рд╣рдордиреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╢реЗрдл рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреА рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдирдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░реЗрдЧрд╛,
рд▓реЗрдХрд┐рди рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ :
- рдХреБрдЫ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ рдпрд╛ рдирд╣реАрдВ
- рдЕрдЧрд░ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо LAMP рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЕрдкрд╛рдЪреЗ рдкреЛрд░реНрдЯ 8080 рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ 80
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдкреНрд╕рдХреЛрдб рдХреБрдХрдмреБрдХ рд╣реИ рдЬрд┐рд╕реЗ chef_handler рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдкрд╡рд╛рдж рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рд╣реИрдВрдбрд▓рд░ рдирд╛рдордХ рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рд╡рд░реНрдЪреА рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд░рд╕реЛрдИ рдХреА рдХрд┐рддрд╛рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЕрдВрддрд┐рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ (
рдУрдкреНрд╕реЛрдб рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдг ) рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╡рд░реНрдЪреА рд╕рд░реНрд╡рд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдкрдХрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЙрджрд╛рд╣рд░рдг:
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ
default['lastrun']['state'] = "unknown" default['lastrun']['backtrace'] = "none"
рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
include_recipe "chef_handler" chef_handler "NodeReportHandler::LastRun" do source "#{node.chef_handler.handler_path}/nodereport.rb" action :nothing end.run_action(:enable)
рд╣рдо рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ
module NodeReportHandler class LastRun < Chef::Handler def report if success? then node.override[:lastrun][:state] = "successful" node.override[:lastrun][:backtrace] = "none" else node.override[:lastrun][:state] = "failed" node.override[:lastrun][:backtrace] = "
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ 'рдЕрдЬреНрдЮрд╛рдд' рдФрд░ 'рдХреЛрдИ рдирд╣реАрдВ' рдХреЗ рд▓рд┐рдП lastrun.state рдФрд░ lastrun.backtrace рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рди рд╕реЗрдЯ рдХрд┐рдП рдФрд░ рдлрд┐рд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╛ рддреЛ 'рд╕рдлрд▓' рдпрд╛ 'рдЕрд╕рдлрд▓' рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐rrun рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред рдкрд╢реНрд╡-рдЕрдиреБрд░реЗрдЦрдиред
рдпрд╣ рдиреБрд╕реНрдЦрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реВрдЪреА рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдиреБрд╕реНрдЦрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдореЗрдЬрд╝рди:
рд╣рдореЗрдВ рдкреВрд░реА рд▓рд╛рдЗрди рдорд┐рд▓рддреА рд╣реИ
рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ
рдЕрдм, рдЬрдм рд╣рдо рдкреНрд░рд╕рд╛рд░рд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
hefnodename = "chef_node_name1"; chefattributes = "recipe1.attribute1 = value1, recipe1.attribute2 = value2, customparameter1 = value1"; chefserver = "192.168.1.38:4000"; chefrole = "apache, mysqlред mysqp;рд╢реЗрдлрдЯреИрдмреНрдпреВрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рд╣рдордиреЗ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкрд╛рд░рд┐рдд рдХреА рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ "cookbookname.attributename = value" рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрджрд┐ рд╣рдо Apache рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЛрд░реНрдЯ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ chefattributes = apache.port = 8080 рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХ рдиреБрд╕реНрдЦрд╛ рдЬреЛ рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ:
chefattributes = GetValue("#{node[:user_data]}","chefattributes") if chefattributes != false hefattributes.split(",").each do |i| attribute_name=i.split("=") recipe_name=attribute_name[0].split(".", 2) node.override[:"#{recipe_name[0]}"][:"#{recipe_name[1].strip}"]="#{attribute_name[1].strip}" Chef::Log.info("Save node attributes.") node.save else Chef::Log.info("Couldn't get Chef attributes. Skip.") end
рдмрд╛рдХреА рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдиреБрд╕реНрдЦрд╛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрдкрд░реЛрдХреНрдд рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рдиреБрдХрд╕рд╛рдиред рдиреЛрдб.рд╕реИрд╡ рдСрдкрд░реЗрд╢рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ JSON рд╕рд░рдгреА рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ Ohai рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рдЬрд╛рд░реЛрдВ рдорд╢реАрдиреЗрдВ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рд▓рдЧрд╛рддрд╛рд░ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЗрд╕рд╕реЗ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдкреНрд░рддрд┐рдХреВрд▓ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рдмрд╛рдд рд╢реЗрдл рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд▓рдЪреАрд▓реА рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рд╕рд░реНрдЪ рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдЬрд╛рд░реЛрдВ рдорд╢реАрдиреЛрдВ рдХреА рд╕рд░реНрд╡рд┐рд╕рд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдмрдбрд╝рд╛ рднрд╛рд░ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
реи.реи рдХрдардкреБрддрд▓реАрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдардкреБрддрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реЗрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдкрдкреЗрдЯ рд╕рд░реНрд╡рд░ рдПрдбреНрд░реЗрд╕ рдФрд░ рдПрдЬреЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реНрдЯрд╛рд░реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЗ рддрдереНрдпреЛрдВ рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрдХреНрдЯрд░ рдРрдб-рдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд░реВрдмреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдбреЗрдЯрд╛ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрдереНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ:
require 'facter' user_data = `curl http://169.254.169.254/latest/user-data` user_data = user_data.split(";") user_data.each do |line| user_data_key_value = line.split('=', 2) user_data_key = user_data_key_value[0] user_data_value = user_data_key_value[1] Facter.add(user_data_key) do setcode { user_data_value } end end instance_id = `curl http://169.254.169.254/latest/meta-data/instance-id` Facter.add('instance-id') do setcode { instance_id } end
рдмреЗрд╢рдХ, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рд╕рд░рд▓ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓ рдпреЛрдЬрдирд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдкреНрд░реАрдЗрдВрд╕реНрдЯреЙрд▓реНрдб рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рднреА рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрд╕рдПрд╕рдПрдЪ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрд▓реЗрдЦ рдореВрд▓ рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ Hadoop, MySQL рдХреНрд▓рд╕реНрдЯрд░ рдпрд╛ рдлреНрд░рдВрдЯ-рдПрдВрдб, рдмреИрдХ-рдПрдВрдб, рдРрдк, DB рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕рднреА рдорд╢реАрдиреЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛ рдЬрд╛рдПрдВ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╢реАрдиреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рддрд╛ред
рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреНрдп рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред