Terraform рдХреЛ рд╕рд╛рде vm ESXi рджреНрд░реБрдд рдбрд┐рдкреНрд▓реЛрдп

рд╕рдмреИрд▓рд╛рдИ рдирдорд╕реНрдХрд╛рд░, рдореЗрд░реЛ рдирд╛рдо рдЗрднрд╛рди рд╣реЛ рд░ рдо рдЕрд▓реНрдХреЛрд╣рд▓ рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рд╢рд╛рд╕рдХ (OPS) рд╣реБрдБред

рдо рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдмрддрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ рдо рдХрд╕рд░реА рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ vCenter рдмрд┐рдирд╛ ESXi рдорд╛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдЫреБред

рдкреНрд░рд╛рдп: рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рд╡рд╛ рддреНрдпреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВ рдбрд┐рдкреНрд▓реЛрдп/рдкреБрди: рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдЖрд▓рд╕реНрдпрдХреЛ рдХрд╛рд░рдг, рдореИрд▓реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рд╕реЛрдЪреЗрдВред рдореЗрд░реЛ рдЦреЛрдЬрд▓реЗ рдорд▓рд╛рдИ рдХрдореНрдкрдиреАрдмрд╛рдЯ рдПрдХ рдЕрджреНрднреБрдд рдЙрддреНрдкрд╛рджрдирдорд╛ рдкреБрд░реНрдпрд╛рдпреЛ hashicorp, terraform.

рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ рдзреЗрд░реИ рдорд╛рдирд┐рд╕рд╣рд░реВрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ Terraform рдХреЗ рд╣реЛ, рддрд░ рдЬреЛ рдерд╛рд╣рд╛ рдЫреИрди, рдпреЛ рдХреБрдиреИ рдкрдирд┐ рдХреНрд▓рд╛рдЙрдб, рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рд╡рд╛ рд╕реЗрд╡рд╛ IasC рдЕрд╡рдзрд╛рд░рдгрд╛ (рдХреЛрдбрдХреЛ рд░реВрдкрдорд╛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░).

рдо ESXi рд▓рд╛рдИ рдореЗрд░реЛ рднрд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд╡рд╛рддрд╛рд╡рд░рдгрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред рдПрдХрджрдо рд╕рд░рд▓, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░ рднрд░рдкрд░реНрджреЛред
рдо рдПрдЙрдЯрд╛ рдкреНрд░рд╢реНрдирдХреЛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЧрд░реНрдЫреБред

рдпрджрд┐ рддрдкрд╛рдЗрдБ vCenter рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рдХрд┐рди terraform?

рдЕрд╡рд╢реНрдп рдкрдирд┐ рддрдкрд╛рдИрдВ рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ ... рдкрд╣рд┐рд▓реЛ, рдпреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдЬрд╛рдЬрддрдкрддреНрд░ рд╣реЛ, рджреЛрд╕реНрд░реЛ, рдпреЛ рдЙрддреНрдкрд╛рджрди рдзреЗрд░реИ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдЫ рд░ рдХреЗрд╡рд▓ рдореЗрд░реЛ рдЧреГрд╣ рд╕рд░реНрднрд░рдорд╛ рдлрд┐рдЯ рд╣реБрдиреЗрдЫреИрди, рд░ рддреЗрд╕реНрд░реЛ, рдпреЛ рддрдкрд╛рдЗрдБрдХреЛ рдХреМрд╢рд▓ рдЕрдкрдЧреНрд░реЗрдб рдЧрд░реНрдиреЗ рдЕрд╡рд╕рд░ рд╣реЛред

Intel NUC рдкреНрд▓реЗрдЯрдлрд░реНрдорд▓реЗ рд╕рд░реНрднрд░рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдп рдЧрд░реНрджрдЫ:

CPU: 2 CPUs x Intel(R) Core(TM) i3-4010U CPU @ 1.70GHz
RAM: 8Gb
HDD: 500Gb
ESXi version: ESXi-6.5.0-4564106-standard (VMware, Inc.)

