{"id":394992,"date":"2024-06-29T11:56:59","date_gmt":"2024-06-29T11:56:59","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=394992"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=394992","title":{"rendered":"<span>\u042f\u0437\u044b\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 Dhall \u043a\u0430\u043a \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f Kubernetes<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/github.com\/dhall-lang\/dhall-lang\"><u>Dhall<\/u><\/a> \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e Open Source-\u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0441\u044f \u0432 2018 \u0433\u043e\u0434\u0443.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u0432\u0441\u044f\u043a\u0438\u0439 \u043d\u043e\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, Dhall \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 YAML, JSON, TOML, XML \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c. \u042f\u0437\u044b\u043a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u0448\u0438\u0440\u0435. \u0412 2020-\u043c \u0433\u043e\u0434\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0438 <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes\"><u>\u0435\u0433\u043e bindings<\/u><\/a>, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f Kubernetes.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/adf\/f57\/949\/adff5794925efb8e9e5fbaab81efb100.png\" width=\"780\" height=\"450\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/adf\/f57\/949\/adff5794925efb8e9e5fbaab81efb100.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043e Dhall \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e K8s-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u043d\u0430\u0447\u043d\u0435\u043c \u0432\u0441\u0435 \u0436\u0435 \u0441 \u043a\u0440\u0430\u0442\u043a\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0427\u0435\u043c Dhall \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432<\/h2>\n<p>\u0410\u0432\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c Dhall \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 JSON: \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0442\u0438\u043f\u0430\u043c\u0438, \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438. \u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435?\u00a0<\/p>\n<details class=\"spoiler\">\n<summary>Just because<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d9c\/f1f\/7cf\/d9cf1f7cfd4c105c437c9bcbd4f0c4b4.png\" alt=\"xkcd \u043f\u0440\u043e Standards\" title=\"xkcd \u043f\u0440\u043e Standards\" width=\"1128\" height=\"602\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d9c\/f1f\/7cf\/d9cf1f7cfd4c105c437c9bcbd4f0c4b4.png\"\/><figcaption>xkcd \u043f\u0440\u043e Standards<\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439: \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 JSON \u0438 YAML \u2014 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438. \u042d\u0442\u043e \u0441\u0443\u0436\u0430\u0435\u0442 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u200b\u200b\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 DRY<\/h3>\n<p>\u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u043e\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u2014 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0443 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\"><u>DRY<\/u><\/a> (\u00abDon\u2019t repeat yourself\u00bb). \u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0441 \u200b\u200bJSON \u0438 YAML, \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0441\u0435\u0431\u044f \u0442\u0440\u0443\u0434\u043d\u043e. \u0418\u0437-\u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0418\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c.<\/p>\n<p>Dhall \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u044f\u0437\u044b\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 DRY. \u0422\u0430\u043c, \u0433\u0434\u0435 \u0432 \u200b\u200bJSON- \u0438\u043b\u0438 YAML-\u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430, \u0432 Dhall \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Dhall \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/docs.dhall-lang.org\/discussions\/Programmable-configuration-files.html#programmable-configuration-file\"><u>\u043f\u0440\u0438\u043c\u0435\u0440<\/u><\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430, \u0432 JSON- \u0438 Dhall-\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443: \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e SSH-\u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 JSON-\u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"json\">[     {         \"privateKey\": \"\/home\/john\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/john\/.ssh\/id_rsa.pub\",         \"user\": \"john\"     },     {         \"privateKey\": \"\/home\/jane\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/jane\/.ssh\/id_rsa.pub\",         \"user\": \"jane\"     },     {         \"privateKey\": \"\/etc\/jenkins\/jenkins_rsa\",         \"publicKey\": \"\/etc\/jenkins\/jenkins_rsa.pub\",         \"user\": \"jenkins\"     },     {         \"privateKey\": \"\/home\/chad\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/chad\/.ssh\/id_rsa.pub\",         \"user\": \"chad\"     } ]<\/code><\/pre>\n<p>\u0422\u0430 \u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 Dhall-\u0444\u043e\u0440\u043c\u0430\u0442\u0435:<\/p>\n<pre><code class=\"json\">-- config0.dhall  let ordinaryUser =       \\(user : Text) ->         let privateKey = \"\/home\/${user}\/.ssh\/id_rsa\"          let publicKey = \"${privateKey}.pub\"          in  { privateKey, publicKey, user }  in  [ ordinaryUser \"john\"     , ordinaryUser \"jane\"     , { privateKey = \"\/etc\/jenkins\/jenkins_rsa\"       , publicKey = \"\/etc\/jenkins\/jenkins_rsa.pub\"       , user = \"jenkins\"       }     , ordinaryUser \"chad\"     ]<\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u0442\u0440\u043e\u043a \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.\u00a0<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2014 <code>alice<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 JSON-\u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 5 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"json\">[     \u2026     {         \"privateKey\": \"\/home\/alice\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/alice\/.ssh\/id_rsa.pub\",         \"user\": \"alice\"     } ]<\/code><\/pre>\n<p><em>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430 \u0434\u043b\u044f chad, \u043d\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043c\u044f \u043d\u0430 alice.<\/em><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0439 \u0436\u0435 \u0446\u0435\u043b\u0438 \u0432 Dhall-\u0444\u0430\u0439\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u0440\u0430\u0437 \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>ordinaryUser<\/code> \u2014 \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"json\">\u2026 in  [ ordinaryUser \"john\"     , ordinaryUser \"jane\"     , { privateKey = \"\/etc\/jenkins\/jenkins_rsa\"       , publicKey = \"\/etc\/jenkins\/jenkins_rsa.pub\"       , user = \"jenkins\"       }     , ordinaryUser \"chad\"     , ordinaryUser \"alice\" -- \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430     ]<\/code><\/pre>\n<p>\u0427\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u043d\u0435\u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c JSON \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Dhall.<\/p>\n<h3>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b<\/h3>\n<p>\u0414\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 Dhall-\u0444\u0430\u0439\u043b \u0432 JSON:<\/p>\n<pre><code>dhall-to-json --pretty &lt;&lt;&lt; '.\/config0.dhall'<\/code><\/pre>\n<p>\u041f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 YAML, XML, Bash. \u0414\u0430, \u044d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430: <a href=\"https:\/\/github.com\/dhall-lang\/dhall-haskell\/tree\/master\/dhall-bash\"><u>dhall-bash<\/u><\/a> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 Dhall \u0432 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<h3>\u0410\u043a\u0446\u0435\u043d\u0442 \u043d\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>Dhall \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c <strong>\u043d\u0435<\/strong> <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%BF%D0%BE_%D0%A2%D1%8C%D1%8E%D1%80%D0%B8%D0%BD%D0%B3%D1%83\"><u>\u0442\u044c\u044e\u0440\u0438\u043d\u0433-\u043f\u043e\u043b\u043d\u044b\u0439<\/u><\/a>. \u0410\u0432\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043d\u0435\u043c.<\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, webpack \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e TypeScript (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e), Django \u2014 Python, sbt \u2014 Scala \u0438 \u0442. \u043f. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043c\u0435\u0436\u0441\u0430\u0439\u0442\u043e\u0432\u044b\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0438\u043d\u0433\u043e\u043c (XSS), \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (SSRF) \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0430\u0442\u0430\u043a\u0430\u043c\u0438. Dhall \u043e\u0442 \u044d\u0442\u043e\u0433\u043e <a href=\"https:\/\/docs.dhall-lang.org\/discussions\/Safety-guarantees.html#\"><u>\u0437\u0430\u0449\u0438\u0449\u0435\u043d<\/u><\/a>.<\/p>\n<h2>Dhall \u0438 Kubernetes<\/h2>\n<p>\u041e\u043a, \u0430 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 Dhall \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 K8s?\u00a0<\/p>\n<p>\u041d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Kubernetes \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043e\u0431\u0443c\u043b\u043e\u0432\u043b\u0435\u043d\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0438\u0437\u0430\u0439\u043d\u0430 YAML. \u0425\u043e\u0442\u044f YAML \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f <em>\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f<\/em> \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041e\u0431\u043e\u0439\u0442\u0438 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Helm-\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c\u043e <em>(\u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0430 <\/em><a href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/529158\/\"><em><u>\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/u><\/em><\/a><em> \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443)<\/em>. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439, \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Dhall <em>(\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435)<\/em>. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u041e\u043d, \u043a\u0430\u043a <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes#why-do-i-need-this\"><u>\u043e\u0442\u043c\u0435\u0447\u0430\u044e\u0442<\/u><\/a> \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442\u044b Kubernetes \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 Dhall, \u0430 \u0437\u0430\u0442\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 YAML-\u0444\u043e\u0440\u043c\u0430\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 <code>dhall-to-yaml<\/code>. \u0412 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes\"><u>dhall-kubernetes<\/u><\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 bindings \u2014 \u0442\u0438\u043f\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Dhall, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 Kubernetes. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 Dhall-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Deployment\u2019\u0430:<\/p>\n<pre><code class=\"json\">-- examples\/deploymentSimple.dhall  let kubernetes =       https:\/\/raw.githubusercontent.com\/dhall-lang\/dhall-kubernetes\/master\/package.dhall sha256:532e110f424ea8a9f960a13b2ca54779ddcac5d5aa531f86d82f41f8f18d7ef1  let deployment =       kubernetes.Deployment::{       , metadata = kubernetes.ObjectMeta::{ name = Some \"nginx\" }       , spec = Some kubernetes.DeploymentSpec::{         , selector = kubernetes.LabelSelector::{           , matchLabels = Some (toMap { name = \"nginx\" })           }         , replicas = Some +2         , template = kubernetes.PodTemplateSpec::{           , metadata = Some kubernetes.ObjectMeta::{ name = Some \"nginx\" }           , spec = Some kubernetes.PodSpec::{             , containers =               [ kubernetes.Container::{                 , name = \"nginx\"                 , image = Some \"nginx:1.15.3\"                 , ports = Some                   [ kubernetes.ContainerPort::{ containerPort = +80 } ]                 }               ]             }           }         }       }  in  deployment<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0435\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 YAML-\u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>dhall-to-yaml<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"yaml\">## examples\/out\/deploymentSimple.yaml  apiVersion: apps\/v1 kind: Deployment metadata:   name: nginx spec:   replicas: 2   selector:     matchLabels:       name: nginx   template:     metadata:       name: nginx     spec:       containers:         - image: nginx:1.15.3           name: nginx           ports:             - containerPort: 80<\/code><\/pre>\n<p>\u0413\u043e\u0432\u043e\u0440\u044f \u043e \u00ab\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438\u00bb Dhall, \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u044f\u0437\u044b\u043a\u0430 <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes#more-modular-defining-an-ingress\"><u>\u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442<\/u><\/a> \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c: \u0430) \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0438\u043f <code>MyService<\/code> \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 deployment\u2019\u043e\u0432, \u0431) \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a <code>MyService<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f K8s. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Kubernetes \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f DRY \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u043b\u0435: \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043e\u0434\u043d\u043e\u043c Dhall-\u0444\u0430\u0439\u043b\u0435 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 YAML\u2019\u044b.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u00ab\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438\u00bb Dhall \u2014 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Nginx Ingress, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 TLS-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432:<\/p>\n<pre><code class=\"json\">-- examples\/ingress.dhall  let Prelude =       ..\/Prelude.dhall sha256:10db3c919c25e9046833df897a8ffe2701dc390fa0893d958c3430524be5a43e  let map = Prelude.List.map  let kubernetes =       https:\/\/raw.githubusercontent.com\/dhall-lang\/dhall-kubernetes\/master\/package.dhall sha256:532e110f424ea8a9f960a13b2ca54779ddcac5d5aa531f86d82f41f8f18d7ef1  let Service = { name : Text, host : Text, version : Text }  let services = [ { name = \"foo\", host = \"foo.example.com\", version = \"2.3\" } ]  let makeTLS     : Service \u2192 kubernetes.IngressTLS.Type     = \u03bb(service : Service) \u2192         { hosts = Some [ service.host ]         , secretName = Some \"${service.name}-certificate\"         }  let makeRule     : Service \u2192 kubernetes.IngressRule.Type     = \u03bb(service : Service) \u2192         { host = Some service.host         , http = Some           { paths =             [ { backend =                 { serviceName = service.name                 , servicePort = kubernetes.IntOrString.Int +80                 }               , path = None Text               }             ]           }         }  let mkIngress     : List Service \u2192 kubernetes.Ingress.Type     = \u03bb(inputServices : List Service) \u2192         let annotations =               toMap                 { `kubernetes.io\/ingress.class` = \"nginx\"                 , `kubernetes.io\/ingress.allow-http` = \"false\"                 }          let defaultService =               { name = \"default\"               , host = \"default.example.com\"               , version = \" 1.0\"               }          let ingressServices = inputServices # [ defaultService ]          let spec =               kubernetes.IngressSpec::{               , tls = Some                   ( map                       Service                       kubernetes.IngressTLS.Type                       makeTLS                       ingressServices                   )               , rules = Some                   ( map                       Service                       kubernetes.IngressRule.Type                       makeRule                       ingressServices                   )               }          in  kubernetes.Ingress::{             , metadata = kubernetes.ObjectMeta::{               , name = Some \"nginx\"               , annotations = Some annotations               }             , spec = Some spec             }  in  mkIngress services<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 <code>dhall-to-yaml<\/code>:<\/p>\n<pre><code class=\"yaml\">## examples\/out\/ingress.yaml  apiVersion: networking.k8s.io\/v1beta1 kind: Ingress metadata:   annotations:     kubernetes.io\/ingress.allow-http: 'false'     kubernetes.io\/ingress.class: nginx   name: nginx spec:   rules:     - host: foo.example.com       http:         paths:           - backend:               serviceName: foo               servicePort: 80     - host: default.example.com       http:         paths:           - backend:               serviceName: default               servicePort: 80   tls:     - hosts:         - foo.example.com       secretName: foo-certificate     - hosts:         - default.example.com       secretName: default-certificate<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>services<\/code> \u0431\u044b\u043b\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0434\u0432\u0430\u0436\u0434\u044b: \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 <code>defaultService<\/code> (\u0441 \u0445\u043e\u0441\u0442\u043e\u043c <code>default.example.com<\/code>), \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u0441 \u0445\u043e\u0441\u0442\u043e\u043c <code>foo.example.com<\/code>). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441 Ingress \u0441 \u0434\u0432\u0443\u043c\u044f \u044d\u0442\u0438\u043c\u0438 \u0445\u043e\u0441\u0442\u0430\u043c\u0438.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435<\/h2>\n<p>\u041d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 OSDNConf 2021 \u041e\u043b\u0435\u0433 \u041d\u0438\u043a\u043e\u043b\u0438\u043d \u0438\u0437 Portside <a href=\"https:\/\/youtu.be\/UUhkZcqZVGM\"><u>\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b<\/u><\/a>, \u043a\u0430\u043a Dhall \u043f\u043e\u043c\u043e\u0433 \u0435\u0433\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 Kubernetes \u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f CI\/CD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e YAML-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0432\u044b\u0440\u043e\u0441\u043b\u043e \u0434\u043e 12 \u0442\u044b\u0441\u044f\u0447. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 40 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0435\u0436\u0430\u043b\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445. \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0435\u0432\u044c\u044e \u043a\u043e\u0434\u0430 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043f\u043b\u043e\u044f. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439, \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u044b\u043b\u043e \u0442\u044f\u0436\u0435\u043b\u043e.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 Dhall \u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u043e\u0442 50% \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. Dhall \u043f\u043e\u0432\u044b\u0441\u0438\u043b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c CI\/CD: \u0441\u0442\u0430\u043b\u043e \u043b\u0435\u0433\u0447\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b K8s \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043e \u0434\u0435\u043f\u043b\u043e\u044f. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043e\u0431\u0449\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 K8s. \u0412\u0441\u0451 \u044d\u0442\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0443 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Dhall \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 YAML-\u0444\u0430\u0439\u043b\u0430\u043c\u0438, <a href=\"https:\/\/christine.website\/blog\/dhall-kubernetes-2020-01-25\"><u>\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442<\/u><\/a> Christine Dodrill \u0438\u0437 Tailscale. \u041e\u043d\u0430 \u0445\u043e\u0442\u0435\u043b\u0430 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 K8s \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438\u0445 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438. \u0421 \u044d\u0442\u0438\u043c \u0435\u0439 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u043b\u0438 \u043d\u0438 Helm, \u043d\u0438 Kustomize \u2014 \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Dhall. \u0418 \u043e\u043d\u0430 \u043f\u0440\u0438\u0448\u043b\u0430 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443: \u00abDhall, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 Helm \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 Kubernetes\u00bb.<\/p>\n<h2>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>\u0414\u0430, \u043a\u0440\u043e\u043c\u0435 Dhall \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0438 \u044f\u0437\u044b\u043a\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f YAML, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 \u0432 Kubernetes \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439. \u041f\u0440\u0438\u043c\u0435\u0440\u044b Open Source-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/cuelang.org\/\"><u>Cue<\/u><\/a>. \u042f\u0437\u044b\u043a \u0441 \u0448\u0438\u0440\u043e\u043a\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, API, \u0441\u0445\u0435\u043c \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/jsonnet.org\/\"><u>Jsonnet<\/u><\/a>. \u042f\u0437\u044b\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, jsonnet \u2014 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f JSON \u0438 sonnet. \u042f\u0437\u044b\u043a \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 Cue.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/jkcfg.github.io\/#\/\"><u>jk<\/u><\/a>. \u0428\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b K8s.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/hashicorp\/hcl\"><u>HCL<\/u><\/a>. \u042f\u0437\u044b\u043a, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432 HashiCorp. \u0423 HCL \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u00ab\u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u00bb \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 JSON, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/cdk8s.io\/\"><u>cdk8s<\/u><\/a>. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u00ab\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u00bb Kubernetes-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 JavaScript, Java, TypeScript \u0438 Python. <a href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/577624\/\"><u>\u041e\u0431\u0437\u043e\u0440<\/u><\/a> \u043f\u043e \u043d\u0435\u043c\u0443 \u043c\u044b \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<h2>\u041a\u0440\u0438\u0442\u0438\u043a\u0430 Dhall<\/h2>\n<p>\u0425\u043e\u0442\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 Dhall <a href=\"https:\/\/learnxinyminutes.com\/docs\/dhall\/\"><u>\u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439<\/u><\/a>, \u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 <a href=\"https:\/\/docs.dhall-lang.org\/howtos\/How-to-integrate-Dhall.html\"><u>\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a>, \u043a\u043e\u043c\u0443-\u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0442\u0440\u0443\u0434\u043d\u044b\u043c \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u043e\u0441\u0432\u043e\u0438\u0442\u044c Dhall \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u0443\u0436\u0435\u043d \u0445\u043e\u0442\u044f \u0431\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 <a href=\"https:\/\/lobste.rs\/s\/1nxt6g\/intercal_yaml_other_horrible#c_pc0dt6\"><u>\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u044b<\/u><\/a> \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e, \u043d\u043e \u043d\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u044b \u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 Dhall. \u00ab\u041f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u2014 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 Andy Chu, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c Oil Shell, \u2014 \u043d\u043e \u0437\u0430\u0442\u043e \u0443 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432. \u0418 Dhall \u043d\u0435 \u0438\u0437\u0431\u0430\u0432\u043b\u0435\u043d \u043e\u0442 \u044d\u0442\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432\u00bb. \u0415\u043c\u0443 \u0432\u0442\u043e\u0440\u0438\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a <a href=\"https:\/\/github.com\/earthly\/earthly\"><u>Earthly<\/u><\/a> Adam Gordon Bell \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <a href=\"https:\/\/earthly.dev\/blog\/on-yaml-discussions\/#dhall-is-strange\"><u>\u0441\u0447\u0438\u0442\u0430\u0435\u0442<\/u><\/a>, \u0447\u0442\u043e \u00abDhall \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439\u00bb \u2014 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439, \u0447\u0435\u043c HCL, \u0430 \u0432\u0435\u0434\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435.<\/p>\n<h2>\u0420\u0435\u0437\u044e\u043c\u0435<\/h2>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043d\u043e\u0432\u0438\u0437\u043d\u0443, Dhall \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0440\u0435\u043b\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0423 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 3300+ \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 GitHub, \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u043e\u0432 \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b. Dhall, \u043f\u043e \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435, \u0434\u043e\u0441\u0442\u043e\u0438\u043d \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0445\u0432\u0430\u0442\u0430\u0442\u044c.<\/p>\n<p>\u042f\u0437\u044b\u043a <a href=\"https:\/\/docs.dhall-lang.org\/discussions\/Dhall-in-production.html\"><u>\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 production<\/u><\/a> \u0440\u044f\u0434\u043e\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439; \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u0440\u0435\u0434\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Dhall \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438 Kubernetes, \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f KSF Media, Earnest Research \u0438 IOHK.<\/p>\n<h2>P.S.<\/h2>\n<p>\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0431\u043b\u043e\u0433\u0435:<\/p>\n<ul>\n<li>\n<p>\u00ab<a href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/577624\/\">\u041e\u0431\u0437\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 cdk8s \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Kubernetes-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432<\/a>\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u00ab<a href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/529158\/\">\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u0430\u044f Helm-\u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f: \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c<\/a>\u00bb.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/593321\/\"> https:\/\/habr.com\/ru\/articles\/593321\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/github.com\/dhall-lang\/dhall-lang\"><u>Dhall<\/u><\/a> \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e Open Source-\u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0441\u044f \u0432 2018 \u0433\u043e\u0434\u0443.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u0432\u0441\u044f\u043a\u0438\u0439 \u043d\u043e\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, Dhall \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 YAML, JSON, TOML, XML \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c. \u042f\u0437\u044b\u043a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u0448\u0438\u0440\u0435. \u0412 2020-\u043c \u0433\u043e\u0434\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0438 <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes\"><u>\u0435\u0433\u043e bindings<\/u><\/a>, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f Kubernetes.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043e Dhall \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e K8s-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432, \u043d\u0430\u0447\u043d\u0435\u043c \u0432\u0441\u0435 \u0436\u0435 \u0441 \u043a\u0440\u0430\u0442\u043a\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0427\u0435\u043c Dhall \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432<\/h2>\n<p>\u0410\u0432\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c Dhall \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 JSON: \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0442\u0438\u043f\u0430\u043c\u0438, \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438. \u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435?\u00a0<\/p>\n<details class=\"spoiler\">\n<summary>Just because<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption>xkcd \u043f\u0440\u043e Standards<\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439: \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 JSON \u0438 YAML \u2014 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438. \u042d\u0442\u043e \u0441\u0443\u0436\u0430\u0435\u0442 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u200b\u200b\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 DRY<\/h3>\n<p>\u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u043e\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u2014 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0443 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\"><u>DRY<\/u><\/a> (\u00abDon\u2019t repeat yourself\u00bb). \u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0441 \u200b\u200bJSON \u0438 YAML, \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0441\u0435\u0431\u044f \u0442\u0440\u0443\u0434\u043d\u043e. \u0418\u0437-\u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0418\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c.<\/p>\n<p>Dhall \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u044f\u0437\u044b\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 DRY. \u0422\u0430\u043c, \u0433\u0434\u0435 \u0432 \u200b\u200bJSON- \u0438\u043b\u0438 YAML-\u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430, \u0432 Dhall \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Dhall \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/docs.dhall-lang.org\/discussions\/Programmable-configuration-files.html#programmable-configuration-file\"><u>\u043f\u0440\u0438\u043c\u0435\u0440<\/u><\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430, \u0432 JSON- \u0438 Dhall-\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443: \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e SSH-\u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 JSON-\u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"json\">[     {         \"privateKey\": \"\/home\/john\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/john\/.ssh\/id_rsa.pub\",         \"user\": \"john\"     },     {         \"privateKey\": \"\/home\/jane\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/jane\/.ssh\/id_rsa.pub\",         \"user\": \"jane\"     },     {         \"privateKey\": \"\/etc\/jenkins\/jenkins_rsa\",         \"publicKey\": \"\/etc\/jenkins\/jenkins_rsa.pub\",         \"user\": \"jenkins\"     },     {         \"privateKey\": \"\/home\/chad\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/chad\/.ssh\/id_rsa.pub\",         \"user\": \"chad\"     } ]<\/code><\/pre>\n<p>\u0422\u0430 \u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 Dhall-\u0444\u043e\u0440\u043c\u0430\u0442\u0435:<\/p>\n<pre><code class=\"json\">-- config0.dhall  let ordinaryUser =       \\(user : Text) ->         let privateKey = \"\/home\/${user}\/.ssh\/id_rsa\"          let publicKey = \"${privateKey}.pub\"          in  { privateKey, publicKey, user }  in  [ ordinaryUser \"john\"     , ordinaryUser \"jane\"     , { privateKey = \"\/etc\/jenkins\/jenkins_rsa\"       , publicKey = \"\/etc\/jenkins\/jenkins_rsa.pub\"       , user = \"jenkins\"       }     , ordinaryUser \"chad\"     ]<\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u0442\u0440\u043e\u043a \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.\u00a0<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2014 <code>alice<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 JSON-\u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0438\u0437 5 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"json\">[     \u2026     {         \"privateKey\": \"\/home\/alice\/.ssh\/id_rsa\",         \"publicKey\": \"\/home\/alice\/.ssh\/id_rsa.pub\",         \"user\": \"alice\"     } ]<\/code><\/pre>\n<p><em>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430 \u0434\u043b\u044f chad, \u043d\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043c\u044f \u043d\u0430 alice.<\/em><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0439 \u0436\u0435 \u0446\u0435\u043b\u0438 \u0432 Dhall-\u0444\u0430\u0439\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u0440\u0430\u0437 \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>ordinaryUser<\/code> \u2014 \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"json\">\u2026 in  [ ordinaryUser \"john\"     , ordinaryUser \"jane\"     , { privateKey = \"\/etc\/jenkins\/jenkins_rsa\"       , publicKey = \"\/etc\/jenkins\/jenkins_rsa.pub\"       , user = \"jenkins\"       }     , ordinaryUser \"chad\"     , ordinaryUser \"alice\" -- \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430     ]<\/code><\/pre>\n<p>\u0427\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u043d\u0435\u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c JSON \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Dhall.<\/p>\n<h3>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b<\/h3>\n<p>\u0414\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 Dhall-\u0444\u0430\u0439\u043b \u0432 JSON:<\/p>\n<pre><code>dhall-to-json --pretty &lt;&lt;&lt; '.\/config0.dhall'<\/code><\/pre>\n<p>\u041f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 YAML, XML, Bash. \u0414\u0430, \u044d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430: <a href=\"https:\/\/github.com\/dhall-lang\/dhall-haskell\/tree\/master\/dhall-bash\"><u>dhall-bash<\/u><\/a> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 Dhall \u0432 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<h3>\u0410\u043a\u0446\u0435\u043d\u0442 \u043d\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>Dhall \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c <strong>\u043d\u0435<\/strong> <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_%D0%BF%D0%BE_%D0%A2%D1%8C%D1%8E%D1%80%D0%B8%D0%BD%D0%B3%D1%83\"><u>\u0442\u044c\u044e\u0440\u0438\u043d\u0433-\u043f\u043e\u043b\u043d\u044b\u0439<\/u><\/a>. \u0410\u0432\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043d\u0435\u043c.<\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, webpack \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e TypeScript (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e), Django \u2014 Python, sbt \u2014 Scala \u0438 \u0442. \u043f. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043c\u0435\u0436\u0441\u0430\u0439\u0442\u043e\u0432\u044b\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0438\u043d\u0433\u043e\u043c (XSS), \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (SSRF) \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0430\u0442\u0430\u043a\u0430\u043c\u0438. Dhall \u043e\u0442 \u044d\u0442\u043e\u0433\u043e <a href=\"https:\/\/docs.dhall-lang.org\/discussions\/Safety-guarantees.html#\"><u>\u0437\u0430\u0449\u0438\u0449\u0435\u043d<\/u><\/a>.<\/p>\n<h2>Dhall \u0438 Kubernetes<\/h2>\n<p>\u041e\u043a, \u0430 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 Dhall \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 K8s?\u00a0<\/p>\n<p>\u041d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Kubernetes \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043e\u0431\u0443c\u043b\u043e\u0432\u043b\u0435\u043d\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0438\u0437\u0430\u0439\u043d\u0430 YAML. \u0425\u043e\u0442\u044f YAML \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f <em>\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f<\/em> \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041e\u0431\u043e\u0439\u0442\u0438 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Helm-\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c\u043e <em>(\u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0430 <\/em><a href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/529158\/\"><em><u>\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/u><\/em><\/a><em> \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443)<\/em>. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439, \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Dhall <em>(\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435)<\/em>. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u041e\u043d, \u043a\u0430\u043a <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes#why-do-i-need-this\"><u>\u043e\u0442\u043c\u0435\u0447\u0430\u044e\u0442<\/u><\/a> \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442\u044b Kubernetes \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 Dhall, \u0430 \u0437\u0430\u0442\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 YAML-\u0444\u043e\u0440\u043c\u0430\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 <code>dhall-to-yaml<\/code>. \u0412 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes\"><u>dhall-kubernetes<\/u><\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 bindings \u2014 \u0442\u0438\u043f\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Dhall, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 Kubernetes. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 Dhall-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Deployment\u2019\u0430:<\/p>\n<pre><code class=\"json\">-- examples\/deploymentSimple.dhall  let kubernetes =       https:\/\/raw.githubusercontent.com\/dhall-lang\/dhall-kubernetes\/master\/package.dhall sha256:532e110f424ea8a9f960a13b2ca54779ddcac5d5aa531f86d82f41f8f18d7ef1  let deployment =       kubernetes.Deployment::{       , metadata = kubernetes.ObjectMeta::{ name = Some \"nginx\" }       , spec = Some kubernetes.DeploymentSpec::{         , selector = kubernetes.LabelSelector::{           , matchLabels = Some (toMap { name = \"nginx\" })           }         , replicas = Some +2         , template = kubernetes.PodTemplateSpec::{           , metadata = Some kubernetes.ObjectMeta::{ name = Some \"nginx\" }           , spec = Some kubernetes.PodSpec::{             , containers =               [ kubernetes.Container::{                 , name = \"nginx\"                 , image = Some \"nginx:1.15.3\"                 , ports = Some                   [ kubernetes.ContainerPort::{ containerPort = +80 } ]                 }               ]             }           }         }       }  in  deployment<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0435\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 YAML-\u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>dhall-to-yaml<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"yaml\">## examples\/out\/deploymentSimple.yaml  apiVersion: apps\/v1 kind: Deployment metadata:   name: nginx spec:   replicas: 2   selector:     matchLabels:       name: nginx   template:     metadata:       name: nginx     spec:       containers:         - image: nginx:1.15.3           name: nginx           ports:             - containerPort: 80<\/code><\/pre>\n<p>\u0413\u043e\u0432\u043e\u0440\u044f \u043e \u00ab\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438\u00bb Dhall, \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u044f\u0437\u044b\u043a\u0430 <a href=\"https:\/\/github.com\/dhall-lang\/dhall-kubernetes#more-modular-defining-an-ingress\"><u>\u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442<\/u><\/a> \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c: \u0430) \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0438\u043f <code>MyService<\/code> \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 deployment\u2019\u043e\u0432, \u0431) \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a <code>MyService<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f K8s. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Kubernetes \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f DRY \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u043b\u0435: \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043e\u0434\u043d\u043e\u043c Dhall-\u0444\u0430\u0439\u043b\u0435 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 YAML\u2019\u044b.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u00ab\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438\u00bb Dhall \u2014 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Nginx Ingress, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 TLS-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432:<\/p>\n<pre><code class=\"json\">-- examples\/ingress.dhall  let Prelude =       ..\/Prelude.dhall sha256:10db3c919c25e9046833df897a8ffe2701dc390fa0893d958c3430524be5a43e  let map = Prelude.List.map  let kubernetes =       https:\/\/raw.githubusercontent.com\/dhall-lang\/dhall-kubernetes\/master\/package.dhall sha256:532e110f424ea8a9f960a13b2ca54779ddcac5d5aa531f86d82f41f8f18d7ef1  let Service = { name : Text, host : Text, version : Text }  let services = [ { name = \"foo\", host = \"foo.example.com\", version = \"2.3\" } ]  let makeTLS     : Service \u2192 kubernetes.IngressTLS.Type     = \u03bb(service : Service) \u2192         { hosts = Some [ service.host ]         , secretName = Some \"${service.name}-certificate\"         }  let makeRule     : Service \u2192 kubernetes.IngressRule.Type     = \u03bb(service : Service) \u2192         { host = Some service.host         , http = Some           { paths =             [ { backend =                 { serviceName = service.name                 , servicePort = kubernetes.IntOrString.Int +80                 }               , path = None Text               }             ]           }         }  let mkIngress     : List Service \u2192 kubernetes.Ingress.Type     = \u03bb(inputServices : List Service) \u2192         let annotations =               toMap                 { `kubernetes.io\/ingress.class` = \"nginx\"                 , `kubernetes.io\/ingress.allow-http` = \"false\"                 }          let defaultService =               { name = \"default\"               , host = \"default.example.com\"               , version = \" 1.0\"               }          let ingressServices = inputServices # [ defaultService ]          let spec =               kubernetes.IngressSpec::{               , tls = Some                   ( map                       Service                       kubernetes.IngressTLS.Type                    <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\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-394992","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/394992","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=394992"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/394992\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=394992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=394992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=394992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}