{"id":459789,"date":"2025-05-15T15:01:03","date_gmt":"2025-05-15T15:01:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=459789"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=459789","title":{"rendered":"<span>\u041a\u0430\u043a \u0437\u0430\u043f\u0438\u043b\u0438\u0442\u044c \u0433\u043e\u0434\u043d\u0443\u044e \u0440\u043e\u043b\u044e\u0445\u0443 \u0432 Ansible<\/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>\u0413\u0430\u0439\u0434\u043e\u0432 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e &#8212; \u043a\u0443\u0447\u0430. \u0412\u0441\u0435 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0439\u0442\u0438 &#8212; \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u043d\u0435 \u0431\u0443\u0434\u0443. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u0438 \u0448\u0438\u0448\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0440\u043e\u043b\u0435\u0439 Ansible. <\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#%D1%82%D0%B5%D0%B3%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u00a0\u0442\u0435\u0433\u0438<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"#no_log\" rel=\"noopener noreferrer nofollow\">\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 Ansible:\u00a0no_log: true.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D1%80%D0%B5%D1%80%D0%B5%D0%BA%D0%B2%D0%B8%D0%B7%D0%B8%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 Ansible (block\/rescue).<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B8%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u0440\u043e\u043b\u044c &#8212; \u0432\u044b\u0441\u0442\u0440\u0435\u043b \u0432 \u043d\u043e\u0433\u0443.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041d\u0435 \u043b\u0435\u043d\u0438\u0441\u044c &#8212; \u043f\u0438\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u0438.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#handlers\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043c\u043d\u0438 \u043e \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#readme\" rel=\"noopener noreferrer nofollow\">\u0425\u043e\u0447\u0435\u0448\u044c \u043c\u0438\u0440\u0430 &#8212; \u043f\u0438\u0448\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#test\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u0432 Ansible<\/h2>\n<p>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u0440\u043e\u043b\u044c Ansible \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c\u00a0<strong>\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439, \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439<\/strong>. \u0412\u043e\u0442 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0438:<\/p>\n<h3>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0440\u043e\u043b\u0438<\/h3>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 \u0441\u0432\u043e\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u0432\u0435\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 &#171;\u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u043e\u043b\u044c&#187;?<\/p>\n<ul>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0438\u0441 (Nginx, PostgreSQL, Docker \u0438 \u0442. \u0434.).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>sysctl<\/code>,\u00a0<code>limits.conf<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, WordPress, Prometheus).<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0438 \u043f\u0440. \u0438 \u0434\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Nginx + \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0411\u0414).<\/p>\n<h3>\u041d\u044e\u0430\u043d\u0441\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u044e\u0445\u0438.<\/h3>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 (<code>include_tasks<\/code>) \u0438 <a href=\"#%D1%82%D0%B5%D0%B3%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<strong>\u0442\u0435\u0433\u0438 <\/strong><\/a><strong>(<\/strong><code><strong>tags<\/strong><\/code><strong>)<\/strong>\u00a0\u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"#no_log\" rel=\"noopener noreferrer nofollow\">\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 Ansible:\u00a0no_log: true.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D1%80%D0%B5%D1%80%D0%B5%D0%BA%D0%B2%D0%B8%D0%B7%D0%B8%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0438 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430,\u00a0<strong>\u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/strong>\u00a0(\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435) \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441\u00a0<strong>\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u0438\u043c\u0435\u043d\u0438 \u0440\u043e\u043b\u0438<\/strong>. <\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 Ansible (block\/rescue).<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B8%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u0440\u043e\u043b\u044c &#8212; \u0432\u044b\u0441\u0442\u0440\u0435\u043b \u0432 \u043d\u043e\u0433\u0443.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041d\u0435 \u043b\u0435\u043d\u0438\u0441\u044c &#8212; \u043f\u0438\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u0438.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#handlers\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043c\u043d\u0438 \u043e \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#readme\" rel=\"noopener noreferrer nofollow\">\u0425\u043e\u0447\u0435\u0448\u044c \u043c\u0438\u0440\u0430 &#8212; \u043f\u0438\u0448\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#test\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">--- - name: Check variables   include_tasks:     file: pre_task.yml     apply:       tags: always   tags: always  - name: Install Nginx   apt:     name: nginx     state: present   tags: install  - name: Copy Nginx config   template:     src: nginx.conf.j2     dest: \/etc\/nginx\/nginx.conf   notify: restart nginx   tags: config  - name: Flush handlers at end   meta: flush_handlers   tags: always<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D1%82%D0%B5%D0%B3%D0%B8\" id=\"\u0442\u0435\u0433\u0438\"><\/a><\/p>\n<h3>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043f\u043e \u0442\u0435\u0433\u0430\u043c<\/h3>\n<p>\u0422\u0435\u0433\u0438 &#8212; \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. <\/p>\n<ul>\n<li>\n<p><strong>\u0422\u0435\u0433\u0438<\/strong>\u00a0\u0434\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u044d\u0442\u0430\u043f\u0430\u043c\u0438:\u00a0<code>install|update|config|certs|remove<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447<\/strong>, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0422\u0435\u0433\u00a0<code>remove<\/code>\u00a0\u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u0435\u0442 \u0441\u00a0<code>install<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c<\/strong>: \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c (<code>deploy = install + config + certs<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0435\u0433\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"261\" width=\"261\">\n<p align=\"left\">\u0422\u0435\u0433<\/p>\n<\/th>\n<th data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>install<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u041f\u041e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>update<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>config<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>certs<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 TLS\/SSL<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>remove, never<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041f\u043e\u043b\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u041f\u041e<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e (apply) \u0442\u0435\u0433\u043e\u0432, \u0442\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0440\u043e\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432 <em>dryrun (check_mode) <\/em>\u043f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0433\u043e\u0432. <em> <\/em>\u0415\u0441\u043b\u0438 \u043b\u0435\u043d\u0438\u0432\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u0430\u0441\u043a\u0443 \u0442\u0435\u0433\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"yaml\">- name: Check variables   include_tasks:     file: pre_task.yml     apply:       tags: check # \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0435\u0433 \u043a\u043e \u0432\u0441\u0435\u043c \u0442\u0430\u0441\u043a\u0430\u043c \u0432 \u0444\u0430\u0439\u043b\u0435   tags: check<\/code><\/pre>\n<p><strong>\u0418\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/strong><\/p>\n<pre><code class=\"bash\">my_app\/   \u251c\u2500\u2500 tasks\/   \u2502   \u251c\u2500\u2500 install.yml   \u2502   \u251c\u2500\u2500 update.yml   \u2502   \u251c\u2500\u2500 config.yml   \u2502   \u251c\u2500\u2500 certs.yml   \u2502   \u251c\u2500\u2500 remove.yml   \u2502   \u2514\u2500\u2500 main.yml  # \u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u0442\u0435\u0433\u0430\u043c\u0438  <\/code><\/pre>\n<p><a class=\"anchor\" name=\"no_log\" id=\"no_log\"><\/a><\/p>\n<h3>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 Ansible:\u00a0no_log: true<\/h3>\n<p>\u0414\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0430\u0440\u043e\u043b\u0438, \u043a\u043b\u044e\u0447\u0438, \u0442\u043e\u043a\u0435\u043d\u044b) \u0432 \u043b\u043e\u0433\u0430\u0445 Ansible \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<code><strong>no_log: true<\/strong><\/code>. \u042d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0432:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434<\/p>\n<\/li>\n<li>\n<p>\u0424\u0430\u0439\u043b\u044b \u043b\u043e\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<pre><code class=\"yaml\"># \u0414\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 - name: Set database password   ansible.builtin.lineinfile:     path: \/etc\/app.conf     line: \"DB_PASSWORD={{ db_password }}\"   no_log: true  # \u2190 \u0412\u0430\u0436\u043d\u043e!  # \u0414\u043b\u044f \u0446\u0435\u043b\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 - name: Secrets handling block   block:     - name: Create API key       ansible.builtin.command: generate-key.sh       register: api_key_result            - name: Deploy key to vault       ansible.builtin.uri:         url: \"https:\/\/vault.example.com\"         body: \"{{ api_key_result.stdout }}\"   no_log: true  # \u0421\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0412\u0415\u0421\u042c \u0432\u044b\u0432\u043e\u0434 \u0431\u043b\u043e\u043a  # \u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u043a\u0440\u0435\u0442: - name: Configure secret token   ansible.builtin.template:     src: token.j2     dest: \/etc\/secrets\/token   vars:     secret_token: \"{{ vaulted_token }}\"  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u0437 vault   no_log: true  # \u0414\u043b\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 (register): - name: Get sensitive data   ansible.builtin.command: decrypt.sh   register: decrypted_data   no_log: true  - name: Use secured data   debug:     msg: \"Data processed successfully\"   when: decrypted_data.rc == 0  # \u0414\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 uri): - name: Auth request   ansible.builtin.uri:     url: \"https:\/\/api.example.com\/login\"     body:       username: admin       password: \"{{ vaulted_pass }}\"   no_log: true  # \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0441 Ansible Vault: vars:   db_password: !vault |     $ANSIBLE_VAULT;1.1;AES256     643865...  # \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0441 Hashicorp Vault vars:   msql_password: \"{{ lookup('community.hashi_vault.hashi_vault', 'secret=secret\/data\/hello token=my_vault_token url=http:\/\/myvault_url:8200') }}\"<\/code><\/pre>\n<h3>\u041a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u0443?<\/h3>\n<ol>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a \u0441\u00a0<code>-vvv<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u043d\u0435\u0442:<\/p>\n<pre><code>- \"Changed\": true, \"DB_PASSWORD\": \"s3cr3t\" + \"output\": \"********\"<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"%D0%BF%D1%80%D0%B5%D1%80%D0%B5%D0%BA%D0%B2%D0%B8%D0%B7%D0%B8%D1%82%D1%8B\" id=\"\u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u044b\"><\/a><\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0432\u00a0pre_tasks<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u043e\u043b\u0438, \u0432\u0441\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f\u00a0<strong>\u0434\u043e<\/strong>\u00a0\u0435\u0451 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>pre_tasks<\/code>\u00a0\u0432 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0435 tasks\/main.yml.<\/p>\n<pre><code class=\"yaml\">--- - name: \"1. Check OS compatibility (Ubuntu\/Debian)\"   ansible.builtin.fail:     msg: \"Unsupported OS. Required: Ubuntu\/Debian\"   when: ansible_facts['distribution'] not in ['Ubuntu', 'Debian']  - name: \"2. Verify free disk space &gt; 1GB\"   ansible.builtin.command: df -BG \/   register: disk_space   changed_when: false   failed_when:     - disk_space.rc != 0     or (disk_space.stdout | regex_search('\\\\d+G')) | int &lt; 1  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u0442\u043e\u0432 - name: \"3. Check ports 80\/443 are available\"   ansible.builtin.wait_for:     port: \"{{ item }}\"     state: stopped     timeout: 1   loop: [80, 443]   ignore_errors: true   register: ports_check   failed_when: ports_check.results | selectattr('failed') | list | length &gt; 0  # \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430) - name: \"Ensure curl is installed\"   apt:     name: curl     state: present  # \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 - name: \"Fail if Docker not found\"   ansible.builtin.command: docker --version   register: docker_check   failed_when: docker_check.rc != 0   # \u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f - name: \"Warn about low RAM\"   ansible.builtin.debug:     msg: \"Recommended: 4GB RAM (found {{ ansible_memtotal_mb }}MB)\"   changed_when: false   when: ansible_memtotal_mb &lt; 4096<\/code><\/pre>\n<h4>\u041d\u044e\u0430\u043d\u0441\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/h4>\n<ol>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0<code>fail<\/code>, \u0430 \u043d\u0435\u00a0<code>assert<\/code>\u00a0\u0434\u043b\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c\u00a0<code>changed_when: false<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f &#171;\u0442\u044f\u0436\u0435\u043b\u044b\u0445&#187; \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435\u00a0<code>run_once: true<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0432\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u00a0<a href=\"http:\/\/README.md\" rel=\"noopener noreferrer nofollow\"><code>README.md<\/code><\/a><\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0418\u0442\u043e\u0433:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0420\u043e\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0442\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 &#171;\u0442\u0438\u0445\u0438\u0445&#187; \u0441\u0431\u043e\u0435\u0432 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA\" id=\"\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430_\u043e\u0448\u0438\u0431\u043e\u043a\"><\/a><\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 Ansible (block\/rescue)<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u043e\u043b\u044c\u00a0<strong>\u043d\u0435 \u043f\u0430\u0434\u0430\u043b\u0430<\/strong>\u00a0\u043f\u0440\u0438 \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u043a\u0443\u00a0<code><strong>block<\/strong><\/code><strong>\u00a0+\u00a0<\/strong><code><strong>rescue<\/strong><\/code>.<br \/>\u042d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u00a0<code>try\/catch<\/code>\u00a0\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b\u00a0<strong>\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433<\/strong>\u00a0\u0438\u00a0<strong>\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441<\/strong>, \u043d\u043e \u0445\u043e\u0442\u0438\u043c:<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/strong>, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u043d\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443<\/strong>\u00a0\u0432 \u043b\u043e\u0433, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0440\u043e\u043b\u044c.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"yaml\">--- - name: Critical operations block   block:     - name: Task 1 - Copy config       ansible.builtin.template:         src: config.j2         dest: \/etc\/app\/config.conf       register: taskresult       notify: restart app      - name: Task 2 - Validate config       ansible.builtin.command: app --validate       register: taskresult       changed_when: false    rescue:     - name: Add error to list       set_fact:         role_errors: \"{{ role_errors | default([]) + [{           'task': ansible_failed_task.name,           'error': ansible_failed_result.msg         }] }}\"      - name: Continue execution       meta: continue  - name: Print all errors (if any)   ansible.builtin.debug:     var: role_errors   failed_when: role_errors | length &gt; 0<\/code><\/pre>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/h4>\n<ol>\n<li>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a (block)<\/strong><\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u00a0<code>taskresult<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 &#8212; \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u00a0<code>rescue<\/code><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (rescue)<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (<code>meta: continue<\/code>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0448\u0438\u0431\u043e\u043a (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c) \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c \u0432\u044b\u0434\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445:<\/h4>\n<pre><code class=\"json\">\"role_errors\": [   {     \"task\": \"Task 2 - Validate config\",     \"error\": \"Command 'app --validate' returned 1: ERROR: Invalid config\"   } ]<\/code><\/pre>\n<h4>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/h4>\n<ol>\n<li>\n<p><strong>\u041f\u043e\u043b\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/strong>\u00a0&#8212; \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u043f\u0430\u043b\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434<\/strong>\u00a0&#8212; \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c<\/strong>\u00a0&#8212; \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f (\u0432\u0440\u0435\u043c\u044f, \u0445\u043e\u0441\u0442 \u0438 \u0442.\u0434.)<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 <\/strong>&#8212; \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"%D0%98%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" id=\"\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\"><\/a><\/p>\n<h3>\u041d\u0435\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u0440\u043e\u043b\u044c &#8212; \u0432\u044b\u0441\u0442\u0440\u0435\u043b \u0432 \u043d\u043e\u0433\u0443<\/h3>\n<p>\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043a Ansible-\u0440\u043e\u043b\u044f\u043c. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e:<br \/>\u2714 \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0440\u043e\u043b\u0438\u00a0<strong>\u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/strong><br \/>\u2714 \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u00a0<strong>\u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/strong><\/p>\n<p>\u041a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438?<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 Ansible\u00a0<strong>\u0443\u0436\u0435 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b<\/strong>\u00a0(apt, yum, template \u0438 \u0434\u0440.). \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 (<strong>\u0414\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/strong>\u00a0(<code>command<\/code>,\u00a0<code>shell<\/code>,\u00a0<code>raw<\/code>) \u0432\u0441\u0435\u0433\u0434\u0430) \u043d\u0443\u0436\u043d\u043e \u0440\u0443\u0447\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437:<\/p>\n<ul>\n<li>\n<p>changed_when: false  # \u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 &#171;ok&#187; (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u043b)<\/p>\n<\/li>\n<li>\n<p>changed_when: \u0443\u0441\u043b\u043e\u0432\u0438\u0435  # \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0434\u043b\u044f &#171;changed&#187;<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"yaml\"># \u041a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - name: Check service stataus   command: systemctl is-active nginx   register: nginx_status   changed_when: false  # \u2190 \u041d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \"ok\"    - name: Force reload (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e)   command: systemctl reload nginx   when: nginx_status.stdout != \"active\"  # \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 - name: Apply config if changed   template:     src: app.conf.j2     dest: \/etc\/app.conf   register: config_result   changed_when: config_result.changed  # \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 (\u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c)  # \u0423\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \"changed\" \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 - name: Run database migration   command: \/opt\/app\/migrate.py   register: migration_result   changed_when:      - \"'Success' in migration_result.stdout\"  # \u2190 \"changed\" \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0445\u0435     - migration_result.rc == 0  # \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0441\u00a0always_run - name: Validate config (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u0434\u0430)   command: validate_config.sh   changed_when: false   check_mode: no   always_run: yes  # \u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 (handlers) handlers\/main.yml: - name: migrate app   command: \/opt\/app\/migrate.py   changed_when: false  # \u2190 \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \"changed\" \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435  # \u0414\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0failed_when\u00a0\u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u00a0changed_when: - name: Check license   command: check_license.sh   register: license_check   changed_when: false   failed_when:      - license_check.rc != 0     - \"'Expired' in license_check.stdout\"<\/code><\/pre>\n<h4>\u041a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/h4>\n<ul>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0440\u043e\u043b\u044c \u0434\u0432\u0430\u0436\u0434\u044b<\/p>\n<\/li>\n<li>\n<p>ansible-playbook playbook.yml &amp;&amp; ansible-playbook playbook.yml<\/p>\n<\/li>\n<li>\n<p>\u0418\u0449\u0438\u0442\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u00a0<code>changed=1<\/code>\u00a0\u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u2014 \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0438 \u043d\u0435\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8\" id=\"\u043c\u043e\u0434\u0443\u043b\u0438\"><\/a><\/p>\n<h3>\u0412\u044b\u043d\u043e\u0441 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 Ansible<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432 \u0440\u043e\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f\u00a0<strong>\u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 API<\/strong>, \u0438\u0445 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0432\u00a0<strong>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438<\/strong>. \u042d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c (\u043c\u043e\u0434\u0443\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 Python)<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u043c\u043e\u0434\u0443\u043b\u044c?<\/p>\n<ol>\n<li>\n<p><strong>\u0421\u043b\u043e\u0436\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f &#8212; <\/strong>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 JSON\/XML, \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\/\u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 API &#8212; <\/strong>\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043a Kubernetes, AWS, Database<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f &#8212; <\/strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 &#8212; <\/strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c<\/p>\n<pre><code class=\"bash\">roles\/   \u2514\u2500\u2500 my_role\/       \u251c\u2500\u2500 library\/          # \u0421\u044e\u0434\u0430 \u043a\u043b\u0430\u0434\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0438       \u2502   \u2514\u2500\u2500 cert_validator.py       \u251c\u2500\u2500 tasks\/       \u2502   \u2514\u2500\u2500 main.yml       \u2514\u2500\u2500 defaults\/           \u2514\u2500\u2500 main.yml  <\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0443\u043b\u044f (<code>library\/cert_validator.py<\/code>):<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python3  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0AnsibleModule from ansible.module_utils.basic import AnsibleModule import OpenSSL.crypto from datetime import datetime  # \u041f\u0438\u0448\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043a \u043c\u043e\u0434\u0443\u043b\u044e DOCUMENTATION = r''' module: cert_validator description: Check SSL certificate expiry options:   cert_path:     description: Path to PEM certificate     required: true     type: str '''  def check_cert(cert_path):     # \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438     try:         with open(cert_path, 'rb') as f:             cert = OpenSSL.crypto.load_certificate(                 OpenSSL.crypto.FILETYPE_PEM, f.read()             )         expiry_date = datetime.strptime(             cert.get_notAfter().decode('utf-8'), '%Y%m%d%H%M%SZ'         )         return {             'valid': datetime.now() &lt; expiry_date,             'expiry_date': expiry_date.isoformat()         }     except Exception as e:         return {'error': str(e)}  def main():     module = AnsibleModule(         argument_spec=dict(             cert_path=dict(type='str', required=True)         )     )     result = check_cert(module.params['cert_path'])     if 'error' in result:         module.fail_json(msg=result['error'])     module.exit_json(**result)  if __name__ == '__main__':     main()<\/code><\/pre>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u0432 \u0440\u043e\u043b\u0438<\/h3>\n<pre><code class=\"yaml\">--- - name: Validate SSL certificate     cert_validator:       cert_path: \"{{ nginx__ssl_cert }}\"     register: cert_check    - name: Fail if cert invalid     ansible.builtin.fail:       msg: \"Certificate expires on {{ cert_check.expiry_date }}\"     when: not cert_check.valid  <\/code><\/pre>\n<h3>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430<\/h3>\n<ul>\n<li>\n<p><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c &#8212; <\/strong>\u041c\u043e\u0434\u0443\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f\u00a0<strong>1 \u0440\u0430\u0437<\/strong>\u00a0(\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0<code>command<\/code>\/<code>shell<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c &#8212; <\/strong>\u041d\u0435\u0442 \u0440\u0438\u0441\u043a\u0430 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0441\u044b\u0440\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434).<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c &#8212; <\/strong>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\u00a0<code>changed<\/code>\/<code>failed<\/code>\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c &#8212; <\/strong>\u041c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0440\u043e\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/h3>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e<\/p>\n<pre><code class=\"bash\">python library\/cert_validator.py '{\"cert_path\":\"\/tmp\/cert.pem\"}'<\/code><\/pre>\n<\/li>\n<\/ul>\n<h4>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u2014 \u044d\u0442\u043e overkill, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435:<\/p>\n<ol>\n<li>\n<p><code><strong>ansible.builtin.script<\/strong><\/code><\/p>\n<pre><code class=\"yaml\">- name: Run validation script   ansible.builtin.script:     cmd: scripts\/validate_cert.sh {{ cert_path }}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u0424\u0438\u043b\u044c\u0442\u0440\u044b Jinja2<\/strong><\/p>\n<pre><code class=\"yaml\">- set_fact:     is_valid: \"{{ cert_data | regex_search('VALID') }}\"<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"handlers\" id=\"handlers\"><\/a><\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 (handlers\/main.yml)<\/h3>\n<p><strong>\u0425\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u2013 \u044d\u0442\u043e &#171;\u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438&#187;<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445<\/strong>\u00a0(\u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u00a0<code>notify<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437<\/strong>, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0445 \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439<\/strong>\u00a0(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430).  <\/p>\n<\/li>\n<\/ul>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b?<\/h4>\n<ul>\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/strong> \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/strong> \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0435\u043c\u043e\u043d\u043e\u0432<\/strong>\u00a0\u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439<\/strong>\u00a0(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0447\u0442\u0443 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445).<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u044c \u0432 \u043a\u043e\u043d\u0435\u0446 \u0440\u043e\u043b\u0438<\/p>\n<pre><code class=\"yaml\">- name: Flush handlers at end   meta: flush_handlers   tags: always<\/code><\/pre>\n<p><a class=\"anchor\" name=\"readme\" id=\"readme\"><\/a><\/p>\n<h3>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Ansible-\u0440\u043e\u043b\u0438 (README.md)<\/h3>\n<p>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u0431\u0440\u0430\u0442\u044c\u044f\u043c-\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u044c (\u0438 \u043d\u0435 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u043a \u0442\u0435\u0431\u0435 \u0441 \u0433\u043b\u0443\u043f\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u044f \u043e\u0442 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u043e \u0432\u0435\u0447\u043d\u043e\u043c). \u0412\u043e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u00a0<code>README.md<\/code>:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0438<\/p>\n<\/li>\n<li>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u0433\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p> \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u00a0defaults\/main.yml<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"test\" id=\"test\"><\/a><\/p>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0438<\/h3>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439 Ansible \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0442\u0430\u043a \u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 (standalone) \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u043e\u043b\u0435\u0439 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0438 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.<br \/>\u0415\u0441\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0435 \u0440\u043e\u043b\u0435\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c (\u043c\u0435\u0440\u0436\u0435\u043c) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Molecule \u0438 <strong>\u044f\u0432\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b<\/strong>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0447\u0442\u043e \u0440\u043e\u043b\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.  <\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u044b\u0448\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0412\u0430\u043c \u0432 \u0442\u0440\u0443\u0434\u043e\u0432\u044b\u0435\u0431\u0443\u0434\u043d\u044f\u0445.<\/p>\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\/909636\/\"> https:\/\/habr.com\/ru\/articles\/909636\/<\/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>\u0413\u0430\u0439\u0434\u043e\u0432 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e &#8212; \u043a\u0443\u0447\u0430. \u0412\u0441\u0435 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0439\u0442\u0438 &#8212; \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u043d\u0435 \u0431\u0443\u0434\u0443. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u0438 \u0448\u0438\u0448\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0440\u043e\u043b\u0435\u0439 Ansible. <\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#%D1%82%D0%B5%D0%B3%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u00a0\u0442\u0435\u0433\u0438<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"#no_log\" rel=\"noopener noreferrer nofollow\">\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 Ansible:\u00a0no_log: true.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D1%80%D0%B5%D1%80%D0%B5%D0%BA%D0%B2%D0%B8%D0%B7%D0%B8%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 Ansible (block\/rescue).<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B8%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u0440\u043e\u043b\u044c &#8212; \u0432\u044b\u0441\u0442\u0440\u0435\u043b \u0432 \u043d\u043e\u0433\u0443.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041d\u0435 \u043b\u0435\u043d\u0438\u0441\u044c &#8212; \u043f\u0438\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u0438.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#handlers\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043c\u043d\u0438 \u043e \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#readme\" rel=\"noopener noreferrer nofollow\">\u0425\u043e\u0447\u0435\u0448\u044c \u043c\u0438\u0440\u0430 &#8212; \u043f\u0438\u0448\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#test\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u0432 Ansible<\/h2>\n<p>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u0440\u043e\u043b\u044c Ansible \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c\u00a0<strong>\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439, \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439<\/strong>. \u0412\u043e\u0442 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0438:<\/p>\n<h3>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0440\u043e\u043b\u0438<\/h3>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 \u0441\u0432\u043e\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u0432\u0435\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 &#171;\u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u043e\u043b\u044c&#187;?<\/p>\n<ul>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0438\u0441 (Nginx, PostgreSQL, Docker \u0438 \u0442. \u0434.).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>sysctl<\/code>,\u00a0<code>limits.conf<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, WordPress, Prometheus).<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0438 \u043f\u0440. \u0438 \u0434\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Nginx + \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0411\u0414).<\/p>\n<h3>\u041d\u044e\u0430\u043d\u0441\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u044e\u0445\u0438.<\/h3>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 (<code>include_tasks<\/code>) \u0438 <a href=\"#%D1%82%D0%B5%D0%B3%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<strong>\u0442\u0435\u0433\u0438 <\/strong><\/a><strong>(<\/strong><code><strong>tags<\/strong><\/code><strong>)<\/strong>\u00a0\u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"#no_log\" rel=\"noopener noreferrer nofollow\">\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 Ansible:\u00a0no_log: true.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D1%80%D0%B5%D1%80%D0%B5%D0%BA%D0%B2%D0%B8%D0%B7%D0%B8%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0438 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430,\u00a0<strong>\u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/strong>\u00a0(\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435) \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441\u00a0<strong>\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u0438\u043c\u0435\u043d\u0438 \u0440\u043e\u043b\u0438<\/strong>. <\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 Ansible (block\/rescue).<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B8%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u0440\u043e\u043b\u044c &#8212; \u0432\u044b\u0441\u0442\u0440\u0435\u043b \u0432 \u043d\u043e\u0433\u0443.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041d\u0435 \u043b\u0435\u043d\u0438\u0441\u044c &#8212; \u043f\u0438\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u0438.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#handlers\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043c\u043d\u0438 \u043e \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430\u0445.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#readme\" rel=\"noopener noreferrer nofollow\">\u0425\u043e\u0447\u0435\u0448\u044c \u043c\u0438\u0440\u0430 &#8212; \u043f\u0438\u0448\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#test\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"yaml\">--- - name: Check variables   include_tasks:     file: pre_task.yml     apply:       tags: always   tags: always  - name: Install Nginx   apt:     name: nginx     state: present   tags: install  - name: Copy Nginx config   template:     src: nginx.conf.j2     dest: \/etc\/nginx\/nginx.conf   notify: restart nginx   tags: config  - name: Flush handlers at end   meta: flush_handlers   tags: always<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D1%82%D0%B5%D0%B3%D0%B8\" id=\"\u0442\u0435\u0433\u0438\">\u0438&#187;><\/a><\/p>\n<h3>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043f\u043e \u0442\u0435\u0433\u0430\u043c<\/h3>\n<p>\u0422\u0435\u0433\u0438 &#8212; \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. <\/p>\n<ul>\n<li>\n<p><strong>\u0422\u0435\u0433\u0438<\/strong>\u00a0\u0434\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u044d\u0442\u0430\u043f\u0430\u043c\u0438:\u00a0<code>install|update|config|certs|remove<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447<\/strong>, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0422\u0435\u0433\u00a0<code>remove<\/code>\u00a0\u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u0435\u0442 \u0441\u00a0<code>install<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c<\/strong>: \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c (<code>deploy = install + config + certs<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0435\u0433\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"261\" width=\"261\">\n<p align=\"left\">\u0422\u0435\u0433<\/p>\n<\/th>\n<th data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>install<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u041f\u041e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>update<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>config<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>certs<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 TLS\/SSL<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"261\" width=\"261\">\n<p align=\"left\"><code>remove, never<\/code><\/p>\n<\/td>\n<td data-colwidth=\"305\" width=\"305\">\n<p align=\"left\">\u041f\u043e\u043b\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u041f\u041e<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e (apply) \u0442\u0435\u0433\u043e\u0432, \u0442\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0440\u043e\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432 <em>dryrun (check_mode) <\/em>\u043f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0433\u043e\u0432. <em> <\/em>\u0415\u0441\u043b\u0438 \u043b\u0435\u043d\u0438\u0432\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u0430\u0441\u043a\u0443 \u0442\u0435\u0433\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"yaml\">- name: Check variables   include_tasks:     file: pre_task.yml     apply:       tags: check # \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0435\u0433 \u043a\u043e \u0432\u0441\u0435\u043c \u0442\u0430\u0441\u043a\u0430\u043c \u0432 \u0444\u0430\u0439\u043b\u0435   tags: check<\/code><\/pre>\n<p><strong>\u0418\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/strong><\/p>\n<pre><code class=\"bash\">my_app\/   \u251c\u2500\u2500 tasks\/   \u2502   \u251c\u2500\u2500 install.yml   \u2502   \u251c\u2500\u2500 update.yml   \u2502   \u251c\u2500\u2500 config.yml   \u2502   \u251c\u2500\u2500 certs.yml   \u2502   \u251c\u2500\u2500 remove.yml   \u2502   \u2514\u2500\u2500 main.yml  # \u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u0442\u0435\u0433\u0430\u043c\u0438  <\/code><\/pre>\n<p><a class=\"anchor\" name=\"no_log\" id=\"no_log\"><\/a><\/p>\n<h3>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 Ansible:\u00a0no_log: true<\/h3>\n<p>\u0414\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0430\u0440\u043e\u043b\u0438, \u043a\u043b\u044e\u0447\u0438, \u0442\u043e\u043a\u0435\u043d\u044b) \u0432 \u043b\u043e\u0433\u0430\u0445 Ansible \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<code><strong>no_log: true<\/strong><\/code>. \u042d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0432:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434<\/p>\n<\/li>\n<li>\n<p>\u0424\u0430\u0439\u043b\u044b \u043b\u043e\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<pre><code class=\"yaml\"># \u0414\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 - name: Set database password   ansible.builtin.lineinfile:     path: \/etc\/app.conf     line: \"DB_PASSWORD={{ db_password }}\"   no_log: true  # \u2190 \u0412\u0430\u0436\u043d\u043e!  # \u0414\u043b\u044f \u0446\u0435\u043b\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 - name: Secrets handling block   block:     - name: Create API key       ansible.builtin.command: generate-key.sh       register: api_key_result            - name: Deploy key to vault       ansible.builtin.uri:         url: \"https:\/\/vault.example.com\"         body: \"{{ api_key_result.stdout }}\"   no_log: true  # \u0421\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0412\u0415\u0421\u042c \u0432\u044b\u0432\u043e\u0434 \u0431\u043b\u043e\u043a  # \u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u043a\u0440\u0435\u0442: - name: Configure secret token   ansible.builtin.template:     src: token.j2     dest: \/etc\/secrets\/token   vars:     secret_token: \"{{ vaulted_token }}\"  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u0437 vault   no_log: true  # \u0414\u043b\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 (register): - name: Get sensitive data   ansible.builtin.command: decrypt.sh   register: decrypted_data   no_log: true  - name: Use secured data   debug:     msg: \"Data processed successfully\"   when: decrypted_data.rc == 0  # \u0414\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 uri): - name: Auth request   ansible.builtin.uri:     url: \"https:\/\/api.example.com\/login\"     body:       username: admin       password: \"{{ vaulted_pass }}\"   no_log: true  # \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0441 Ansible Vault: vars:   db_password: !vault |     $ANSIBLE_VAULT;1.1;AES256     643865...  # \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0441 Hashicorp Vault vars:   msql_password: \"{{ lookup('community.hashi_vault.hashi_vault', 'secret=secret\/data\/hello token=my_vault_token url=http:\/\/myvault_url:8200') }}\"<\/code><\/pre>\n<h3>\u041a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u0443?<\/h3>\n<ol>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a \u0441\u00a0<code>-vvv<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u043d\u0435\u0442:<\/p>\n<pre><code>- \"Changed\": true, \"DB_PASSWORD\": \"s3cr3t\" + \"output\": \"********\"<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"%D0%BF%D1%80%D0%B5%D1%80%D0%B5%D0%BA%D0%B2%D0%B8%D0%B7%D0%B8%D1%82%D1%8B\" id=\"\u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u044b\">\u0438\u0437\u0438\u0442\u044b&#187;><\/a><\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432 \u0432\u00a0pre_tasks<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u043e\u043b\u0438, \u0432\u0441\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f\u00a0<strong>\u0434\u043e<\/strong>\u00a0\u0435\u0451 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>pre_tasks<\/code>\u00a0\u0432 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0435 tasks\/main.yml.<\/p>\n<pre><code class=\"yaml\">--- - name: \"1. Check OS compatibility (Ubuntu\/Debian)\"   ansible.builtin.fail:     msg: \"Unsupported OS. Required: Ubuntu\/Debian\"   when: ansible_facts['distribution'] not in ['Ubuntu', 'Debian']  - name: \"2. Verify free disk space &gt; 1GB\"   ansible.builtin.command: df -BG \/   register: disk_space   changed_when: false   failed_when:     - disk_space.rc != 0     or (disk_space.stdout | regex_search('\\\\d+G')) | int &lt; 1  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u0442\u043e\u0432 - name: \"3. Check ports 80\/443 are available\"   ansible.builtin.wait_for:     port: \"{{ item }}\"     state: stopped     timeout: 1   loop: [80, 443]   ignore_errors: true   register: ports_check   failed_when: ports_check.results | selectattr('failed') | list | length &gt; 0  # \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430) - name: \"Ensure curl is installed\"   apt:     name: curl     state: present  # \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 - name: \"Fail if Docker not found\"   ansible.builtin.command: docker --version   register: docker_check   failed_when: docker_check.rc != 0   # \u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f - name: \"Warn about low RAM\"   ansible.builtin.debug:     msg: \"Recommended: 4GB RAM (found {{ ansible_memtotal_mb }}MB)\"   changed_when: false   when: ansible_memtotal_mb &lt; 4096<\/code><\/pre>\n<h4>\u041d\u044e\u0430\u043d\u0441\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/h4>\n<ol>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0<code>fail<\/code>, \u0430 \u043d\u0435\u00a0<code>assert<\/code>\u00a0\u0434\u043b\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c\u00a0<code>changed_when: false<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f &#171;\u0442\u044f\u0436\u0435\u043b\u044b\u0445&#187; \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435\u00a0<code>run_once: true<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0432\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u00a0<a href=\"http:\/\/README.md\" rel=\"noopener noreferrer nofollow\"><code>README.md<\/code><\/a><\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0418\u0442\u043e\u0433:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0420\u043e\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0442\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 &#171;\u0442\u0438\u0445\u0438\u0445&#187; \u0441\u0431\u043e\u0435\u0432 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA\" id=\"\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430_\u043e\u0448\u0438\u0431\u043e\u043a\">_\u043e\u0448\u0438\u0431\u043e\u043a&#187;><\/a><\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 Ansible (block\/rescue)<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u043e\u043b\u044c\u00a0<strong>\u043d\u0435 \u043f\u0430\u0434\u0430\u043b\u0430<\/strong>\u00a0\u043f\u0440\u0438 \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u043a\u0443\u00a0<code><strong>block<\/strong><\/code><strong>\u00a0+\u00a0<\/strong><code><strong>rescue<\/strong><\/code>.<br \/>\u042d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u00a0<code>try\/catch<\/code>\u00a0\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b\u00a0<strong>\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433<\/strong>\u00a0\u0438\u00a0<strong>\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441<\/strong>, \u043d\u043e \u0445\u043e\u0442\u0438\u043c:<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/strong>, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u043d\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443<\/strong>\u00a0\u0432 \u043b\u043e\u0433, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0440\u043e\u043b\u044c.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"yaml\">--- - name: Critical operations block   block:     - name: Task 1 - Copy config       ansible.builtin.template:         src: config.j2         dest: \/etc\/app\/config.conf       register: taskresult       notify: restart app      - name: Task 2 - Validate config       ansible.builtin.command: app --validate       register: taskresult       changed_when: false    rescue:     - name: Add error to list       set_fact:         role_errors: \"{{ role_errors | default([]) + [{           'task': ansible_failed_task.name,           'error': ansible_failed_result.msg         }] }}\"      - name: Continue execution       meta: continue  - name: Print all errors (if any)   ansible.builtin.debug:     var: role_errors   failed_when: role_errors | length &gt; 0<\/code><\/pre>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/h4>\n<ol>\n<li>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a (block)<\/strong><\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u00a0<code>taskresult<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 &#8212; \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u00a0<code>rescue<\/code><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (rescue)<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (<code>meta: continue<\/code>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0448\u0438\u0431\u043e\u043a (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c) \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c \u0432\u044b\u0434\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445:<\/h4>\n<pre><code class=\"json\">\"role_errors\": [   {     \"task\": \"Task 2 - Validate config\",     \"error\": \"Command 'app --validate' returned 1: ERROR: Invalid config\"   } ]<\/code><\/pre>\n<h4>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/h4>\n<ol>\n<li>\n<p><strong>\u041f\u043e\u043b\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/strong>\u00a0&#8212; \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u043f\u0430\u043b\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434<\/strong>\u00a0&#8212; \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c<\/strong>\u00a0&#8212; \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f (\u0432\u0440\u0435\u043c\u044f, \u0445\u043e\u0441\u0442 \u0438 \u0442.\u0434.)<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 <\/strong>&#8212; \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"%D0%98%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C\" id=\"\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\">\u043d\u0442\u043d\u043e\u0441\u0442\u044c&#187;<\/a><\/p>\n<h3>\u041d\u0435\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u0440\u043e\u043b\u044c &#8212; \u0432\u044b\u0441\u0442\u0440\u0435\u043b \u0432 \u043d\u043e\u0433\u0443<\/h3>\n<p>\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043a Ansible-\u0440\u043e\u043b\u044f\u043c. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e:<br \/>\u2714 \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0440\u043e\u043b\u0438\u00a0<strong>\u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/strong><br \/>\u2714 \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u00a0<strong>\u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/strong><\/p>\n<p>\u041a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438?<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 Ansible\u00a0<strong>\u0443\u0436\u0435 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b<\/strong>\u00a0(apt, yum, template \u0438 \u0434\u0440.). \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 (<strong>\u0414\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/strong>\u00a0(<code>command<\/code>,\u00a0<code>shell<\/code>,\u00a0<code>raw<\/code>) \u0432\u0441\u0435\u0433\u0434\u0430) \u043d\u0443\u0436\u043d\u043e \u0440\u0443\u0447\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437:<\/p>\n<ul>\n<li>\n<p>changed_when: false  # \u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 &#171;ok&#187; (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u043b)<\/p>\n<\/li>\n<li>\n<p>changed_when: \u0443\u0441\u043b\u043e\u0432\u0438\u0435  # \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0434\u043b\u044f &#171;changed&#187;<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"yaml\"># \u041a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - name: Check service stataus   command: systemctl is-active nginx   register: nginx_status   changed_when: false  # \u2190 \u041d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \"ok\"    - name: Force reload (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e)   command: systemctl reload nginx   when: nginx_status.stdout != \"active\"  # \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 - name: Apply config if changed   template:     src: app.conf.j2     dest: \/etc\/app.conf   register: config_result   changed_when:<\/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-459789","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/459789","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=459789"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/459789\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=459789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=459789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=459789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}