рд░ рддреНрдпрд╕реЛрднрдП, рдкрд╣рд┐рд▓реЛ рдЪреАрдЬрд╣рд░реВ рдкрд╣рд┐рд▓реЗред

рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐, esxi рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реМрдВ, рдЕрд░реНрдерд╛рддреН, рдлрд╛рдпрд░рд╡рд╛рд▓ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ VNC рдкреЛрд░реНрдЯ рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реНред

рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, рдлрд╛рдЗрд▓ рд▓реЗрдЦрди рд╕реБрд░рдХреНрд╖рд┐рдд рдЫред рд╣рд╛рдореА рдирд┐рдореНрди рд╣реЗрд░рдлреЗрд░рд╣рд░реВ рдЧрд░реНрдЫреМрдВ:

chmod 644 /etc/vmware/firewall/service.xml
chmod +t /etc/vmware/firewall/service.xml
vi /etc/vmware/firewall/service.xml

рдлрд╛рдЗрд▓рдХреЛ рдЕрдиреНрддреНрдпрдорд╛ рдирд┐рдореНрди рдмреНрд▓рдХ рдердкреНрдиреБрд╣реЛрд╕реН:

<service id="1000">
  <id>packer-vnc</id>
  <rule id="0000">
    <direction>inbound</direction>
    <protocol>tcp</protocol>
    <porttype>dst</porttype>
    <port>
      <begin>5900</begin>
      <end>6000</end>
    </port>
  </rule>
  <enabled>true</enabled>
  <required>true</required>
</service>

рд╣рд╛рдореА рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреНрдЫреМрдВ рд░ рдмрдЪрдд рдЧрд░реНрдЫреМрдВред рдЕрдзрд┐рдХрд╛рд░ рдлрд┐рд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╕реЗрд╡рд╛ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refresh

рд╣реЛрд╕реНрдЯ рд░рд┐рдмреБрдЯ рдирднрдПрд╕рдореНрдо рдорд╛рдиреНрдпред рдкрдЫрд┐, рдпреЛ рд╣реЗрд░рдлреЗрд░ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдиреБ рдкрд░реНрдЫред

рдЕрдмрджреЗрдЦрд┐ рдо рдПрдЙрдЯреИ рд╕рд░реНрднрд░рдорд╛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирдорд╛ рд╕рдмреИ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫреБред

рдЙрддреНрдкрд╛рджрди рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рд╣рд░реВ:

OS: Centos 7 x86_64 minimal
RAM: 1GB
HDD: 20GB
Selinux: disable
firewalld: disable

рдЕрд░реНрдХреЛ рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреНрдЫ рдкреНрдпрд╛рдХрд░, HashiCorp рдХреЛ рдЙрддреНрдкрд╛рджрди рдкрдирд┐ред

рдпреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ "рд╕реБрдиреМрд▓реЛ" рдЫрд╡рд┐ рдЬрдореНрдорд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЬрд╕рд▓рд╛рдИ рд╣рд╛рдореА рднрд╡рд┐рд╖реНрдпрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред

yum install unzip git -y
curl -O https://releases.hashicorp.com/packer/1.5.5/packer_1.5.5_linux_amd64.zip
unzip packer_1.5.5_linux_amd64.zip -d /usr/bin && rm -rf packer_1.5.5_linux_amd64.zip
packer version
Packer v1.5.5

рдЪрд╛рд▓ рдорд╛ рдкреНрдпрд╛рдХрд░ рд╕рдВрд╕реНрдХрд░рдг рддреНрд░реБрдЯрд┐ рд╣реБрди рд╕рдХреНрдЫ рдХрд┐рдирднрдиреЗ RedHat-рдЖрдзрд╛рд░рд┐рдд рдорд╛ рд╕рдорд╛рди рдирд╛рдордХреЛ рдкреНрдпрд╛рдХреЗрдЬ рд╣реБрди рд╕рдХреНрдЫред

which -a packer
/usr/sbin/packer

рдпрд╕рд▓рд╛рдИ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, рддрдкрд╛рдЗрдБ рд╕рд┐рдорд▓рд┐рдЩреНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╡рд╛ рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рд░реНрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ /usr/bin/packerред

