{"id":320257,"date":"2021-03-25T15:02:14","date_gmt":"2021-03-25T15:02:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=320257"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=320257","title":{"rendered":"DNS-as-Code \u043d\u0430 \u0431\u0430\u0437\u0435 dnscontrol"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0448\u0443 \u043e\u0442\u043d\u0435\u0441\u0442\u0438\u0441\u044c \u043a \u043d\u0435\u0439 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0425\u0430\u0431\u0440 \u044f \u0445\u043e\u0442\u0435\u043b \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0432\u043d\u043e, \u043d\u043e \u0432\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e. \u0412\u0441\u0435 \u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043b\u0438\u0431\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u043a\u0435\u043c-\u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b, \u043b\u0438\u0431\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b&#8230; \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u043e\u0434\u044b\u0441\u043a\u0430\u043b \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u043e \u0447\u0435\u043c \u0445\u043e\u0447\u0443 \u043f\u043e\u0432\u0435\u0434\u0430\u0442\u044c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u0433\u043d\u0430\u043b\u0438.<\/p>\n<p>\u041f\u043e \u0440\u043e\u0434\u0443 \u0441\u0432\u043e\u0435\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043b\u0435\u043d\u0438\u0432\u044b\u0439, \u044f \u043b\u044e\u0431\u043b\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0451 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043b\u044e\u0431\u043e\u0432\u044c \u043a\u043e \u0432\u0441\u044f\u043a\u0438\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c &#171;Everithyng-as-Code&#187;.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 \u0434\u043b\u044f Ansible, \u043a\u043e\u0434\u0430 \u0434\u043b\u044f Terraform \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0431\u044f <s>\u043d\u043e\u0432\u044b\u0435 \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f<\/s> , \u0447\u0442\u043e \u0436\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u044f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b \u043f\u0440\u043e \u043d\u0430\u0448\u0443 \u0432\u043d\u0435\u0448\u043d\u044e\u044e DNS-\u0437\u043e\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0441\u0442\u0438\u043c \u043d\u0430 nic.ru. \u041d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043c\u0435\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b\u0438 \u043e\u043a\u043e\u043b\u043e 3000 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043f\u0440\u0438\u0447\u0435\u043c \u043e\u043a\u043e\u043b\u043e 80% \u0438\u0437 \u043d\u0438\u0445 &#8212; \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u043c\u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>dev1           A      1.2.3.4 dev1-serviceA  CNAME  dev1 dev1-serviceB  CNMAE  dev1 ... dev2           A      1.2.3.4 dev2-serviceA  CNAME  dev2 dev2-serviceB  CNMAE  dev2 ...<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u0445 dev&lt;N&gt; \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 100-150 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412\u0441\u0451 \u044d\u0442\u043e \u043e\u0441\u043b\u043e\u0436\u043d\u044f\u043b\u043e\u0441\u044c \u0435\u0449\u0435 \u0442\u0435\u043c \u0444\u0430\u043a\u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\/\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\/\u0443\u0434\u0430\u043b\u044f\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0430\u0441\u0442\u044c DEV-\u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 IP, \u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 DEV-\u0441\u0442\u0435\u043d\u0434\u0443 \u043d\u0443\u0436\u0435\u043d \u0435\u0449\u0435 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 CNAME \u0438 \u0442.\u043f.<\/p>\n<p>\u0412\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0434\u043e\u0431\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u043b\u0438\u0431\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e (\u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c\/\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438), \u043b\u0438\u0431\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0441 \u043a\u0443\u0447\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0431\u0430\u0433\u043e\u0432 \u0438 <s>\u0442\u0430\u043d\u0446\u0430\u043c\u0438 \u0441 \u0431\u0443\u0431\u043d\u043e\u043c<\/s> \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043c\u0430\u043d\u0443\u0430\u043b\u0430\u043c\u0438.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043c\u044b\u0441\u043b\u044c &#171;\u0445\u043c, \u0430 \u0432\u0435\u0434\u044c \u044d\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c&#8230;&#187;, &#171;&#8230;\u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043e\u043a \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c Terraform, \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0435\u0441\u0442\u044c Ansible\/Puppet\/&#8230;, \u043c\u043e\u0436\u0435\u0442 \u0438 \u0434\u043b\u044f DNS \u0447\u0442\u043e-\u0442\u043e \u0435\u0441\u0442\u044c?&#187;.<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u044f \u0443\u0436\u0435 \u0432\u0431\u0438\u0432\u0430\u044e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0433\u0443\u0433\u043b\u0430 \u0444\u0440\u0430\u0437\u0443 &#171;DNS as Code&#187; \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0435 \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u0442\u044c \u043c\u043e\u0438 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0421\u043f\u0443\u0441\u0442\u044f 5-10 \u043c\u0438\u043d\u0443\u0442 \u044f \u043d\u0430\u0442\u044b\u043a\u0430\u044e\u0441\u044c \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b <a href=\"https:\/\/stackexchange.github.io\/dnscontrol\/\" rel=\"noopener noreferrer nofollow\"><strong>Dnscontrol<\/strong><\/a> \u0438 <a href=\"https:\/\/github.com\/octodns\/octodns\" rel=\"noopener noreferrer nofollow\"><strong>Octodns<\/strong><\/a>. \u0425\u043c, \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u044b\u0435 \u0448\u0442\u0443\u043a\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b&#8230;<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c.<\/p>\n<h2>octodns<\/h2>\n<blockquote>\n<p>OctoDNS&nbsp;\u2013 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u00ab\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u043a\u043e\u0434\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c DNS-\u0437\u043e\u043d\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0435\u0440\u0441\u0438\u0439, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435. OctoDNS \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d&nbsp;GitHub&nbsp;\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-deploy-and-manage-your-dns-using-octodns-on-debian-10-ru\" rel=\"noopener noreferrer nofollow\">DigitalOcean<\/a><\/p>\n<\/blockquote>\n<p>\u041e\u043a, \u043d\u0443 \u0441 \u044d\u0442\u0438\u043c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0427\u0442\u043e \u0442\u0430\u043c \u0441 \u043a\u043e\u0434\u043e\u043c? \u0420\u0443\u043a\u0438 \u0442\u043e \u0447\u0435\u0448\u0443\u0442\u0441\u044f \ud83d\ude42 \u041d\u0430 \u043a\u0430\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0438\u0441\u0430\u0442\u044c? \u0427\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c? \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435:<\/p>\n<blockquote>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 OctoDNS \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f DNS, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u0430\u0439\u043b\u044b \u0437\u043e\u043d \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/YAML\" rel=\"noopener noreferrer nofollow\">YAML<\/a>).<\/p>\n<\/blockquote>\n<p>\u0410\u0445, \u043d\u0443 \u0434\u0430 \u043c\u044b \u0436\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u0441\u0438\u0441\u0430\u0434\u043c\u0438\u043d\u044b, \u0430 <s>YAML-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u044b<\/s> \u0434\u0435\u0432\u043e\u043f\u0441\u044b. \u0410 \u0432 \u044d\u0442\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u0431\u0435\u0437 \u0437\u043d\u0430\u043d\u0438\u0439 \u0432\u0435\u043b\u0438\u043a\u043e\u0433\u043e \u0438 \u043c\u043e\u0433\u0443\u0447\u0435\u0433\u043e YAML.<\/p>\n<p>\u041e\u043a, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 <a href=\"https:\/\/github.com\/octodns\/octodns#supported-providers\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b<\/a> \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 (NIC.RU, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435\u0442\u0443)<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c DNS-\u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432 CI\/CD<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 DNS-\u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 YAML:<\/p>\n<details class=\"spoiler\">\n<summary>~\/octodns\/config\/config.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>--- providers:   config:     class: octodns.provider.yaml.YamlProvider     directory: .\/config     default_ttl: 300     enforce_order: True   digitalocean:     class: octodns.provider.digitalocean.DigitalOceanProvider     token: your-digitalocean-oauth-token  zones:   your-domain.:     sources:       - config     targets:       - digitalocean<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>~\/octodns\/config\/your-domain.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>--- '':   - type: A     value: 1.2.3.4  www:   type: A   value: 5.6.7.8<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0411\u0435\u0433\u043b\u044b\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u044f \u043e\u0446\u0435\u043d\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0412\u043e\u0442 \u0447\u0435\u0433\u043e \u043c\u043d\u0435 \u0432 \u043d\u0435\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e:<\/p>\n<ul>\n<li>\n<p>\u041d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043e\u043d\u0443 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Bind<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u0430 \u044d\u0442\u0438\u0445 \u043c\u0438\u043d\u0443\u0441\u0430 \u043e\u0431\u0435\u0441\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u043e\u0435\u043c \u043a\u0435\u0439\u0441\u0435. \u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435&#8230;<\/p>\n<h2>Dnscontrol<\/h2>\n<blockquote>\n<p>DNSControl&nbsp;\u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443&nbsp;\u00ab\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u043a\u043e\u0434\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u0430\u043c\u0438 DNS \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0435\u0440\u0441\u0438\u0439, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 DNSControl \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d Stack Exchange \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-deploy-and-manage-your-dns-using-octodns-on-debian-10-ru\" rel=\"noopener noreferrer nofollow\">DigitalOcean<\/a><\/p>\n<\/blockquote>\n<p>\u0413\u0434\u0435-\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u044d\u0442\u043e \u0447\u0438\u0442\u0430\u043b\u0438, \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438? \u041f\u043e\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 (\u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Stack Exchange). \u0425\u043c, \u043d\u0443 \u0434\u0430 \u043b\u0430\u0434\u043d\u043e, \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434:<\/p>\n<blockquote>\n<p>DNSControl uses javascript as its primary input language to provide power and flexibility to configure your domains. The ultimate purpose of the javascript is to construct a&nbsp;<a href=\"https:\/\/godoc.org\/github.com\/StackExchange\/dnscontrol\/models#DNSConfig\" rel=\"noopener noreferrer nofollow\">DNSConfig<\/a>&nbsp;object that will be passed to the go backend and operated on.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/stackexchange.github.io\/dnscontrol\/js\" rel=\"noopener noreferrer nofollow\">StackExchange<\/a><\/p>\n<\/blockquote>\n<p>\u0427\u0435\u0433\u043e? \u0412 &#171;\u0433\u043e\u0448\u0435\u0447\u043a\u0443&#187; \u0432\u0441\u0442\u0440\u043e\u0435\u043d JavaScript? \u0421\u0435\u0440\u044c\u0435\u0437\u043d\u043e? \u041b\u0430\u0434\u043d\u043e, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u043a\u0430\u043a \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Dnscontrol:<\/p>\n<details class=\"spoiler\">\n<summary>dnscontrol.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">\/\/ define dummy-registar and Bind-provider REG_NONE = NewRegistrar('none', 'NONE'); DNS_BIND = NewDnsProvider('bind', 'BIND', {     \/\/ default SOA-records for all domains     'default_soa': {         'master': 'ns3-l2.nic.ru.',         'mbox': 'dns.nic.ru.',         'refresh': 9999,         'retry': 9999,         'expire': 9999000,         'minttl': 999,     },     \/\/ default NS-records for all domains     'default_ns': [         'ns8-cloud.nic.ru.',         'ns3-l2.nic.ru.',         'ns4-l2.nic.ru.',         'ns8-l2.nic.ru.',         'ns4-cloud.nic.ru.'     ] });<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u0430\u0448\u0435\u0439 \u0437\u043e\u043d\u044b:<\/p>\n<details class=\"spoiler\">\n<summary>my-zone.ru.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">function myzone_ru(REG, PROVIDER){     return D('pcbltools.ru', REG, DnsProvider(PROVIDER),         DefaultTTL('5m')         ,A('@', '1.2.3.4')         ,MX('@', 10, 'mx.yandex.net.', TTL('6h'))         ,MX('@', 20, 'mx.yandex.ru.', TTL('6h'))         ,A('www', '1.2.3.4')         ,CNAME('portal', 'www')         ,AAAA('configurator', '2a00:56:2:2:1:1:0:64f')     ) }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0443\u0436\u0430\u0441\u043d\u043e, \u0434\u0430\u0436\u0435 YAML \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0435\u0435. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0437\u0430\u0447\u0435\u043c \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u043e\u043a JavaScript, \u0447\u0442\u043e\u0431 \u043f\u043e\u0442\u043e\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043e\u0434. \u0418\u0434\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c:<\/p>\n<blockquote>\n<p>Advanced Topics:<\/p>\n<p><a href=\"https:\/\/stackexchange.github.io\/dnscontrol\/code-tricks\" rel=\"noopener noreferrer nofollow\"><u>Code Tricks<\/u><\/a>: Safely use macros and loops.<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0446\u0438\u043a\u043b\u044b. \u041d\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435:<\/p>\n<blockquote>\n<p>The dnsconfig.js language is JavaScript. On the plus side, this means you can use loops and variables and anything else you want&#8230;<\/p>\n<p>Sure, you can do a lot of neat tricks with&nbsp;<code>if\/then<\/code>s and macros and loops. Yes, YOU understand the code. However, think about your coworkers who will be the&nbsp;<em>next<\/em>&nbsp;person to edit the file. Are you setting them up for failure?<\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 (\u043f\u043e\u0447\u0442\u0438) \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u0430 JavaScript. \u041d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0442 \u043d\u0430\u0441, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0444\u0430\u043d\u0430\u0442\u0438\u0437\u043c\u0430. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u0430 \u0432\u0441\u0435 \u043b\u0438\u0448\u044c \u0441\u0438\u0441\u0430\u0434\u043c\u0438\u043d\u044b (\u043d\u0443 \u0438\u043b\u0438 \u043c\u043e\u0434\u043d\u044b\u0435 \u0434\u0435\u0432\u043e\u043f\u0441\u044b). \u0417\u0430\u0434\u0443\u043c\u0430\u0439\u0442\u0435\u0441\u044c \u043e \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041d\u043e \u043c\u044b \u043d\u0435 \u0431\u043e\u0438\u043c\u0441\u044f \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>my-zone.ru.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">function generate_DEV_records (REG, PROVIDER){     DEV_CNAME_RECORDS = [         'serviceA'         ,'serviceB'     ] \t  dev_stand_count = 5     dev_public_ip = '1.2.3.4'     RECORDS = []     for (var i = 1; i &lt;= dev_stand_count; i++){         RECORDS.push(             A('dev' + i, dev_public_ip)         )         for (var j = 0; j &lt; DEV_CNAME_RECORDS.length; j++){             RECORDS.push(                 CNAME('dev' + i + '-' + DEV_CNAME_RECORDS[j], 'dev' + i)             )         }     }  \t  return D('myzone.ru', REG, DnsProvider(PROVIDER),         RECORDS) } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 Bind, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0437\u043e\u043d \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Bind. \u0421 \u044d\u0442\u0438\u043c\u0438 \u0437\u043e\u043d\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043c \u044f \u043c\u043e\u0433\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>dnscontrol push<\/strong>:<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u044b\u0432\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>\u276f dnscontrol push ******************** Domain: myzone.ru ----- Getting nameservers from: bind ----- DNS Provider: bind...File does not yet exist: \"zones\/myzone.ru\" 1 correction #1: GENERATE_ZONEFILE: 'myzone.ru' (new file with 21 records)  WRITING ZONEFILE: zones\/myzone.ru SUCCESS! ----- Registrar: none...0 corrections Done. 1 corrections.<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 zones \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b \u0437\u043e\u043d\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Bind:<\/p>\n<details class=\"spoiler\">\n<summary>myzone.ru<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>$TTL 300 ; generated with dnscontrol 2021-03-24T23:15:09+03:00 @                IN SOA   ns3-l2.nic.ru. dns.nic.ru. 2021032400 1440 3600 2592000 600                  IN NS    ns3-l2.nic.ru.                  IN NS    ns4-cloud.nic.ru.                  IN NS    ns4-l2.nic.ru.                  IN NS    ns8-cloud.nic.ru.                  IN NS    ns8-l2.nic.ru. dev1             IN A     1.2.3.4 dev1-servicea    IN CNAME dev1.myzone.ru. dev1-serviceb    IN CNAME dev1.myzone.ru. dev2             IN A     1.2.3.4 dev2-servicea    IN CNAME dev2.myzone.ru. dev2-serviceb    IN CNAME dev2.myzone.ru. dev3             IN A     1.2.3.4 dev3-servicea    IN CNAME dev3.myzone.ru. dev3-serviceb    IN CNAME dev3.myzone.ru. dev4             IN A     1.2.3.4 dev4-servicea    IN CNAME dev4.myzone.ru. dev4-serviceb    IN CNAME dev4.myzone.ru. dev5             IN A     1.2.3.4 dev5-servicea    IN CNAME dev5.myzone.ru. dev5-serviceb    IN CNAME dev5.myzone.ru. <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0430\u0448\u0438\u0445 \u0437\u043e\u043d, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>dnscontrol preview<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>dnscontrol push<\/strong><\/p>\n<p>\u041d\u0435\u043f\u043b\u043e\u0445\u043e, \u0434\u0430?<\/p>\n<p>\u0417\u0430\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u0434. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u044f \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0440\u0430\u0437\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c JS-\u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u0430\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7b8\/0f4\/fa5\/7b80f4fa509537d55e557421b4ac150e.png\" width=\"522\" height=\"666\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 DNS as Code.<\/p>\n<h2>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 CI<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0432\u0440\u043e\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c CI. \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b Infrastructure as Code \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442 \u043d\u0430\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u041f\u041e. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0434 \u0440\u0435\u0432\u044c\u044e<\/p>\n<\/li>\n<li>\n<p>CI\/CD<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043c\u043d\u043e\u0433\u043e, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<p>\u0412 \u043c\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Gitlab. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c\u0443 Container Registry \u0438 CI \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0435\u0434\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043d\u0430\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043f\u0440\u044f\u043c\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0448\u0430\u0433\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435. \u042f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<ul>\n<li>\n<p><strong>validate<\/strong> &#8212; \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p><strong>prepare<\/strong> &#8212; \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u043e\u043d \u0441 \u0441\u0430\u0439\u0442\u0430 NIC.RU<\/p>\n<\/li>\n<li>\n<p><strong>plan<\/strong> &#8212; \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><strong>build<\/strong> &#8212; \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0437\u043e\u043d<\/p>\n<\/li>\n<li>\n<p><strong>test<\/strong> &#8212; \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043d \u043d\u0430 DNS-\u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/p>\n<\/li>\n<li>\n<p><strong>deploy<\/strong> &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0437\u043e\u043d \u0432 NIC.RU \u0438 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 docker-\u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u0448\u0430\u0433\u043e\u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.<\/p>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e 2 \u043e\u0431\u0440\u0430\u0437\u0430:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/hub.docker.com\/r\/stackexchange\/dnscontrol\" rel=\"noopener noreferrer nofollow\">stackexchange\/dnscontrol<\/a> &#8212; \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0448\u0430\u0433\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 test<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/hub.docker.com\/_\/bind9\/plans\/3af94cc6-b9c6-43c2-8658-e617ef977949?tab=instructions\" rel=\"noopener noreferrer nofollow\">internetsystemsconsortium\/bind9<\/a> &#8212; \u0434\u043b\u044f \u0448\u0430\u0433\u0430 test<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u0438 \u043e\u0431\u0440\u0430\u0437\u044b \u044f \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u044e, \u0442.\u043a. \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432 \u043d\u0438\u0445 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0437\u0430 \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0435\u0449\u0435 \u043f\u0430\u0440\u044b \u0434\u043d\u0435\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 Gitlab CI \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d:<\/p>\n<details class=\"spoiler\">\n<summary>.gitlab-ci.yml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>image: $CI_REGISTRY_IMAGE\/dnscontrol  variables:   CA_CERT_FILE: \/etc\/gitlab-runner\/certs\/ca.crt   ZONES_OUT_DIR: $CI_PROJECT_DIR\/zones   NIC_API_URL: https:\/\/api.nic.ru   NIC_SERVICE: MYSERVICE  cache:   key: dns-nic-ru   paths:     - .nic_token  stages:   - validate   - prepare   - plan   - build   - test   - deploy  check:   stage: validate   script:     - dnscontrol -v check  prepare:   stage: prepare   script:     - mkdir -p $ZONES_OUT_DIR     - dnscontrol push     - ls -la $ZONES_OUT_DIR     # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043a\u0435\u043d NIC.RU (\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c)     - . ci\/scripts\/nic_auth.sh     # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0437\u043e\u043d \u0438\u0437 NIC.RU     - ci\/scripts\/nic_download.sh     - ls -la $ZONES_OUT_DIR   artifacts:     public: false     paths: [ zones\/ ]     expire_in: 5 mins  plan:   stage: plan   script:     # \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043b\u0430\u043d \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b     - dnscontrol preview | tee plan.txt   artifacts:     # \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0432 Merge Request, \u0447\u0442\u043e\u0431 \u0440\u0435\u0432\u044c\u044e\u0432\u0435\u0440\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c     expose_as: plan     paths: [ plan.txt ]     public: false     expire_in: 3 mos  build:   stage: build   script:     - dnscontrol -v push   artifacts:     name: zones     expose_as: zones     paths: [ zones\/ ]  test:   stage: test   image: $CI_REGISTRY_IMAGE\/bind9   variables:     BIND_MAIN_CONFIG: \/etc\/bind\/named.conf     BIND_ZONES_DIR: \/var\/lib\/bind\/     BIND_TESTS_DIR: $CI_PROJECT_DIR\/tests   script:     - cat ci\/bind9\/named.conf &gt; $BIND_MAIN_CONFIG     - cp $ZONES_OUT_DIR\/* $BIND_ZONES_DIR\/     # \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0444\u0438\u0433 bind \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0437\u043e\u043d     - ci\/scripts\/zones.conf.sh &gt;&gt; $BIND_MAIN_CONFIG     - cat $BIND_MAIN_CONFIG     # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430     - \/usr\/sbin\/named-checkconf \/etc\/bind\/named.conf     # \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c bind \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c     - \/usr\/sbin\/named -g -c \/etc\/bind\/named.conf -u bind &amp;     # \u0436\u0434\u0435\u043c \u043f\u043e\u043a\u0430 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f bind     - while ! (ss -4tulnp | grep 53 &gt; \/dev\/null); do echo \"Waiting for a socket to go up\"; sleep 1; done     - ps aux     # \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b (\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0434\u043e)     - ci\/scripts\/bind_test.sh  deploy:   stage: deploy   script:     # \u0441\u043d\u043e\u0432\u0430 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043a\u0435\u043d     - . ci\/scripts\/nic_auth.sh     # \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u043e\u043d\u044b \u0432 NIC.RU     - ci\/scripts\/nic_upload.sh   dependencies:     - build   rules:     - if: '$CI_COMMIT_BRANCH == \"master\"'       when: manual <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u0448\u0430\u0433\u0438 <strong>plan<\/strong> \u0438 <strong>test<\/strong>.<\/p>\n<p>\u041d\u0430 \u0448\u0430\u0433\u0435 plan \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b. \u042d\u0442\u043e\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u043c\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u043e\u043f\u0446\u0438\u0435\u0439 <strong>expose_as<\/strong>. \u041e\u043f\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 Merge Request, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0438 \u0434\u0436\u043e\u0431\u0443 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0443\u0434\u0430 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0430. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0440\u0435\u0432\u044c\u044e\u0432\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0440\u043e\u043c\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u0437\u043e\u043d\u0435. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/76c\/e37\/aaa\/76ce37aaabf0f02ff3489df80ddef29f.png\" width=\"1948\" height=\"386\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 plan, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0434\u043f\u0438\u0441\u044c\u044e Job, \u0442\u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u0432\u044b\u0432\u043e\u0434 \u0434\u0436\u043e\u0431\u044b \u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043b\u0430\u043d:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/17c\/8cb\/870\/17c8cb870bc88d3f8db66032c155ac72.png\" width=\"758\" height=\"372\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u0448\u0430\u0433\u0435 test \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u043e\u043d \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c bind-\u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0422.\u0435. \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 DNS-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Bind, \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438 \u0441\u043a\u0430\u0440\u043c\u0438\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0448\u0438 \u0437\u043e\u043d\u044b. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u044f\u0442\u0441\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0448\u0430\u0433\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 shell-\u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0443\u0436\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430. \u0422\u0443\u0442 \u0443\u0436 \u0432\u0441\u0451 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h2>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 DNS as Code \u043d\u0430 \u0431\u0430\u0437\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 dnscontrol<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Gitlab<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f DNS-\u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u0430\u0432\u0434\u044b \u0434\u043b\u044f DNS \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0441 \u043a\u043e\u0434\u043e\u043c<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u0435\u0447\u0443 \u043d\u0430 \u043b\u044e\u0431\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0443.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/548968\/\"> https:\/\/habr.com\/ru\/post\/548968\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0448\u0443 \u043e\u0442\u043d\u0435\u0441\u0442\u0438\u0441\u044c \u043a \u043d\u0435\u0439 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0425\u0430\u0431\u0440 \u044f \u0445\u043e\u0442\u0435\u043b \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0432\u043d\u043e, \u043d\u043e \u0432\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e. \u0412\u0441\u0435 \u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043b\u0438\u0431\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u043a\u0435\u043c-\u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b, \u043b\u0438\u0431\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b&#8230; \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u043e\u0434\u044b\u0441\u043a\u0430\u043b \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u043e \u0447\u0435\u043c \u0445\u043e\u0447\u0443 \u043f\u043e\u0432\u0435\u0434\u0430\u0442\u044c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u0433\u043d\u0430\u043b\u0438.<\/p>\n<p>\u041f\u043e \u0440\u043e\u0434\u0443 \u0441\u0432\u043e\u0435\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043b\u0435\u043d\u0438\u0432\u044b\u0439, \u044f \u043b\u044e\u0431\u043b\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0451 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043b\u044e\u0431\u043e\u0432\u044c \u043a\u043e \u0432\u0441\u044f\u043a\u0438\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c &#171;Everithyng-as-Code&#187;.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 \u0434\u043b\u044f Ansible, \u043a\u043e\u0434\u0430 \u0434\u043b\u044f Terraform \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0431\u044f <s>\u043d\u043e\u0432\u044b\u0435 \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f<\/s> , \u0447\u0442\u043e \u0436\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u044f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b \u043f\u0440\u043e \u043d\u0430\u0448\u0443 \u0432\u043d\u0435\u0448\u043d\u044e\u044e DNS-\u0437\u043e\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0441\u0442\u0438\u043c \u043d\u0430 nic.ru. \u041d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043c\u0435\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b\u0438 \u043e\u043a\u043e\u043b\u043e 3000 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043f\u0440\u0438\u0447\u0435\u043c \u043e\u043a\u043e\u043b\u043e 80% \u0438\u0437 \u043d\u0438\u0445 &#8212; \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u043c\u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>dev1           A      1.2.3.4 dev1-serviceA  CNAME  dev1 dev1-serviceB  CNMAE  dev1 ... dev2           A      1.2.3.4 dev2-serviceA  CNAME  dev2 dev2-serviceB  CNMAE  dev2 ...<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u0445 dev&lt;N&gt; \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 100-150 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412\u0441\u0451 \u044d\u0442\u043e \u043e\u0441\u043b\u043e\u0436\u043d\u044f\u043b\u043e\u0441\u044c \u0435\u0449\u0435 \u0442\u0435\u043c \u0444\u0430\u043a\u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\/\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\/\u0443\u0434\u0430\u043b\u044f\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0430\u0441\u0442\u044c DEV-\u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 IP, \u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 DEV-\u0441\u0442\u0435\u043d\u0434\u0443 \u043d\u0443\u0436\u0435\u043d \u0435\u0449\u0435 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 CNAME \u0438 \u0442.\u043f.<\/p>\n<p>\u0412\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0434\u043e\u0431\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u043b\u0438\u0431\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e (\u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c\/\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438), \u043b\u0438\u0431\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0441 \u043a\u0443\u0447\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0431\u0430\u0433\u043e\u0432 \u0438 <s>\u0442\u0430\u043d\u0446\u0430\u043c\u0438 \u0441 \u0431\u0443\u0431\u043d\u043e\u043c<\/s> \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043c\u0430\u043d\u0443\u0430\u043b\u0430\u043c\u0438.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043c\u044b\u0441\u043b\u044c &#171;\u0445\u043c, \u0430 \u0432\u0435\u0434\u044c \u044d\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c&#8230;&#187;, &#171;&#8230;\u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043e\u043a \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c Terraform, \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0435\u0441\u0442\u044c Ansible\/Puppet\/&#8230;, \u043c\u043e\u0436\u0435\u0442 \u0438 \u0434\u043b\u044f DNS \u0447\u0442\u043e-\u0442\u043e \u0435\u0441\u0442\u044c?&#187;.<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u044f \u0443\u0436\u0435 \u0432\u0431\u0438\u0432\u0430\u044e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0433\u0443\u0433\u043b\u0430 \u0444\u0440\u0430\u0437\u0443 &#171;DNS as Code&#187; \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0435 \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u0442\u044c \u043c\u043e\u0438 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0421\u043f\u0443\u0441\u0442\u044f 5-10 \u043c\u0438\u043d\u0443\u0442 \u044f \u043d\u0430\u0442\u044b\u043a\u0430\u044e\u0441\u044c \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b <a href=\"https:\/\/stackexchange.github.io\/dnscontrol\/\" rel=\"noopener noreferrer nofollow\"><strong>Dnscontrol<\/strong><\/a> \u0438 <a href=\"https:\/\/github.com\/octodns\/octodns\" rel=\"noopener noreferrer nofollow\"><strong>Octodns<\/strong><\/a>. \u0425\u043c, \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u044b\u0435 \u0448\u0442\u0443\u043a\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b&#8230;<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c.<\/p>\n<h2>octodns<\/h2>\n<blockquote>\n<p>OctoDNS&nbsp;\u2013 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u00ab\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u043a\u043e\u0434\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c DNS-\u0437\u043e\u043d\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0435\u0440\u0441\u0438\u0439, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435. OctoDNS \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d&nbsp;GitHub&nbsp;\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Python.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-deploy-and-manage-your-dns-using-octodns-on-debian-10-ru\" rel=\"noopener noreferrer nofollow\">DigitalOcean<\/a><\/p>\n<\/blockquote>\n<p>\u041e\u043a, \u043d\u0443 \u0441 \u044d\u0442\u0438\u043c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0427\u0442\u043e \u0442\u0430\u043c \u0441 \u043a\u043e\u0434\u043e\u043c? \u0420\u0443\u043a\u0438 \u0442\u043e \u0447\u0435\u0448\u0443\u0442\u0441\u044f \ud83d\ude42 \u041d\u0430 \u043a\u0430\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0438\u0441\u0430\u0442\u044c? \u0427\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c? \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435:<\/p>\n<blockquote>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 OctoDNS \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f DNS, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u0430\u0439\u043b\u044b \u0437\u043e\u043d \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/YAML\" rel=\"noopener noreferrer nofollow\">YAML<\/a>).<\/p>\n<\/blockquote>\n<p>\u0410\u0445, \u043d\u0443 \u0434\u0430 \u043c\u044b \u0436\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u0441\u0438\u0441\u0430\u0434\u043c\u0438\u043d\u044b, \u0430 <s>YAML-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u044b<\/s> \u0434\u0435\u0432\u043e\u043f\u0441\u044b. \u0410 \u0432 \u044d\u0442\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u0431\u0435\u0437 \u0437\u043d\u0430\u043d\u0438\u0439 \u0432\u0435\u043b\u0438\u043a\u043e\u0433\u043e \u0438 \u043c\u043e\u0433\u0443\u0447\u0435\u0433\u043e YAML.<\/p>\n<p>\u041e\u043a, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 <a href=\"https:\/\/github.com\/octodns\/octodns#supported-providers\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b<\/a> \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 (NIC.RU, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435\u0442\u0443)<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c DNS-\u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432 CI\/CD<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 DNS-\u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 YAML:<\/p>\n<details class=\"spoiler\">\n<summary>~\/octodns\/config\/config.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>--- providers:   config:     class: octodns.provider.yaml.YamlProvider     directory: .\/config     default_ttl: 300     enforce_order: True   digitalocean:     class: octodns.provider.digitalocean.DigitalOceanProvider     token: your-digitalocean-oauth-token  zones:   your-domain.:     sources:       - config     targets:       - digitalocean<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>~\/octodns\/config\/your-domain.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>--- '':   - type: A     value: 1.2.3.4  www:   type: A   value: 5.6.7.8<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0411\u0435\u0433\u043b\u044b\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u044f \u043e\u0446\u0435\u043d\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0412\u043e\u0442 \u0447\u0435\u0433\u043e \u043c\u043d\u0435 \u0432 \u043d\u0435\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e:<\/p>\n<ul>\n<li>\n<p>\u041d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043e\u043d\u0443 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Bind<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u0430 \u044d\u0442\u0438\u0445 \u043c\u0438\u043d\u0443\u0441\u0430 \u043e\u0431\u0435\u0441\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u043e\u0435\u043c \u043a\u0435\u0439\u0441\u0435. \u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435&#8230;<\/p>\n<h2>Dnscontrol<\/h2>\n<blockquote>\n<p>DNSControl&nbsp;\u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443&nbsp;\u00ab\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u043a\u043e\u0434\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u0430\u043c\u0438 DNS \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0435\u0440\u0441\u0438\u0439, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 DNSControl \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d Stack Exchange \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-deploy-and-manage-your-dns-using-octodns-on-debian-10-ru\" rel=\"noopener noreferrer nofollow\">DigitalOcean<\/a><\/p>\n<\/blockquote>\n<p>\u0413\u0434\u0435-\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u044d\u0442\u043e \u0447\u0438\u0442\u0430\u043b\u0438, \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438? \u041f\u043e\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 (\u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Stack Exchange). \u0425\u043c, \u043d\u0443 \u0434\u0430 \u043b\u0430\u0434\u043d\u043e, \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434:<\/p>\n<blockquote>\n<p>DNSControl uses javascript as its primary input language to provide power and flexibility to configure your domains. The ultimate purpose of the javascript is to construct a&nbsp;<a href=\"https:\/\/godoc.org\/github.com\/StackExchange\/dnscontrol\/models#DNSConfig\" rel=\"noopener noreferrer nofollow\">DNSConfig<\/a>&nbsp;object that will be passed to the go backend and operated on.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/stackexchange.github.io\/dnscontrol\/js\" rel=\"noopener noreferrer nofollow\">StackExchange<\/a><\/p>\n<\/blockquote>\n<p>\u0427\u0435\u0433\u043e? \u0412 &#171;\u0433\u043e\u0448\u0435\u0447\u043a\u0443&#187; \u0432\u0441\u0442\u0440\u043e\u0435\u043d JavaScript? \u0421\u0435\u0440\u044c\u0435\u0437\u043d\u043e? \u041b\u0430\u0434\u043d\u043e, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u043a\u0430\u043a \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Dnscontrol:<\/p>\n<details class=\"spoiler\">\n<summary>dnscontrol.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">\/\/ define dummy-registar and Bind-provider REG_NONE = NewRegistrar('none', 'NONE'); DNS_BIND = NewDnsProvider('bind', 'BIND', {     \/\/ default SOA-records for all domains     'default_soa': {         'master': 'ns3-l2.nic.ru.',         'mbox': 'dns.nic.ru.',         'refresh': 9999,         'retry': 9999,         'expire': 9999000,         'minttl': 999,     },     \/\/ default NS-records for all domains     'default_ns': [         'ns8-cloud.nic.ru.',         'ns3-l2.nic.ru.',         'ns4-l2.nic.ru.',         'ns8-l2.nic.ru.',         'ns4-cloud.nic.ru.'     ] });<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u0430\u0448\u0435\u0439 \u0437\u043e\u043d\u044b:<\/p>\n<details class=\"spoiler\">\n<summary>my-zone.ru.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">function myzone_ru(REG, PROVIDER){     return D('pcbltools.ru', REG, DnsProvider(PROVIDER),         DefaultTTL('5m')         ,A('@', '1.2.3.4')         ,MX('@', 10, 'mx.yandex.net.', TTL('6h'))         ,MX('@', 20, 'mx.yandex.ru.', TTL('6h'))         ,A('www', '1.2.3.4')         ,CNAME('portal', 'www')         ,AAAA('configurator', '2a00:56:2:2:1:1:0:64f')     ) }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0443\u0436\u0430\u0441\u043d\u043e, \u0434\u0430\u0436\u0435 YAML \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0435\u0435. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0437\u0430\u0447\u0435\u043c \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u043e\u043a JavaScript, \u0447\u0442\u043e\u0431 \u043f\u043e\u0442\u043e\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043e\u0434. \u0418\u0434\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c:<\/p>\n<blockquote>\n<p>Advanced Topics:<\/p>\n<p><a href=\"https:\/\/stackexchange.github.io\/dnscontrol\/code-tricks\" rel=\"noopener noreferrer nofollow\"><u>Code Tricks<\/u><\/a>: Safely use macros and loops.<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0446\u0438\u043a\u043b\u044b. \u041d\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435:<\/p>\n<blockquote>\n<p>The dnsconfig.js language is JavaScript. On the plus side, this means you can use loops and variables and anything else you want&#8230;<\/p>\n<p>Sure, you can do a lot of neat tricks with&nbsp;<code>if\/then<\/code>s and macros and loops. Yes, YOU understand the code. However, think about your coworkers who will be the&nbsp;<em>next<\/em>&nbsp;person to edit the file. Are you setting them up for failure?<\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 (\u043f\u043e\u0447\u0442\u0438) \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u0430 JavaScript. \u041d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0442 \u043d\u0430\u0441, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0444\u0430\u043d\u0430\u0442\u0438\u0437\u043c\u0430. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u0430 \u0432\u0441\u0435 \u043b\u0438\u0448\u044c \u0441\u0438\u0441\u0430\u0434\u043c\u0438\u043d\u044b (\u043d\u0443 \u0438\u043b\u0438 \u043c\u043e\u0434\u043d\u044b\u0435 \u0434\u0435\u0432\u043e\u043f\u0441\u044b). \u0417\u0430\u0434\u0443\u043c\u0430\u0439\u0442\u0435\u0441\u044c \u043e \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041d\u043e \u043c\u044b \u043d\u0435 \u0431\u043e\u0438\u043c\u0441\u044f \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>my-zone.ru.js<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">function generate_DEV_records (REG, PROVIDER){     DEV_CNAME_RECORDS = [         'serviceA'         ,'serviceB'     ] \t  dev_stand_count = 5     dev_public_ip = '1.2.3.4'     RECORDS = []     for (var i = 1; i &lt;= dev_stand_count; i++){         RECORDS.push(             A('dev' + i, dev_public_ip)         )         for (var j = 0; j &lt; DEV_CNAME_RECORDS.length; j++){             RECORDS.push(                 CNAME('dev' + i + '-' + DEV_CNAME_RECORDS[j], 'dev' + i)             )         }     }  \t  return D('myzone.ru', REG, DnsProvider(PROVIDER),         RECORDS) } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 Bind, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0437\u043e\u043d \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Bind. \u0421 \u044d\u0442\u0438\u043c\u0438 \u0437\u043e\u043d\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043c \u044f \u043c\u043e\u0433\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>dnscontrol push<\/strong>:<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u044b\u0432\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>\u276f dnscontrol push ******************** Domain: myzone.ru ----- Getting nameservers from: bind ----- DNS Provider: bind...File does not yet exist: \"zones\/myzone.ru\" 1 correction #1: GENERATE_ZONEFILE: 'myzone.ru' (new file with 21 records)  WRITING ZONEFILE: zones\/myzone.ru SUCCESS! ----- Registrar: none...0 corrections Done. 1 corrections.<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 zones \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b \u0437\u043e\u043d\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Bind:<\/p>\n<details class=\"spoiler\">\n<summary>myzone.ru<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>$TTL 300 ; generated with dnscontrol 2021-03-24T23:15:09+03:00 @                IN SOA   ns3-l2.nic.ru. dns.nic.ru. 2021032400 1440 3600 2592000 600                  IN NS    ns3-l2.nic.ru.                  IN NS    ns4-cloud.nic.ru.                  IN NS    ns4-l2.nic.ru.                  IN NS    ns8-cloud.nic.ru.                  IN NS    ns8-l2.nic.ru. dev1             IN A     1.2.3.4 dev1-servicea    IN CNAME dev1.myzone.ru. dev1-serviceb    IN CNAME dev1.myzone.ru. dev2             IN A     1.2.3.4 dev2-servicea    IN CNAME dev2.myzone.ru. dev2-serviceb    IN CNAME dev2.myzone.ru. dev3             IN A     1.2.3.4 dev3-servicea    IN CNAME dev3.myzone.ru. dev3-serviceb    IN CNAME dev3.myzone.ru. dev4             IN A     1.2.3.4 dev4-servicea    IN CNAME dev4.myzone.ru. dev4-serviceb    IN CNAME dev4.myzone.ru. dev5             IN A     1.2.3.4 dev5-servicea    IN CNAME dev5.myzone.ru. dev5-serviceb    IN CNAME dev5.myzone.ru. <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0430\u0448\u0438\u0445 \u0437\u043e\u043d, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>dnscontrol preview<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>dnscontrol push<\/strong><\/p>\n<p>\u041d\u0435\u043f\u043b\u043e\u0445\u043e, \u0434\u0430?<\/p>\n<p>\u0417\u0430\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u0434. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u044f \u0443\u0436\u0435<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-320257","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=320257"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320257\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}