Cfengine3 - рдкреЙрд▓рд┐рд╕реА рд╣рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛

рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЕрджреНрднреБрдд cfengine3 рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рдЖрдЬ рд╣рдо рдЗрд╕реЗ рдЧреНрд░рд╛рд╣рдХ-рд╕рд░реНрд╡рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдЕрдзрд┐рдХ рдареАрдХ-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред



рдЧреНрд░рд╛рд╣рдХ рдФрд░ рдкреЙрд▓рд┐рд╕реА рд╕рд░реНрд╡рд░ (рдкреЙрд▓рд┐рд╕реА рд╣рдм) рджреЛрдиреЛрдВ рдкрд░, рдкрд┐рдЫрд▓реЗ рдиреЛрдЯ рдХреА рддрд░рд╣, cigerine3 рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ cfengine3 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдкреБрдЯ: рдиреАрддрд┐рднреБрдм 198.51.100.10, srv01.local 203.0.113.101ред рд╣рдо рдЦреБрдж рдХреЛ рдПрдХ рдкреЙрд▓рд┐рд╕реА рд╣рдм (198.51.100.10 рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдЖрдИрдкреА) рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкреЙрд▓рд┐рд╕реА рд╣рдм рдареАрдХ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдиреАрддрд┐рдпреЛрдВ рдХреЗ рдХреЗрдВрджреНрд░реАрдХреГрдд рднрдВрдбрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓рдЧрднрдЧ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди рд╕рд┐рд╕реНрдЯрдо рдкреБрд╢ рдХреЗ рдмрдЬрд╛рдп рдкреБрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдРрд╕реЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдиреЛрдЯ рдХреА рдорд╛рддреНрд░рд╛ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд░реВрдЯ @ policyhub01: / tmp # / var / cfengine / bin / cf-agent --bootstrap --policy-server = 198.51.100.10
** CFEngine BOOTSTRAP probe initiated @@@ @@@ CFEngine @ @@@ @ CFEngine Core 3.4.1 @ @@@ @ @ @@@ @ @ @ @@@ @ @ @ @ @ @ Copyright (C) CFEngine AS 2008-2012 See Licensing at http://cfengine.com/3rdpartylicenses -> This host is: policyhub01.local -> Operating System Type is linux -> Operating System Release is 3.6.10-vs2.3.4.6 -> Architecture = x86_64 -> Internal soft-class is linux -> No policy failsafe discovered, assume temporary bootstrap vector -> No previous policy has been cached on this host -> Assuming the policy distribution point at: 198.51.100.10:/var/cfengine/masterfiles -> Attempting to initiate promised autonomous services... ** This host recognizes itself as a CFEngine Policy Hub, with policy distribution and knowledge base. -> The system is now converging. Full initialisation and self-analysis could take up to 30 minutes R: This host assumes the role of policy distribution host R: -> Updated local policy from policy server R: -> Started the server R: -> Started the scheduler -> Bootstrap to 198.51.100.10 completed successfully 

рдЕрдм рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдВ:
рд░реВрдЯ @ srv01: / tmp # / var / cfengine / bin / cf-agent --bootstrap --policy-server = 198.51.100.10
 -> No policy failsafe discovered, assume temporary bootstrap vector -> No previous policy has been cached on this host -> Assuming the policy distribution point at: 198.51.100.10:/var/cfengine/masterfiles -> Attempting to initiate promised autonomous services... Challenge response from server 198.51.100.10/198.51.100.10 was incorrect! !! Authentication dialogue with 198.51.100.10 failed R: This autonomous node assumes the role of voluntary client R: !! Failed to pull policy from policy server R: !! Did not start the scheduler !! Bootstrapping failed, no input file at /var/cfengine/inputs/promises.cf after bootstrap   . 

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ! рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, cfengine3 рдХреЗрд╡рд▓ рдЕрдкрдиреЗ / 16 рд╕реЗ рдореЗрдЬрдмрд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рд╣реИ рдФрд░ рдЗрд╕реЗ рддреБрд░рдВрдд /var/cfengine/inputs/def.cf рдФрд░ /var/cfengine/inputs/controls/cf_serverd.cf рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо plicyhub01 рдкрд░ рдлрд╝рд╛рдЗрд▓ /var/cfengine/inputs/def.cf рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ
  "acl" slist => { "$(sys.policy_hub)", "203.0.113.101/32", }, 

