{"id":342702,"date":"2022-12-15T09:03:05","date_gmt":"2022-12-15T09:03:05","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=342702"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=342702","title":{"rendered":"<span>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441 \u0434\u0435\u043f\u043b\u043e\u044f bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u043d\u0430 helmfile \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Python: \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e<\/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<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e14\/e60\/133\/e14e601332a773fbd59ba9a7d9c6b73b.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e14\/e60\/133\/e14e601332a773fbd59ba9a7d9c6b73b.png\"\/><figcaption><\/figcaption><\/figure>\n<p><em>\u0412\u044b\u043f\u0443\u0441\u043a\u043d\u0438\u043a \u043a\u0443\u0440\u0441\u0430 <\/em><a href=\"https:\/\/slurm.club\/3WmJ1bY\"><em>Python \u0434\u043b\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432<\/em><\/a><em> <\/em><strong><em>\u041c\u0430\u043a\u0441\u0438\u043c \u0414\u0443\u0431\u0430\u043a\u0438\u043d<\/em><\/strong><em> \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0443 \u0441 \u0434\u0435\u043f\u043b\u043e\u044f bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u043d\u0430 helmfile \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Python \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 ~ 2 \u0447\u0430\u0441\u0430.<\/em><\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h2>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 helm \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 K8s. \u0420\u0430\u043d\u0435\u0435 helm-\u0447\u0430\u0440\u0442\u044b \u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0438\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u0435\u0449\u0435 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b. \u042d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0434\u0435\u0431\u0430\u0433\u0430: \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0445\u043e\u0442\u044c \u0438 \u0438\u043c\u0435\u043b\u0438 \u043e\u0431\u0449\u0443\u044e \u0444\u043e\u0440\u043c\u0443, \u043d\u043e \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u043e\u0441\u044c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0430\u0448\u0443.<\/p>\n<p>\u041d\u0430\u0448\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f [helmfile] (<a href=\"https:\/\/github.com\/helmfile\/helmfile\"><u>https:\/\/github.com\/helmfile\/helmfile<\/u><\/a>). \u041e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e helm-\u0447\u0430\u0440\u0442\u043e\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u0430\u0432 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 (\u0443 \u041c\u0430\u043a\u0441\u0438\u043c\u0430 \u2014 <code>production<\/code> \/ <code>stage<\/code> \/ <code>QA<\/code>), \u0438 \u043a\u0430\u0436\u0434\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0438 <code>values<\/code> \u0444\u0430\u0439\u043b\u044b.<\/p>\n<p>\u0412 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 250 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 helmfile \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u2014 \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 6\u201312 \u0447\u0430\u0441\u043e\u0432 \u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u043a\u0430\u0442\u043a\u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0440\u0435\u0434\u044b. \u0412 QA-\u0441\u0440\u0435\u0434\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f helm-\u0447\u0430\u0440\u0442\u044b \u0434\u043b\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0442\u0438\u043f\u0430 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0435\u0448\u0435\u0439 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e values \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u043b\u0438\u043d\u0430 helmfile \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e helmfile \u0434\u043b\u044f QA:<\/p>\n<pre><code class=\"python\">```yaml environments:  default:    values:      - VERSION: {{ requiredEnv \"version\" | quote }}      - NAMESPACE: {{ requiredEnv \"namespace\" | quote }}      - CLUSTER: {{ requiredEnv \"cluster\" | quote }}      - RELEASE: &lt;name_of_service> --- templates:  default: &amp;default    namespace: {{ .Values.NAMESPACE }}    missingFileHandler: Warn   releases:  - name: \"{{ .Values.RELEASE }}\"    chart: artifactory\/unified    &lt;&lt;: *default    version: \"2.5.3\"    values:      - values\/common.yaml.gotmpl      - values\/app.yaml.gotmpl      - values\/override\/{{.Values.CLUSTER}}\/{{.Values.NAMESPACE}}\/common.yaml      - values\/override\/{{.Values.CLUSTER}}\/{{.Values.NAMESPACE}}\/app.yaml    needs:      - \"{{ .Values.RELEASE }}-migration\"    - name: \"{{ .Values.RELEASE }}-job\"    ...    needs:      - {{ .Values.RELEASE }}    # migration  - name: \"{{ .Values.RELEASE }}-migration\"    ...    needs:      - \"{{ .Values.RELEASE }}-drop-restore-db\"   - name: \"{{ .Values.RELEASE }}-drop-restore-db\"    ...    needs:      - \"{{ .Values.RELEASE }}-sku-generator\"      - \"pgsql-{{ .Values.RELEASE }}\"      - \"{{ .Values.RELEASE }}-rabbitmq\"      - \"{{ .Values.RELEASE }}-webdav\"      - \"{{ .Values.RELEASE }}-wiremock\"      - \"{{ .Values.RELEASE }}-mailhog\"    # sku-generator  - name: \"{{ .Values.RELEASE }}-sku-generator\"    ...   # postgres  - name: \"pgsql-{{ .Values.RELEASE }}\"    ...    # rabbitmq  - name: \"{{ .Values.RELEASE }}-rabbitmq\"    ...   # webdav  - name: \"{{ .Values.RELEASE }}-webdav\"    ...   # wiremock  - name: \"{{ .Values.RELEASE }}-wiremock\"    ...    # mailhog  - name: \"{{ .Values.RELEASE }}-mailhog\"    ... bases:  - \"..\/_helmfile.d\/helm.yaml\"  - ..\/_helmfile.d\/repositories.yaml ```<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u0438\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 helm-\u0447\u0430\u0440\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u2014 \u0432\u0441\u0435 \u0435\u0433\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u043e\u0434 <code>...<\/code> \u0441\u043a\u0440\u044b\u0442\u044b \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0447\u0430\u0440\u0442\u0430, \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 values \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p><em>\u0417\u0434\u0435\u0441\u044c \u044f\u0432\u043d\u043e \u0432\u0438\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0442\u0440\u0443\u0434\u0430.<\/em><\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u041c\u0430\u043a\u0441\u0438\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u043a\u0443\u0440\u0441\u0435 \u0438 \u0440\u0435\u0448\u0438\u043b \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 helmfile, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u0444\u0430\u0439\u043b\u044b values \u0438 helmfile.yaml. \u041d\u043e \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f. \u0412\u043e\u0442, \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e.<\/p>\n<p>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430:<\/p>\n<p>1. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u0430\u043a\u043e\u0439 namespace \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>2. \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0441 helmfile (\u0434\u043b\u044f production \u0438 QA \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438).<\/p>\n<p>3. \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0444\u0430\u0439\u043b\u043e\u0432 helmfile.yaml \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 values \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 override \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e merge \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 jinja2 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (values \u0438 helmfile.yaml) \u0438 \u043e\u0431\u0449\u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 gotmpl (\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0438 \u0438\u0445 values \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 helmfile.<\/p>\n<p>4. \u0412\u043d\u0443\u0442\u0440\u0438 helmfile \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043d\u0444\u0440\u0430\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0447\u0435\u043d\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435.<\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h2>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 OPS \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043f\u043a\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u0443\u0447\u0443 values \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 helmfile.yaml \u0442\u0435 \u0447\u0430\u0440\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0444\u0438\u0447\u0438:<\/p>\n<p>1. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <code>helmfile_template<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 gotmpl \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 helmfile. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<pre><code class=\"python\">```yaml pgsql: &amp;pgsql  &lt;&lt;: *default  name: pgsql-{{ .Values.releaseName }}  chart: artifactory\/postgres-instance  version: 0.4.2  values:    - ..\/_helmfile.d\/templates\/values\/pgsql.yaml.gotmpl    - values\/pgsql.yaml.gotmpl    - values\/override\/{{ .Values.CLUSTER }}\/{{ .Values.NAMESPACE }}\/pgsql.yaml ```<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d values \u0434\u043b\u044f pgsql:<\/p>\n<pre><code class=\"python\">```yaml pgsql:  version: 12  instances: 1  limits:    cpu: 200m    memory: 512Mi  requests:    cpu: 200m    memory: 512Mi  storageClass: ceph-block   database:  - name: {{ .Values.releaseName | replace \"-\" \"_\" }}    size: 10   service:  annotations:    external-dns.alpha.kubernetes.io\/hostname: {{ .Release.Name }}{{ .Values.IngressPostfix }} ```<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0435\u0440\u0432\u044b\u043c values-\u0444\u0430\u0439\u043b\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>- ..\/_helmfile.d\/templates\/values\/pgsql.yaml.gotmpl<\/code>. \u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 values \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435. \u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c.<\/p>\n<p>2. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u044b [jinja2] (<a href=\"https:\/\/jinja.palletsprojects.com\/en\/3.1.x\/\"><u>https:\/\/jinja.palletsprojects.com\/en\/3.1.x\/<\/u><\/a>).<\/p>\n<p>3. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c [pyinstaller] (<a href=\"https:\/\/pyinstaller.org\/en\/stable\/\"><u>https:\/\/pyinstaller.org\/en\/stable\/<\/u><\/a>).<\/p>\n<p>4. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0442\u0430\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c [argparse] (<a href=\"https:\/\/docs.python.org\/3\/library\/argparse.html\"><u>https:\/\/docs.python.org\/3\/library\/argparse.html<\/u><\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439 help \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0430 <code>-h<\/code>.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u043a\u0438:<\/p>\n<pre><code class=\"python\">```bash helmfile_template -h usage: helmfile_template [-h] [-v] [-g] [-s PROJECT_NAME] [-p] [--no-production] [-n NAMESPACE] [-u] [--no-unified]                         [-m] [--no-migration]   Get helmfile templates.   options:  -h, --help            show this help message and exit  -v, --version         show program's version number and exit  -g, --get-help        get templates  -s PROJECT_NAME, --name PROJECT_NAME  -p, --production      use deploy repository  --no-production       use deploy repository  -n NAMESPACE, --namespace NAMESPACE  -u, --unified         use unified helmchart  --no-unified          don't use unified helmchart  -m, --migration       use migration  --no-migration        don't use migration ```<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435:<\/p>\n<pre><code class=\"python\">```bash $ helmfile_template ****************************** \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430: slurm ****************************** ****************************** 1. deploy 2. qa-deploy \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 (default: 2): 2 ****************************** \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c unified? (y\/n) (default: n): y ****************************** \u041d\u0443\u0436\u043d\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438? (y\/n) (default: n): n \u041f\u0440\u043e\u0435\u043a\u0442 slurm \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0432 \u043f\u0430\u043f\u043a\u0435 \/Users\/&lt;my_user>\/&lt;some_path>\/qa-deploy. ```<\/code><\/pre>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">```bash $ helmfile_template -s slurm --no-production -u --no-migration \u041f\u0440\u043e\u0435\u043a\u0442 slurm \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0432 \u043f\u0430\u043f\u043a\u0435 \/Users\/&lt;my_user>\/&lt;some_path>\/qa-deploy. ```<\/code><\/pre>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/h2>\n<p>\u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"python\">``` slurm \u251c\u2500\u2500 helmfile.yaml \u2514\u2500\u2500 values    \u251c\u2500\u2500 app.yaml.gotmpl    \u251c\u2500\u2500 common.yaml.gotmpl    \u251c\u2500\u2500 job.yaml.gotmpl    \u2514\u2500\u2500 override ```<\/code><\/pre>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>helmfile.yaml<\/code>:<\/p>\n<pre><code class=\"python\">```yaml {{ tpl (readFile \"..\/_helmfile.d\/environments.tmpl\") . }} --- environments:  default:    values:      - releaseName: \"slurm\" --- {{ tpl (readFile \"..\/_helmfile.d\/templates.tmpl\") . }} {{ tpl (readFile \"..\/_helmfile.d\/bases.yaml\") . }} releases: - &lt;&lt;: *unified  labels:    type: app # - &lt;&lt;: *unified #   name: {{ .Values.releaseName }}-{{`{{ .Release.Labels.type }}`}} #   labels: #     type: job #   needs: #     - \"pgsql-{{ .Values.releaseName }}\" #     - \"{{ .Values.releaseName }}-mysql\" #     - \"{{ .Values.releaseName }}-es\" #     - \"{{ .Values.releaseName }}-kafka\" #     - \"{{ .Values.releaseName }}-rabbitmq\" #     - \"{{ .Values.releaseName }}-redis\" #     - \"{{ .Values.releaseName }}-webdav\" #     - \"{{ .Values.releaseName }}-saml\" # - &lt;&lt;: *pgsql # - &lt;&lt;: *mysql # - &lt;&lt;: *elastic # - &lt;&lt;: *kafka # - &lt;&lt;: *rabbitmq # - &lt;&lt;: *redis-standalone # - &lt;&lt;: *redis-sentinel # - &lt;&lt;: *webdav # - &lt;&lt;: *saml ```<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0443 slurm \u043d\u0443\u0436\u043d\u044b pgsql, kafka \u0438 saml. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0442\u043e\u0432 \u043a \u0434\u0435\u043f\u043b\u043e\u044e:<\/p>\n<pre><code class=\"python\">```yaml {{ tpl (readFile \"..\/_helmfile.d\/environments.tmpl\") . }} --- environments:  default:    values:      - releaseName: \"slurm\" --- {{ tpl (readFile \"..\/_helmfile.d\/templates.tmpl\") . }} {{ tpl (readFile \"..\/_helmfile.d\/bases.yaml\") . }} releases: - &lt;&lt;: *unified  labels:    type: app  needs:    - \"pgsql-{{ .Values.releaseName }}\"    - \"{{ .Values.releaseName }}-kafka\"    - \"{{ .Values.releaseName }}-saml\"   - &lt;&lt;: *pgsql   - &lt;&lt;: *kafka   - &lt;&lt;: *saml ```<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u044b\u0440\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0438 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 Roadmap \u043f\u043e \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u0430\u043a\u0441\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u043e \u0441\u0435\u0431\u0435 \u0438 \u043e \u043a\u0443\u0440\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0443\u0447\u0430\u043b:<\/p>\n<p>\u00ab\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044f \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0441\u044c \u0434\u0430\u0432\u043d\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0441 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u041d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0433\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043c\u043e\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0439\u0442\u0438 \u043d\u0430 \u043a\u0443\u0440\u0441 <a href=\"https:\/\/slurm.club\/3WmJ1bY\"><strong>Python \u0434\u043b\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432<\/strong><\/a>, \u0438 \u043e\u043d \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043f\u0440\u0438\u0434\u0430\u043b \u043c\u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0441\u0438\u043b\u0430\u0445.<\/p>\n<p>\u042f \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \/ \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u041f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043e\u043f\u044b\u0442 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0431\u043e\u043b\u044c\u0448\u0435 100 \u0441\u0442\u0440\u043e\u043a, \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u041e\u041e\u041f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 Ansible \u043c\u043e\u0434\u0443\u043b\u044c \u0438 Prometheus Exporter. \u0427\u0435\u0433\u043e \u0434\u0430\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b, \u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u0437\u043d\u0430\u043d\u0438\u0439.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0443\u0440\u0441\u0430. \u042f \u0442\u0440\u0430\u0442\u0438\u043b 8\u201312 \u0447\u0430\u0441\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u00ab\u043a\u0443\u0440\u0441\u043e\u0432\u0443\u044e\u00bb \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u044b\u0439 \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0435\u0432\u044c\u044e, \u0438 \u044f \u0435\u0449\u0435 \u0447\u0430\u0441\u0438\u043a-\u0434\u0432\u0430 \u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439. \u041f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043a\u0443\u0440\u0441\u0430 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e, \u043f\u0440\u043e\u0439\u0434\u044f \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e, \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442\u00bb.<\/p>\n<\/div>\n<\/details>\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\/company\/southbridge\/blog\/705620\/\"> https:\/\/habr.com\/ru\/company\/southbridge\/blog\/705620\/<\/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<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><em>\u0412\u044b\u043f\u0443\u0441\u043a\u043d\u0438\u043a \u043a\u0443\u0440\u0441\u0430 <\/em><a href=\"https:\/\/slurm.club\/3WmJ1bY\"><em>Python \u0434\u043b\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432<\/em><\/a><em> <\/em><strong><em>\u041c\u0430\u043a\u0441\u0438\u043c \u0414\u0443\u0431\u0430\u043a\u0438\u043d<\/em><\/strong><em> \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0443 \u0441 \u0434\u0435\u043f\u043b\u043e\u044f bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u043d\u0430 helmfile \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Python \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 ~ 2 \u0447\u0430\u0441\u0430.<\/em><\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h2>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 helm \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 K8s. \u0420\u0430\u043d\u0435\u0435 helm-\u0447\u0430\u0440\u0442\u044b \u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0438\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u0435\u0449\u0435 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b. \u042d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0434\u0435\u0431\u0430\u0433\u0430: \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0445\u043e\u0442\u044c \u0438 \u0438\u043c\u0435\u043b\u0438 \u043e\u0431\u0449\u0443\u044e \u0444\u043e\u0440\u043c\u0443, \u043d\u043e \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u043e\u0441\u044c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0430\u0448\u0443.<\/p>\n<p>\u041d\u0430\u0448\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f [helmfile] (<a href=\"https:\/\/github.com\/helmfile\/helmfile\"><u>https:\/\/github.com\/helmfile\/helmfile<\/u><\/a>). \u041e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e helm-\u0447\u0430\u0440\u0442\u043e\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u0430\u0432 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 (\u0443 \u041c\u0430\u043a\u0441\u0438\u043c\u0430 \u2014 <code>production<\/code> \/ <code>stage<\/code> \/ <code>QA<\/code>), \u0438 \u043a\u0430\u0436\u0434\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0438 <code>values<\/code> \u0444\u0430\u0439\u043b\u044b.<\/p>\n<p>\u0412 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 250 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 helmfile \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u2014 \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 6\u201312 \u0447\u0430\u0441\u043e\u0432 \u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u043a\u0430\u0442\u043a\u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0440\u0435\u0434\u044b. \u0412 QA-\u0441\u0440\u0435\u0434\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f helm-\u0447\u0430\u0440\u0442\u044b \u0434\u043b\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0442\u0438\u043f\u0430 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0435\u0448\u0435\u0439 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e values \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u043b\u0438\u043d\u0430 helmfile \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e helmfile \u0434\u043b\u044f QA:<\/p>\n<pre><code class=\"python\">```yaml environments:  default:    values:      - VERSION: {{ requiredEnv \"version\" | quote }}      - NAMESPACE: {{ requiredEnv \"namespace\" | quote }}      - CLUSTER: {{ requiredEnv \"cluster\" | quote }}      - RELEASE: &lt;name_of_service> --- templates:  default: &amp;default    namespace: {{ .Values.NAMESPACE }}    missingFileHandler: Warn   releases:  - name: \"{{ .Values.RELEASE }}\"    chart: artifactory\/unified    &lt;&lt;: *default    version: \"2.5.3\"    values:      - values\/common.yaml.gotmpl      - values\/app.yaml.gotmpl      - values\/override\/{{.Values.CLUSTER}}\/{{.Values.NAMESPACE}}\/common.yaml      - values\/override\/{{.Values.CLUSTER}}\/{{.Values.NAMESPACE}}\/app.yaml    needs:      - \"{{ .Values.RELEASE }}-migration\"    - name: \"{{ .Values.RELEASE }}-job\"    ...    needs:      - {{ .Values.RELEASE }}    # migration  - name: \"{{ .Values.RELEASE }}-migration\"    ...    needs:      - \"{{ .Values.RELEASE }}-drop-restore-db\"   - name: \"{{ .Values.RELEASE }}-drop-restore-db\"    ...    needs:      - \"{{ .Values.RELEASE }}-sku-generator\"      - \"pgsql-{{ .Values.RELEASE }}\"      - \"{{ .Values.RELEASE }}-rabbitmq\"      - \"{{ .Values.RELEASE }}-webdav\"      - \"{{ .Values.RELEASE }}-wiremock\"      - \"{{ .Values.RELEASE }}-mailhog\"    # sku-generator  - name: \"{{ .Values.RELEASE }}-sku-generator\"    ...   # postgres  - name: \"pgsql-{{ .Values.RELEASE }}\"    ...    # rabbitmq  - name: \"{{ .Values.RELEASE }}-rabbitmq\"    ...   # webdav  - name: \"{{ .Values.RELEASE }}-webdav\"    ...   # wiremock  - name: \"{{ .Values.RELEASE }}-wiremock\"    ...    # mailhog  - name: \"{{ .Values.RELEASE }}-mailhog\"    ... bases:  - \"..\/_helmfile.d\/helm.yaml\"  - ..\/_helmfile.d\/repositories.yaml ```<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u0438\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 helm-\u0447\u0430\u0440\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u2014 \u0432\u0441\u0435 \u0435\u0433\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u043e\u0434 <code>...<\/code> \u0441\u043a\u0440\u044b\u0442\u044b \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0447\u0430\u0440\u0442\u0430, \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 values \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p><em>\u0417\u0434\u0435\u0441\u044c \u044f\u0432\u043d\u043e \u0432\u0438\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0442\u0440\u0443\u0434\u0430.<\/em><\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u041c\u0430\u043a\u0441\u0438\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u043a\u0443\u0440\u0441\u0435 \u0438 \u0440\u0435\u0448\u0438\u043b \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 helmfile, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u0444\u0430\u0439\u043b\u044b values \u0438 helmfile.yaml. \u041d\u043e \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f. \u0412\u043e\u0442, \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e.<\/p>\n<p>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430:<\/p>\n<p>1. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u0430\u043a\u043e\u0439 namespace \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>2. \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0441 helmfile (\u0434\u043b\u044f production \u0438 QA \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438).<\/p>\n<p>3. \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0444\u0430\u0439\u043b\u043e\u0432 helmfile.yaml \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 values \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 override \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e merge \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 jinja2 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (values \u0438 helmfile.yaml) \u0438 \u043e\u0431\u0449\u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 gotmpl (\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0438 \u0438\u0445 values \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 helmfile.<\/p>\n<p>4. \u0412\u043d\u0443\u0442\u0440\u0438 helmfile \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043d\u0444\u0440\u0430\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0447\u0435\u043d\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435.<\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h2>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 OPS \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043f\u043a\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u0443\u0447\u0443 values \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 helmfile.yaml \u0442\u0435 \u0447\u0430\u0440\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0444\u0438\u0447\u0438:<\/p>\n<p>1. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <code>helmfile_template<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 gotmpl \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 helmfile. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<pre><code class=\"python\">```yaml pgsql: &amp;pgsql  &lt;&lt;: *default  name: pgsql-{{ .Values.releaseName }}  chart: artifactory\/postgres-instance  version: 0.4.2  values:    - ..\/_helmfile.d\/templates\/values\/pgsql.yaml.gotmpl    - values\/pgsql.yaml.gotmpl    - values\/override\/{{ .Values.CLUSTER }}\/{{ .Values.NAMESPACE }}\/pgsql.yaml ```<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d values \u0434\u043b\u044f pgsql:<\/p>\n<pre><code class=\"python\">```yaml pgsql:  version: 12  instances: 1  limits:    cpu: 200m    memory: 512Mi  requests:    cpu: 200m    memory: 512Mi  storageClass: ceph-block   database:  - name: {{ .Values.releaseName | replace \"-\" \"_\" }}    size: 10   service:  annotations:    external-dns.alpha.kubernetes.io\/hostname: {{ .Release.Name }}{{ .Values.IngressPostfix }} ```<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0435\u0440\u0432\u044b\u043c values-\u0444\u0430\u0439\u043b\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>- ..\/_helmfile.d\/templates\/values\/pgsql.yaml.gotmpl<\/code>. \u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 values \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435. \u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c.<\/p>\n<p>2. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u044b [jinja2] (<a href=\"https:\/\/jinja.palletsprojects.com\/en\/3.1.x\/\"><u>https:\/\/jinja.palletsprojects.com\/en\/3.1.x\/<\/u><\/a>).<\/p>\n<p>3. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c [pyinstaller] (<a href=\"https:\/\/pyinstaller.org\/en\/stable\/\"><u>https:\/\/pyinstaller.org\/en\/stable\/<\/u><\/a>).<\/p>\n<p>4. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0442\u0430\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c [argparse] (<a href=\"https:\/\/docs.python.org\/3\/library\/argparse.html\"><u>https:\/\/docs.python.org\/3\/library\/argparse.html<\/u><\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439 help \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0430 <code>-h<\/code>.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u043a\u0438:<\/p>\n<pre><code class=\"python\">```bash helmfile_template -h usage: helmfile_template [-h] [-v] [-g] [-s PROJECT_NAME] [-p] [--no-production] [-n NAMESPACE] [-u] [--no-unified]                         [-m] [--no-migration]   Get helmfile templates.   options:  -h, --help            show this help message and exit  -v, --version         show program's version number and exit  -g, --get-help        get templates  -s PROJECT_NAME, --name PROJECT_NAME  -p, --production      use deploy repository  --no-production       use deploy repository  -n NAMESPACE, --namespace NAMESPACE  -u, --unified         use unified helmchart  --no-unified          don't use unified helmchart  -m, --migration       use migration  --no-migration        don't use migration ```<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435:<\/p>\n<pre><code class=\"python\">```bash $ helmfile_template ****************************** \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430: slurm ****************************** ****************************** 1. deploy 2. qa-deploy \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 (default: 2): 2 ****************************** \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c unified? (y\/n) (default: n): y ****************************** \u041d\u0443\u0436\u043d\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438? (y\/n) (default: n): n \u041f\u0440\u043e\u0435\u043a\u0442 slurm \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0432 \u043f\u0430\u043f\u043a\u0435 \/Users\/&lt;my_user>\/&lt;some_path>\/qa-deploy. ```<\/code><\/pre>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">```bash $ helmfile_template -s slurm --no-production -u --no-migration \u041f\u0440\u043e\u0435\u043a\u0442 slurm \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0432 \u043f\u0430\u043f\u043a\u0435 \/Users\/&lt;my_user>\/&lt;some_path>\/qa-deploy. ```<\/code><\/pre>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/h2>\n<p>\u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"python\">``` slurm \u251c\u2500\u2500 helmfile.yaml \u2514\u2500\u2500 values    \u251c\u2500\u2500 app.yaml.gotmpl    \u251c\u2500\u2500 common.yaml.gotmpl    \u251c\u2500\u2500 job.yaml.gotmpl    \u2514\u2500\u2500 override ```<\/code><\/pre>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>helmfile.yaml<\/code>:<\/p>\n<pre><code class=\"python\">```yaml {{ tpl (readFile \"..\/_helmfile.d\/environments.tmpl\") . }} --- environments:  default:    values:      - releaseName: \"slurm\" --- {{ tpl (readFile \"..\/_helmfile.d\/templates.tmpl\") . }} {{ tpl (readFile \"..\/_helmfile.d\/bases.yaml\") . }} releases: - &lt;&lt;: *unified  labels:    type: app # - &lt;&lt;: *unified #   name: {{ .Values.releaseName }}-{{`{{ .Release.Labels.type }}`}} #   labels: #     type: job #   needs: #     - \"pgsql-{{ .Values.releaseName }}\" #     - \"{{ .Values.releaseName }}-mysql\" #     - \"{{ .Values.releaseName }}-es\" #     - \"{{ .Values.releaseName }}-kafka\" #     - \"{{ .Values.releaseName }}-rabbitmq\" #     - \"{{ .Values.releaseName }}-redis\" #     - \"{{ .Values.releaseName }}-webdav\" #     - \"{{ .Values.releaseName }}-saml\" # - &lt;&lt;: *pgsql # - &lt;&lt;: *mysql # - &lt;&lt;: *elastic # - &lt;&lt;: *kafka # - &lt;&lt;: *rabbitmq # - &lt;&lt;: *redis-standalone # - &lt;&lt;: *redis-sentinel # - &lt;&lt;: *webdav # - &lt;&lt;: *saml ```<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0443 slurm \u043d\u0443\u0436\u043d\u044b pgsql, kafka \u0438 saml. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0442\u043e\u0432 \u043a \u0434\u0435\u043f\u043b\u043e\u044e:<\/p>\n<pre><code class=\"python\">```yaml {{ tpl (readFile \"..\/_helmfile.d\/environments.tmpl\") . }} --- environments:  default:    values:      - releaseName: \"slurm\" --- {{ tpl (readFile \"..\/_helmfile.d\/templates.tmpl\") . }} {{ tpl (readFile \"..\/_helmfile.d\/bases.yaml\") . }} releases: - &lt;&lt;: *unified  labels:    type: app  needs:    - \"pgsql-{{ .Values.releaseName }}\"    - \"{{ .Values.releaseName }}-kafka\"    - \"{{ .Values.releaseName }}-saml\"   - &lt;&lt;: *pgsql   - &lt;&lt;: *kafka   - &lt;&lt;: *saml ```<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u044b\u0440\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0438 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 Roadmap \u043f\u043e \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u0430\u043a\u0441\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u043e \u0441\u0435\u0431\u0435 \u0438 \u043e \u043a\u0443\u0440\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0443\u0447\u0430\u043b:<\/p>\n<p>\u00ab\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044f \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0441\u044c \u0434\u0430\u0432\u043d\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0441 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u041d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0433\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043c\u043e\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0439\u0442\u0438 \u043d\u0430 \u043a\u0443\u0440\u0441 <a href=\"https:\/\/slurm.club\/3WmJ1bY\"><strong>Python \u0434\u043b\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432<\/strong><\/a>, \u0438 \u043e\u043d \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043f\u0440\u0438\u0434\u0430\u043b \u043c\u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0441\u0438\u043b\u0430\u0445.<\/p>\n<p>\u042f \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \/ \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u041f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043e\u043f\u044b\u0442 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0431\u043e\u043b\u044c\u0448\u0435 100 \u0441\u0442\u0440\u043e\u043a, \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u041e\u041e\u041f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 Ansible \u043c\u043e\u0434\u0443\u043b\u044c \u0438 Prometheus Exporter. \u0427\u0435\u0433\u043e \u0434\u0430\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b, \u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u0437\u043d\u0430\u043d\u0438\u0439.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0443\u0440\u0441\u0430. \u042f \u0442\u0440\u0430\u0442\u0438\u043b 8\u201312 \u0447\u0430\u0441\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u00ab\u043a\u0443\u0440\u0441\u043e\u0432\u0443\u044e\u00bb \u0440\u0430\u0431\u043e\u0442\u0443,<\/p>\n<\/div>\n<\/details>\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-342702","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/342702","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=342702"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/342702\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=342702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=342702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=342702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}