{"id":31655,"date":"2019-10-31T21:42:22","date_gmt":"2019-10-31T18:42:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/instruktsiya-kak-testirovat-ansible-roli-i-uznavat-o-problemah-do-prodakshena\/"},"modified":"2019-10-31T21:42:22","modified_gmt":"2019-10-31T18:42:22","slug":"instruktsiya-kak-testirovat-ansible-roli-i-uznavat-o-problemah-do-prodakshena","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instruktsiya-kak-testirovat-ansible-roli-i-uznavat-o-problemah-do-prodakshena","title":{"rendered":"Anleitung: So testen Sie Ansible-Rollen und erkennen Probleme vor der Produktionsumgebung.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p><\/p>\n<p>\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0435\u043b\u0435\u0439 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ostrovok.ru\/?utm_source=habr&amp;utm_medium=pr&amp;utm_campaign=kvasov_apr19\">Ostrovok.ru<\/a><\/noindex>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ansible-\u0440\u043e\u043b\u0435\u0439.<\/p>\n<p><\/p>\n<p>\u0412 Ostrovok.ru \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ansible. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439, \u043d\u043e, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u2014 \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Molecule, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e. \u041d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0435\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0443\u043c\u0430\u043b\u0447\u0438\u0432\u0430\u0435\u0442 \u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u044f\u0445. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u043d\u0430\u043c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c ansible-\u0440\u043e\u043b\u0438 \u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0434\u043e \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430\" src=\"\/wp-content\/uploads\/2019\/04\/4ed84164ba241264522747271b66680a.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Molecule<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/molecule.readthedocs.io\/en\/stable\/\">\u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430<\/a><\/noindex> \u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043f\u043e\u043c\u043e\u0449\u0438 \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 ansible-\u0440\u043e\u043b\u0435\u0439. <\/p>\n<p><\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432\u0430\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 (\u043e\u0431\u043b\u0430\u043a\u043e, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440; \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. \u0440\u0430\u0437\u0434\u0435\u043b <noindex><a rel=\"nofollow\" href=\"#driver\">Driver<\/a><\/noindex>), \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u043d\u0430 \u043d\u0451\u043c \u0432\u0430\u0448\u0443 \u0440\u043e\u043b\u044c, \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u044b \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0448\u0430\u0433\u043e\u0432, \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u0432\u0430\u043c \u043e\u0431 \u044d\u0442\u043e\u043c.<\/p>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p><\/p>\n<h3 id=\"nemnogo-teorii\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h3>\n<p><\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044b: Scenario \u0438 Driver.<\/p>\n<p><\/p>\n<h4 id=\"scenario\">Scenario<\/h4>\n<p><\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e, \u0433\u0434\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e. \u0423 \u043e\u0434\u043d\u043e\u0439 \u0440\u043e\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u2014 \u044d\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u043e \u043f\u0443\u0442\u0438 <code>&lt;role&gt;\/molecule\/&lt;scenario&gt;<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0432 \u0441\u0435\u0431\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 <code>default<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043d, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0435 \u0440\u043e\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044b. \u0418\u043c\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0430\u0448\u0435 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435.<\/p>\n<p><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>matrix<\/strong>, \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u0430 \u0442\u0430\u043a\u043e\u0432\u0430:<\/p>\n<p><\/p>\n<p><em>(\u0428\u0430\u0433\u0438, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 <code>?<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c)<\/em><\/p>\n<p><\/p>\n<ul>\n<li><code>lint<\/code> \u2014 \u043f\u0440\u043e\u0433\u043e\u043d \u043b\u0438\u043d\u0442\u0435\u0440\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <code>yamllint<\/code> \u0438 <code>flake8<\/code>,<\/li>\n<li><code>destroy<\/code> \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044b (\u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c),<\/li>\n<li><code>dependency<\/code>? \u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 ansible-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0440\u043e\u043b\u0438,<\/li>\n<li><code>syntax<\/code> \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0440\u043e\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>ansible-playbook --syntax-check<\/code>,<\/li>\n<li><code>create<\/code> \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430,<\/li>\n<li><code>prepare<\/code>? \u2014 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \/ \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 python2<\/li>\n<li><code>converge<\/code> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430,<\/li>\n<li><code>idempotence<\/code> \u2014 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c,<\/li>\n<li><code>side_effect<\/code>? \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0440\u043e\u043b\u0438, \u043d\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432,<\/li>\n<li><code>verify<\/code> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>testinfra<\/code>(\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \/<code>goss<\/code>\/<code>inspec<\/code>,<\/li>\n<li><code>cleanup<\/code>? \u2014 (\u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445) \u2014 \u0433\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, &#171;\u043e\u0447\u0438\u0441\u0442\u043a\u0430&#187; \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0437\u0430\u0434\u0435\u0442\u043e\u0439 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u043e\u0439,<\/li>\n<li><code>destroy<\/code> \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u042d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043d\u043e, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. <\/p>\n<p><\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>molecule &lt;command&gt;<\/code>. \u041d\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 cli-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 <code>molecule matrix &lt;command&gt;<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>converge<\/code> (\u043f\u0440\u043e\u0433\u043e\u043d \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430) \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ molecule matrix converge\n...\n\u2514\u2500\u2500 default         # \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\n    \u251c\u2500\u2500 dependency  # \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439\n    \u251c\u2500\u2500 create      # \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\n    \u251c\u2500\u2500 prepare     # \u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\n    \u2514\u2500\u2500 converge    # \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e, \u0442\u043e \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e. \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432, \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>$TMPDIR\/molecule\/&lt;role&gt;\/&lt;scenario&gt;<\/code>.<\/p>\n<p><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0433\u0438 \u0441 <code>?<\/code> \u043c\u043e\u0436\u043d\u043e, \u043e\u043f\u0438\u0441\u0430\u0432 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 ansible-\u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430, \u0430 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0448\u0430\u0433\u0443: <code>prepare.yml<\/code>\/<code>side_effect.yml<\/code>. \u041e\u0436\u0438\u0434\u0430\u0442\u044c \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.<\/p>\n<p><\/p>\n<h4 id=\"driver\">Driver<\/h4>\n<p><\/p>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u2013 \u044d\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0433\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432.<br \/>\n\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0442\u0430\u043a\u043e\u0432: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.<\/p>\n<p><\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u2013 \u044d\u0442\u043e \u0444\u0430\u0439\u043b\u044b <code>create.yml<\/code> \u0438 <code>destroy.yml<\/code> \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<br \/>\n\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 Docker \u0438 Vagrant, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u0435\u0437 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p><\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 Delegated, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440.<\/p>\n<p><\/p>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Docker.<\/p>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043c.<\/p>\n<p><\/p>\n<h3 id=\"nachalo-raboty\">\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b<\/h3>\n<p><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &#171;hello world&#187; \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0440\u043e\u043b\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 nginx. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0434\u043e\u043a\u0435\u0440 \u2013 \u0434\u0443\u043c\u0430\u044e, \u043e\u043d \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0438\u0437 \u0432\u0430\u0441 (\u0438 \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0434\u043e\u043a\u0435\u0440 \u2014 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e). <\/p>\n<p><\/p>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c <code>virtualenv<\/code> \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e <code>molecule<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">&gt; pip install virtualenv\n&gt; virtualenv -p `which python2` venv\n&gt; source venv\/bin\/activate\n&gt; pip install molecule docker  # molecule \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 ansible \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c; docker \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430<\/code><\/pre>\n<p><\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0440\u043e\u043b\u044c.<br \/>\n\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u043b\u0438, \u043a\u0430\u043a \u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>molecule init &lt;params&gt;<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">&gt; molecule init role -r nginx\n--&gt; Initializing new role nginx...\nInitialized role in &lt;path&gt;\/nginx successfully.\n&gt; cd nginx\n&gt; tree -L 1\n.\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 defaults\n\u251c\u2500\u2500 handlers\n\u251c\u2500\u2500 meta\n\u251c\u2500\u2500 molecule\n\u251c\u2500\u2500 tasks\n\u2514\u2500\u2500 vars\n\n6 directories, 1 file<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f ansible-\u0440\u043e\u043b\u044c. \u0414\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 CLI \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u0440\u043e\u043b\u0438.<\/p>\n<p><\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0440\u043e\u043b\u0438:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">&gt; tree molecule\/default\/\nmolecule\/default\/\n\u251c\u2500\u2500 Dockerfile.j2  # Jinja-\u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f Dockerfile\n\u251c\u2500\u2500 INSTALL.rst.   # \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\n\u251c\u2500\u2500 molecule.yml   # \u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n\u251c\u2500\u2500 playbook.yml   # \u041f\u043b\u0435\u0439\u0431\u0443\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u043e\u043b\u0438\n\u2514\u2500\u2500 tests          # \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0441\u0442\u0430\u0434\u0438\u0438 verify\n    \u2514\u2500\u2500 test_default.py\n\n1 directory, 6 files<\/code><\/pre>\n<p><\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u043e\u043d\u0444\u0438\u0433 <code>molecule\/default\/molecule.yml<\/code> (\u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e docker image):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\ndependency:\n  name: galaxy\ndriver:\n  name: docker\nlint:\n  name: yamllint\nplatforms:\n  - name: instance\n    image: centos:7\nprovisioner:\n  name: ansible\n  lint:\n    name: ansible-lint\nscenario:\n  name: default\nverifier:\n  name: testinfra\n  lint:\n    name: flake8<\/code><\/pre>\n<p><\/p>\n<h4 id=\"dependency\">dependency<\/h4>\n<p><\/p>\n<p>\u042d\u0442\u0430 \u0441\u0435\u043a\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. <\/p>\n<p><\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b: <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/\">galaxy<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/gilt.readthedocs.io\/en\/latest\/\">gilt<\/a><\/noindex>, shell.<\/p>\n<p><\/p>\n<p>Shell \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 galaxy \u0438 gilt \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p><\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0433\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/molecule.readthedocs.io\/en\/latest\/configuration.html#dependency\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h4 id=\"driver-1\">driver<\/h4>\n<p><\/p>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0423 \u043d\u0430\u0441 \u044d\u0442\u043e docker.<\/p>\n<p><\/p>\n<h4 id=\"lint\">lint<\/h4>\n<p><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f yamllint.<\/p>\n<p><\/p>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f yamllint, \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u0438\u043d\u0442\u0435\u0440:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">lint:\n  name: yamllint\n  options:\n    config-file: foo\/bar\n  env:\n    FOO: bar\n  enabled: False<\/code><\/pre>\n<p><\/p>\n<h4 id=\"platforms\">platforms<\/h4>\n<p><\/p>\n<p>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432.<br \/>\n\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0434\u043e\u043a\u0435\u0440\u043e\u043c \u0432 \u0440\u043e\u043b\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 <code>Dockerfile.j2<\/code> \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>item<\/code>. <\/p>\n<p><\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b <code>create.yml<\/code> \u0438 <code>destroy.yml<\/code>, \u0441\u0435\u043a\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u043d\u0438\u0445 \u043a\u0430\u043a <code>molecule_yml.platforms<\/code>, \u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043d\u0435\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0443\u0436\u0435 \u0432 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445. <\/p>\n<p><\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438 ansible-\u043c\u043e\u0434\u0443\u043b\u044f\u043c, \u0442\u043e \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0430\u0434\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043c. \u0414\u043b\u044f \u0434\u043e\u043a\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/modules\/docker_container_module.html\">docker_container_module<\/a><\/noindex>. \u041a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u0445, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/molecule.readthedocs.io\/en\/latest\/configuration.html#driver\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <noindex>\u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u0441\u0430\u043c\u043e\u0439 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044b<\/noindex>.<\/p>\n<p><\/p>\n<p>\u0417\u0430\u043c\u0435\u043d\u0438\u043c \u0437\u0434\u0435\u0441\u044c <strong>centos:7<\/strong> \u043d\u0430 <strong>ubuntu<\/strong>.<\/p>\n<p><\/p>\n<h4 id=\"provisioner\">provisioner<\/h4>\n<p><\/p>\n<p>&#171;\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a&#187; \u2014 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044b \u044d\u0442\u043e ansible, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0443 \u0441\u0435\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0441 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u043e\u0439 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 ansible.<br \/>\n\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e, \u0432\u044b\u0434\u0435\u043b\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n<p><\/p>\n<ul>\n<li><strong>playbooks<\/strong>: \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u0434\u0438\u044f\u0445. <\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">provisioner:\n  name: ansible\n  playbooks:\n    create: create.yml\n    destroy: ..\/default\/destroy.yml\n    converge: playbook.yml\n    side_effect: side_effect.yml\n    cleanup: cleanup.yml<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><strong>config_options<\/strong>: <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/reference_appendices\/config.html\">\u043a\u043e\u043d\u0444\u0438\u0433 ansible<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">provisioner:\n  name: ansible\n  config_options:\n    defaults:\n      fact_caching: jsonfile\n    ssh_connection:\n      scp_if_ssh: True<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><strong>connection_options<\/strong>: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html#list-of-behavioral-inventory-parameters\">\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">provisioner:\n  name: ansible  \n  connection_options:\n    ansible_ssh_common_args: \"-o 'UserKnownHostsFile=\/dev\/null' -o 'ForwardAgent=yes'\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><strong>options<\/strong>: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Ansible \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">provisioner:\n  name: ansible  \n  options:\n    vvv: true\n    diff: true\n  env:\n    FOO: BAR<\/code><\/pre>\n<p><\/p>\n<h4 id=\"scenario-1\">scenario<\/h4>\n<p><\/p>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.<br \/>\n\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a\u043b\u044e\u0447 <code>&lt;command&gt;_sequence<\/code> \u0438 \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0448\u0430\u0433\u043e\u0432.<br \/>\n\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430: <code>molecule converge<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e:\n# - dependency\n# - create\n# - prepare\n# - converge\nscenario:\n  name: default\n  converge_sequence:\n    - create\n    - converge<\/code><\/pre>\n<p><\/p>\n<h4 id=\"verifier\">verifier<\/h4>\n<p><\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u043a \u043d\u0435\u043c\u0443. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>testinfra<\/code> \u0438 <code>flake8<\/code>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0441\u0445\u043e\u0436\u0438 \u0441 \u0432\u044b\u0448\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">verifier:\n  name: testinfra\n  additional_files_or_dirs:\n    - ..\/path\/to\/test_1.py\n    - ..\/path\/to\/test_2.py\n    - ..\/path\/to\/directory\/*\n  options:\n    n: 1\n  enabled: False\n  env:\n    FOO: bar\n  lint:\n    name: flake8\n    options:\n      benchmark: True\n    enabled: False\n    env:\n      FOO: bar<\/code><\/pre>\n<p><\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0440\u043e\u043b\u0438. \u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b <code>tasks\/main.yml<\/code> \u0434\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- name: Install nginx\n  apt:\n    name: nginx\n    state: present\n\n- name: Start nginx\n  service:\n    name: nginx\n    state: started\n<\/code><\/pre>\n<p><\/p>\n<p>\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0435\u0441\u0442\u044b \u0432 <code>molecule\/default\/tests\/test_default.py<\/code><\/p>\n<p><\/p>\n<pre><code class=\"python\">def test_nginx_is_installed(host):\n    nginx = host.package(\"nginx\")\n    assert nginx.is_installed\n\ndef test_nginx_running_and_enabled(host):\n    nginx = host.service(\"nginx\")\n    assert nginx.is_running\n    assert nginx.is_enabled\n\ndef test_nginx_config(host):\n    host.run(\"nginx -t\")\n<\/code><\/pre>\n<p><\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c (\u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u0440\u043e\u043b\u0438, \u043d\u0430\u043f\u043e\u043c\u043d\u044e): <\/p>\n<p><\/p>\n<pre><code class=\"bash\">&gt; molecule test<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">\u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u0432\u044b\u0445\u043b\u043e\u043f \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c:<\/b><\/p>\n<pre><code class=\"plaintext\">--&gt; Validating schema &lt;path&gt;\/nginx\/molecule\/default\/molecule.yml.\nValidation completed successfully.\n--&gt; Test matrix\n\n\u2514\u2500\u2500 default\n    \u251c\u2500\u2500 lint\n    \u251c\u2500\u2500 destroy\n    \u251c\u2500\u2500 dependency\n    \u251c\u2500\u2500 syntax\n    \u251c\u2500\u2500 create\n    \u251c\u2500\u2500 prepare\n    \u251c\u2500\u2500 converge\n    \u251c\u2500\u2500 idempotence\n    \u251c\u2500\u2500 side_effect\n    \u251c\u2500\u2500 verify\n    \u2514\u2500\u2500 destroy\n\n--&gt; Scenario: 'default'\n--&gt; Action: 'lint'\n--&gt; Executing Yamllint on files found in &lt;path&gt;\/nginx\/...\nLint completed successfully.\n--&gt; Executing Flake8 on files found in &lt;path&gt;\/nginx\/molecule\/default\/tests\/...\nLint completed successfully.\n--&gt; Executing Ansible Lint on &lt;path&gt;\/nginx\/molecule\/default\/playbook.yml...\nLint completed successfully.\n--&gt; Scenario: 'default'\n--&gt; Action: 'destroy'\n\n    PLAY [Destroy] *****************************************************************\n\n    TASK [Destroy molecule instance(s)] ********************************************\n    changed: [localhost] =&gt; (item=None)\n    changed: [localhost]\n\n    TASK [Wait for instance(s) deletion to complete] *******************************\n    ok: [localhost] =&gt; (item=None)\n    ok: [localhost]\n\n    TASK [Delete docker network(s)] ************************************************\n\n    PLAY RECAP *********************************************************************\n    localhost                  : ok=2    changed=1    unreachable=0    failed=0\n\n--&gt; Scenario: 'default'\n--&gt; Action: 'dependency'\nSkipping, missing the requirements file.\n--&gt; Scenario: 'default'\n--&gt; Action: 'syntax'\n\n    playbook: &lt;path&gt;\/nginx\/molecule\/default\/playbook.yml\n\n--&gt; Scenario: 'default'\n--&gt; Action: 'create'\n\n    PLAY [Create] ******************************************************************\n\n    TASK [Log into a Docker registry] **********************************************\n    skipping: [localhost] =&gt; (item=None)\n\n    TASK [Create Dockerfiles from image names] *************************************\n    changed: [localhost] =&gt; (item=None)\n    changed: [localhost]\n\n    TASK [Discover local Docker images] ********************************************\n    ok: [localhost] =&gt; (item=None)\n    ok: [localhost]\n\n    TASK [Build an Ansible compatible image] ***************************************\n    changed: [localhost] =&gt; (item=None)\n    changed: [localhost]\n\n    TASK [Create docker network(s)] ************************************************\n\n    TASK [Create molecule instance(s)] *********************************************\n    changed: [localhost] =&gt; (item=None)\n    changed: [localhost]\n\n    TASK [Wait for instance(s) creation to complete] *******************************\n    changed: [localhost] =&gt; (item=None)\n    changed: [localhost]\n\n    PLAY RECAP *********************************************************************\n    localhost                  : ok=5    changed=4    unreachable=0    failed=0\n\n--&gt; Scenario: 'default'\n--&gt; Action: 'prepare'\nSkipping, prepare playbook not configured.\n--&gt; Scenario: 'default'\n--&gt; Action: 'converge'\n\n    PLAY [Converge] ****************************************************************\n\n    TASK [Gathering Facts] *********************************************************\n    ok: [instance]\n\n    TASK [nginx : Install nginx] ***************************************************\n    changed: [instance]\n\n    TASK [nginx : Start nginx] *****************************************************\n    changed: [instance]\n\n    PLAY RECAP *********************************************************************\n    instance                   : ok=3    changed=2    unreachable=0    failed=0\n\n--&gt; Scenario: 'default'\n--&gt; Action: 'idempotence'\nIdempotence completed successfully.\n--&gt; Scenario: 'default'\n--&gt; Action: 'side_effect'\nSkipping, side effect playbook not configured.\n--&gt; Scenario: 'default'\n--&gt; Action: 'verify'\n--&gt; Executing Testinfra tests found in &lt;path&gt;\/nginx\/molecule\/default\/tests\/...\n    ============================= test session starts ==============================\n    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0\n    rootdir: &lt;path&gt;\/nginx\/molecule\/default, inifile:\n    plugins: testinfra-1.16.0\ncollected 4 items\n\n    tests\/test_default.py ....                                               [100%]\n\n    ========================== 4 passed in 27.23 seconds ===========================\nVerifier completed successfully.\n--&gt; Scenario: 'default'\n--&gt; Action: 'destroy'\n\n    PLAY [Destroy] *****************************************************************\n\n    TASK [Destroy molecule instance(s)] ********************************************\n    changed: [localhost] =&gt; (item=None)\n    changed: [localhost]\n\n    TASK [Wait for instance(s) deletion to complete] *******************************\n    changed: [localhost] =&gt; (item=None)\n    changed: [localhost]\n\n    TASK [Delete docker network(s)] ************************************************\n\n    PLAY RECAP *********************************************************************\n    localhost                  : ok=2    changed=2    unreachable=0    failed=0\n<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430\u0448\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u043e\u043b\u044c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<br \/>\n\u0421\u0442\u043e\u0438\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 <code>molecule test<\/code>, \u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u043b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0443\u0434\u0430\u043b\u0438\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u0431\u0430\u0433\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">&gt; molecule --debug &lt;command&gt; # debug info. \u041f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438.\n&gt; molecule converge          # \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0440\u043e\u043b\u0438.\n&gt; molecule login             # \u0417\u0430\u0439\u0442\u0438 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441.\n&gt; molecule --help            # \u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434.<\/code><\/pre>\n<p><\/p>\n<h3 id=\"suschestvuyuschaya-rol\">\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0440\u043e\u043b\u044c<\/h3>\n<p><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0440\u043e\u043b\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <strong>\u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0440\u043e\u043b\u0438<\/strong> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438:<\/p>\n<p><\/p>\n<pre><code class=\"bash\"># \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432\n&gt; molecule init scenarion --help\n# \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\n&gt; molecule init scenario -r &lt;role_name&gt; -s &lt;scenario_name&gt;<\/code><\/pre>\n<p><\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432 \u0440\u043e\u043b\u0438, \u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>-s<\/code> \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 <code>default<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u0430, \u0430 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043a \u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432. \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u0430 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 CI, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0440\u0443\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432.<\/p>\n<p><\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ansible-\u0440\u043e\u043b\u0435\u0439, \u0438 \u043e\u043d \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u041c\u043e\u043b\u0435\u043a\u0443\u043b\u043e\u0439 \u2014 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u043e \u043d\u0435\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ostrovok\/blog\/448136\/\">habr.com<\/a><\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0435\u043b\u0435\u0439 Ostrovok.ru. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ansible-\u0440\u043e\u043b\u0435\u0439. \u0412 Ostrovok.ru \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ansible. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439, \u043d\u043e, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u2014 \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Molecule, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23565,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31655","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0435\u043b\u0435\u0439 Ostrovok.ru. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ansible-\u0440\u043e\u043b\u0435\u0439. \u0412 Ostrovok.ru \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ansible. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439, \u043d\u043e, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u2014 \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Molecule, \u043f\u043e\u044d\u0442\u043e\u043c\u0443\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instruktsiya-kak-testirovat-ansible-roli-i-uznavat-o-problemah-do-prodakshena\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c ansible-\u0440\u043e\u043b\u0438 \u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0434\u043e \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0435\u043b\u0435\u0439 Ostrovok.ru. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ansible-\u0440\u043e\u043b\u0435\u0439. \u0412 Ostrovok.ru \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ansible. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439, \u043d\u043e, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u2014 \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Molecule, \u043f\u043e\u044d\u0442\u043e\u043c\u0443\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instruktsiya-kak-testirovat-ansible-roli-i-uznavat-o-problemah-do-prodakshena\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:42:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:42:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Anleitung: So testen Sie Ansible-Rollen und erkennen Probleme vor der Produktion | ProHoster","description":"Hallo zusammen! Ich arbeite als DevOps-Ingenieur bei dem Buchungsdienst Ostrovok.ru. In diesem Artikel m\u00f6chte ich \u00fcber unsere Erfahrungen mit dem Testen von Ansible-Rollen berichten. Bei Ostrovok.ru verwenden wir Ansible als Konfigurationsmanagement-Tool. K\u00fcrzlich haben wir die Notwendigkeit erkannt, Rollen zu testen, aber wie sich herausstellte, gibt es nicht viele Werkzeuge daf\u00fcr \u2013 am beliebtesten ist wahrscheinlich das Framework Molecule, weshalb","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instruktsiya-kak-testirovat-ansible-roli-i-uznavat-o-problemah-do-prodakshena","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c ansible-\u0440\u043e\u043b\u0438 \u0438 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0434\u043e \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0435\u043b\u0435\u0439 Ostrovok.ru. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ansible-\u0440\u043e\u043b\u0435\u0439. \u0412 Ostrovok.ru \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ansible. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439, \u043d\u043e, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u2014 \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Molecule, \u043f\u043e\u044d\u0442\u043e\u043c\u0443","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instruktsiya-kak-testirovat-ansible-roli-i-uznavat-o-problemah-do-prodakshena","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:42:22+00:00","article:modified_time":"2019-10-31T18:42:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31655","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 07:13:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:39:03","updated":"2026-01-21 07:13:20"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=31655"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31655\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/23565"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=31655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=31655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=31655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}