(рдФрд░ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ?) рдХреБрдВрдЬреА рд╡рд┐рдирд┐рдордп рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдЖрдИрдкреА рджреНрд╡рд╛рд░рд╛ 'рдЯреНрд░рд╕реНрдЯ' рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред Srv01 рдкрд░ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ: рд░реВрдЯ @ srv01: / tmp # / var / cfengine / bin / cf-agent --bootstrap --policy-server = 198.51.100.10
 ** CFEngine BOOTSTRAP probe initiated @@@ @@@ CFEngine @ @@@ @ CFEngine Core 3.4.1 @ @@@ @ @ @@@ @ @ @ @@@ @ @ @ @ @ @ Copyright (C) CFEngine AS 2008-2012 See Licensing at http://cfengine.com/3rdpartylicenses -> This host is: srv01.local -> Operating System Type is linux -> Operating System Release is 3.6.10-vs2.3.4.6 -> Architecture = x86_64 -> Internal soft-class is linux -> An existing policy was cached on this host in /var/cfengine/inputs -> Assuming the policy distribution point at: 198.51.100.10:/var/cfengine/masterfiles -> Attempting to initiate promised autonomous services... R: This autonomous node assumes the role of voluntary client -> Bootstrap to 198.51.100.10 completed successfully 

рд╕рдлрд▓рддрд╛! рдЕрдм рдкреЙрд▓рд┐рд╕реАрдмрдм 01 рдХреА рдУрд░ рдХреБрдЫ рдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
Policyhub01 рдореЗрдВ / var / cfengine / Masterfiles рдкрд░ рд╣рдо рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ
config_web_srv.cf:

 bundle agent config_web_srv { vars: "package_list" slist => { "nginx" }; packages: "${package_list}" package_policy => "add", package_method => generic; processes: "nginx" restart_class => "start_nginx"; commands: "/etc/init.d/nginx restart" ifvarclass => canonify("start_nginx"); } 

рдФрд░ install_base_pkg.cf:
 bundle agent install_base_pkg { vars: "package_list" slist => { "vim", "mc" }; packages: "${package_list}" package_policy => "add", package_method => generic; files: linux:: "/etc/motd" edit_line => insert_lines("This host is managed by cfengine3!"); } 


рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рднреА рдХреЙрдкреА рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: root @ policyhub01: / var / cfengine / masterfiles # cp config_web_srv.cf install_base_pkg.cf ../inputs/ ред рдЕрдм рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдореЗрдЬрдмрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕рдХреЛ рдЗрди рдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝рд╛рдЗрд▓ /var/cfengine/masterfiles/promises.cf рдореЗрдВ рд╣рдо рдмреЙрдбреА рдХрдВрдЯреНрд░реЛрд▓ рдЗрдирдкреБрдЯреНрд╕ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЕрдкрдиреА рдлрд╛рдЗрд▓реНрд╕ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 inputs => { # Global common bundles "def.cf", # Control body for all agents "controls/cf_agent.cf", "controls/cf_execd.cf", "controls/cf_monitord.cf", "controls/cf_report.cf", "controls/cf_runagent.cf", "controls/cf_serverd.cf", # COPBL/Custom libraries "libraries/cfengine_stdlib.cf", # Design Center # MARKER FOR CF-SKETCH INPUT INSERTION "cf-sketch-runfile.cf", # User services from here "services/init_msg.cf", # our policies "config_web_srv.cf", "install_base_pkg.cf", }; 


рдЕрдЧрд▓рд╛, рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдорд╛рд░реА рдмрдВрдбрд▓ рдмрдирд╛рдПрдВ:

 bundle agent config { classes: "web_srv" or => { classmatch("web.*"), "srv01_local", "web3_example_com" }; methods: web_srv:: "config_web_srv" usebundle => "config_web_srv"; any:: "install_everywhere" usebundle => "install_base_pkg"; reports: cfengine_3:: "bundle agent config DONE"; } 


рдФрд░ рдЗрд╕реЗ bundlesequence рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
  bundlesequence => { # Common bundles first for best practice "def", # Design Center "cfsketch_run", # Agent buddles from here "main", # Our ccustomisation "config", }; 


рд╣рдо рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рд▓рдЧрднрдЧ 5 рдорд┐рдирдЯ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ install_base_pkg рдФрд░ config_web_srv рд╕реЗ рд╕рдВрдХреБрд▓ рд╕рдВрд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред рдЧреНрд░рд╛рд╣рдХ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рд╣рдорд╛рд░реА рд╣рдм рдиреАрддрд┐ рдХреЗ рдорд╛рд╕реНрдЯрд░рдлрд╛рдЗрд▓реНрд╕ рд╕реЗ рдЗрдирдкреБрдЯреНрд╕ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЗрдВред рдЕрдЧрд▓реЗ, cf-agen srv01 рдкрдХреНрд╖ рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдХрдард┐рди рдХрдХреНрд╖рд╛рдПрдВ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж:
 Hard classes = { 203_0_113_101 2_cpus 64_bit Afternoon Day6 GMT_Hr17 Hr17 Hr17_Q2 January Lcycle_0 Min20_25 Min21 PK_MD5_877dfa1640c3c49a2065ce220a3b821f Q2 Sunday Yr2013 agent any cfengine cfengine_3 cfengine_3_4 cfengine_3_4_1 cfengine_in_high community_edition compiled_on_linux_gnu cpu0_normal cpu1_normal cpu_normal debian debian_7 debian_7_0 diskfree_high_normal entropy_misc_in_low entropy_misc_out_low entropy_postgresql_in_low entropy_postgresql_out_low have_aptitude ipv4_203 ipv4_203_0 ipv4_203_0_113 ipv4_203_0_113_101 linux linux_3_6_10_vs2_3_4_6 linux_x86_64 linux_x86_64_3_6_10_vs2_3_4_6 linux_x86_64_3_6_10_vs2_3_4_6__1_SMP_Mon_Dec_17_03_23_11_UTC_2012 local mac_00_25_64_3b_97_cb messages_high_ldt messages_high_normal net_iface_br0 opt_dry_run otherprocs_low rootprocs_high rootprocs_high_ldt srv01 srv01_local syslog_high_ldt syslog_high_normal users_low verbose_mode www_in_low x86_64 } 

рдЗрд╕ рд╣реЛрд╕реНрдЯ рдкрд░ рд╣рд╛рд░реНрдб рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА cf-Agent -v рдЪрд▓рд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдКрдкрд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдмрдВрдбрд▓ 'рдХреЙрдиреНрдлрд┐рдЧ' рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдВрдбрд▓рд▓реЗрдХреНрд╡реЗрдВрд╕ рдХреЛ рдмрддрд╛рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрдкрд▓рдмреНрдз рд╣рд╛рд░реНрдб рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЙрдлреНрдЯ рдХрдХреНрд╖рд╛рдПрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ srv01 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЙрдлреНрдЯ рдХреНрд▓рд╛рд╕ web_srv рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбреЛрдореЗрди рдирд╛рдо рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдЪ рд╣реЛрдЧрд╛ред рддрджрдиреБрд╕рд╛рд░, рдЬрдм рд╡рд┐рдзрд┐ рдЕрдиреБрднрд╛рдЧ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдмрдВрдбрд▓ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред Install_base_pkg рдмрдВрдбрд▓ рд╕рднреА рд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд░реНрдб рдХреНрд▓рд╛рд╕ рдХреЛрдИ рднреА рд╣рдореЗрд╢рд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП, install_base_pkg рдФрд░ config_web_srv рджреЛрдиреЛрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдиреЗрдЧрдиреЗрдХреНрд╕ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдпрд╣ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдареАрдХ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреНрдпреБрдирдХреНрд╕ рд╡рд░реНрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реЙрдлреНрдЯ рдХреНрд▓рд╛рд╕ "start_nginx" рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдРрд╕реА рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рддрджрдиреБрд╕рд╛рд░, рдХрдорд╛рдВрдб / /etc/init.d/nxx рд░рд┐рд╕реНрдЯрд╛рд░реНрдЯ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдЧрд╛ред рдЖрдк рдЬрд╛рдирдмреВрдЭрдХрд░ рдпрд╛ рджреБрд░реНрдШрдЯрдирд╛рд╡рд╢ рдирдЧреНрдиреЗрдХреНрд╕ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рднреА cigerine рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛!

рдпрд╣ рд╕рдм, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдиреЛрдЯ рдиреЗ "рдПрдХрд▓" рдФрд░ "рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░" рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рд╣рдж рддрдХ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рд╣рдореЗрд╢рд╛ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрдПрдВрдЧреЗ!

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


All Articles