рдЕрдм рд╣рд╛рдореАрд▓рд╛рдИ ovftool рдЪрд╛рд╣рд┐рдиреНрдЫ рдбрд╛рдЙрдирд▓реЛрдб рд▓рд┐рдВрдХред рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд╕рд░реНрднрд░рдорд╛ рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН рд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Extracting VMware Installer...done.
You must accept the VMware OVF Tool component for Linux End User
License Agreement to continue.  Press Enter to proceed.
VMWARE END USER LICENSE AGREEMENT
Do you agree? [yes/no]:yes
The product is ready to be installed.  Press Enter to begin
installation or Ctrl-C to cancel. 
Installing VMware OVF Tool component for Linux 4.4.0
    Configuring...
[######################################################################] 100%
Installation was successful.

рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВред

рдореИрд▓реЗ рдЧрд┐рдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕рдмреИ рддрдпрд╛рд░реА рдЧрд░реЗрдВред

git clone https://github.com/letnab/create-and-deploy-esxi.git && cd create-and-deploy-esxi

рдлреЛрд▓реНрдбрд░рдорд╛ рдареВрд▓реЛ рддрдкрд╛рдИрдВрд▓реЗ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рддрд░рдг рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдореЗрд░реЛ рдорд╛рдорд▓рд╛ рдорд╛ рдпреЛ centos 7 рд╣реЛред

рддрдкрд╛рдИрдВрд▓реЗ рдлрд╛рдЗрд▓ рдкрдирд┐ рд╕рдореНрдкрд╛рджрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ centos-7-base.json:

variables: ╤Г╨║╨░╨╖╨░╤В╤М ╤Б╨▓╨╛╨╕ ╨┤╨░╨╜╨╜╤Л╨╡ ╨┤╨╗╤П ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╤П
iso_urls: ╤Г╨║╨░╨╖╨░╤В╤М ╨░╨║╤В╤Г╨░╨╗╤М╨╜╤Л╨╣
iso_checksum: ╤З╨╡╨║╤Б╤Г╨╝╨╝╨░ ╨▓╨░╤И╨╡╨│╨╛ ╨╛╨▒╤А╨░╨╖╨░ 

рд╕рдмреИ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдкрдЫрд┐, рдирд┐рд░реНрдорд╛рдг рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

/usr/bin/packer build centos-7-base.json

рдпрджрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рд╕рд╣реА рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдордХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдерд╛рдкрдирд╛рдХреЛ рддрд╕реНрд╡реАрд░ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫред рдпреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓реЗ рдорд▓рд╛рдИ 7-8 рдорд┐рдиреЗрдЯ рд▓рд┐рдиреНрдЫред

рдлреЛрд▓реНрдбрд░рдорд╛ рд╕рдлрд▓ рд╕рдорд╛рдкреНрддрд┐ рдкрдЫрд┐ output-packer-centos7-x86_64 рддреНрдпрд╣рд╛рдБ ova рдлрд╛рдЗрд▓ рд╣реБрдиреЗрдЫред

Terraform рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

curl -O https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip
unzip terraform_0.12.24_linux_amd64.zip -d /usr/bin/ && rm -rf terraform_0.12.24_linux_amd64.zip
terraform version
Terraform v0.12.24

Terraform рд╕рдБрдЧ ESXi рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рджрд╛рдпрдХ рдирднрдПрдХреЛрд▓реЗ, рддрдкрд╛рдИрдВрд▓реЗ рдПрдЙрдЯрд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдЬрд╛рдиреЗ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

cd /tmp
curl -O https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz && rm -rf go1.14.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.14.2 linux/amd64

рдЕрд░реНрдХреЛ, рд╣рд╛рдореА рдкреНрд░рджрд╛рдпрдХ рд╕рдЩреНрдХрд▓рди:

go get -u -v golang.org/x/crypto/ssh
go get -u -v github.com/hashicorp/terraform
go get -u -v github.com/josenk/terraform-provider-esxi
export GOPATH="$HOME/go"
cd $GOPATH/src/github.com/josenk/terraform-provider-esxi
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-w -extldflags "-static"' -o terraform-provider-esxi_`cat version`
cp terraform-provider-esxi_`cat version` /usr/bin

рд╣рд╛рдореА рдЕрдиреНрддрд┐рдо рд░реЗрдЦрд╛рдорд╛ рдЫреМрдВред рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐ рд░реЛрд▓ рдЖрдЙрдЯ рдЧрд░реМрдВред

рдлреЛрд▓реНрдбрд░рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН:

cd /root/create-and-deploy-esxi/centos7

рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рдлрд╛рдЗрд▓ рд╕рдореНрдкрд╛рджрди рдЧрд░реНрдиреБрд╣реЛрд╕реН variables.tfред рддрдкрд╛рдИрдВрд▓реЗ ESXi рд╕рд░реНрднрд░рдорд╛ рдЬрдбрд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдлрд╛рдЗрд▓рдорд╛ network_config.cfg рднрд╡рд┐рд╖реНрдпрдХреЛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░рд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдЕрдиреБрд░реВрдк рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдЫреМрдВ рд░ рдПрдХ-рд▓рд╛рдЗрдирд░ рдЪрд▓рд╛рдЙрдБрдЫреМрдВ:

sed -i -e '2d' -e '3i "network": "'$(gzip < network_config.cfg| base64 | tr -d 'n')'",' metadata.json

рдЦреИрд░, рдлрд╛рдЗрд▓рдорд╛ main.tf рдпрджрд┐ рдлрд░рдХ рдЫ рднрдиреЗ, рдЖрдлреНрдиреЛ рдЖрдлреНрдиреИ ova рдлрд╛рдЗрд▓рдХреЛ рдмрд╛рдЯреЛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╕рддреНрдп рдХреЛ рдХреНрд╖рдгред

terraform init
Initializing the backend...

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.esxi: version = "~> 1.6"
* provider.template: version = "~> 2.1"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.template_file.Default: Refreshing state...
data.template_file.network_config: Refreshing state...

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # esxi_guest.Default will be created
  + resource "esxi_guest" "Default" {
      + boot_disk_size         = (known after apply)
      + disk_store             = "datastore1"
      + guest_name             = "centos7-test"
      + guest_shutdown_timeout = (known after apply)
      + guest_startup_timeout  = (known after apply)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (known after apply)
      + id                     = (known after apply)
      + ip_address             = (known after apply)
      + memsize                = "1024"
      + notes                  = (known after apply)
      + numvcpus               = (known after apply)
      + ovf_properties_timer   = (known after apply)
      + ovf_source             = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + power                  = "on"
      + resource_pool_name     = (known after apply)
      + virthwver              = (known after apply)

      + network_interfaces {
          + mac_address     = (known after apply)
          + nic_type        = (known after apply)
          + virtual_network = "VM Network"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

рд╕рдорд╛рдкреНрдд:

terraform apply

рдпрджрд┐ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рддрд░рд┐рдХрд╛рд▓реЗ рдЧрд░рд┐рдпреЛ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ 2-3 рдорд┐рдиреЗрдЯрдорд╛ рдкрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫрд╡рд┐рдмрд╛рдЯ рдирдпрд╛рдБ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рддреИрдирд╛рдд рдЧрд░рд┐рдиреЗрдЫред

рдпреА рд╕рдмреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдХреЗрд╡рд▓ рдЖрдлреНрдиреЛ рдХрд▓реНрдкрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдЫрдиреНред

рдо рдпреА рдЙрддреНрдкрд╛рджрдирд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛ рдореЗрд░реЛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдЧрд░реНрди рд░ рдореБрдЦреНрдп рдмреБрдБрджрд╛рд╣рд░реВ рджреЗрдЦрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБред

рдзреНрдпрд╛рди рджрд┐рдиреБрднрдПрдХреЛрдорд╛ рдзрдиреНрдпрд╡рд╛рдж!

PS: рдо рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдкрд╛рдЙрдБрджрд╛ рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди