{"id":356469,"date":"2024-05-20T23:30:22","date_gmt":"2024-05-20T23:30:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=356469"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=356469","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 Molecule \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438 \u0431\u043e\u043b\u0438<\/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>\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 2023 \u0433\u043e\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 <abbr class=\"habraabbr\" title=\"\u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u0438 Ansible\" data-title=\"&lt;p>\u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u0438 Ansible&lt;\/p>&#187; data-abbr=&#187;Molecule&#187;>Molecule<\/abbr> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043c\u0430\u0436\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 5.0.0.  \u041f\u043e\u043c\u0438\u043c\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u0433\u0444\u0438\u043a\u0441\u043e\u0432 \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <code>molecule.docker<\/code> \u0438\u043b\u0438 <code>molecule.openstack<\/code>. \u042f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b <s>\u0438\u043b\u0438 \u043f\u043b\u043e\u0445\u043e \u0438\u0441\u043a\u0430\u043b<\/s> \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u2014 \u043e\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u00abHello world\u00bb \u0434\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 <code>custom_docker<\/code> \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 <code>molecule.docker<\/code>,  \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0437 API Molecule, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f. <\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u0441 \u0440\u0435\u043b\u0438\u0437\u043e\u043c 5.0.0 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0441\u0442\u0430\u043b\u043e \u043f\u0440\u043e\u0449\u0435<\/h2>\n<p>\u0412 YADRO \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439 \u0438 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0412\u041c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u044f\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a: \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c XML-\u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0438\u0441\u043a\u0438. \u0423 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b. \u0412\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 <code>molecule.libvirt<\/code>.<\/p>\n<p>\u0414\u043e \u0440\u0435\u043b\u0438\u0437\u0430 5.0.0 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0438\u0445 \u0440\u043e\u043b\u0435\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>\u251c\u2500\u2500 molecule \u2502   \u2514\u2500\u2500 default \u2502   \u251c\u2500\u2500 cleanup.yml \u2502   \u251c\u2500\u2500 converge.yml \u2502   \u251c\u2500\u2500 create.yml \u2502   \u251c\u2500\u2500 destroy.yml \u2502   \u251c\u2500\u2500 molecule.yml \u2502   \u251c\u2500\u2500 tasks \u2502   \u2502   \u251c\u2500\u2500 get-vm-info.yml \u2502   \u2502   \u2514\u2500\u2500 resize.yml \u2502   \u2514\u2500\u2500 templates \u2502       \u2514\u2500\u2500 vm_template.xml.j2<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0444\u0430\u0439\u043b\u043e\u0432 <code>molecule<\/code>, <code>converge<\/code> \u0438 <code>verify<\/code>, \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c \u0432\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b: \u0437\u0430\u0434\u0430\u0447\u0438, \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438. \u041f\u043e\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0431\u0435\u0437 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0438\u0437 \u0440\u043e\u043b\u0438 \u0432 \u0440\u043e\u043b\u044c, \u0438\u0437 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439.<\/p>\n<p>\u042d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u0440\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u2014 \u043a\u0430\u043a \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445:<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u043b\u0438<\/strong> <strong>\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443<\/strong> \u2014 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0432\u044b\u0448\u0430\u043b\u0441\u044f \u043f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f.<\/strong> \u041d\u043e\u0432\u043e\u043f\u0440\u0438\u0431\u044b\u0432\u0448\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0432\u043e\u0440\u043e\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0441 \u0444\u0440\u0430\u0437\u043e\u0439: \u00ab\u042d\u0442\u043e \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435, \u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f\u00bb. \u041d\u043e, \u0435\u0441\u043b\u0438 \u0435\u043c\u0443 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0431\u0430\u0433, \u044d\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438: \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u043b\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u0434\u0442\u0438 \u043a \u0430\u0432\u0442\u043e\u0440\u0443 \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/strong>, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043a\u0438 \u0432 XML-\u0448\u0430\u0431\u043b\u043e\u043d \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c, \u0433\u0434\u0435-\u0442\u043e \u2014 \u0441 \u043d\u043e\u0432\u044b\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u2014 \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043c\u0443\u0442\u043e\u0440\u043d\u043e. \u0414\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u0440\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u2014 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0445\u0443 \u0432 Git-\u0434\u0435\u0440\u0435\u0432\u0435. \u042f \u0440\u0435\u0448\u0438\u043b \u0441\u043a\u0440\u044b\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u0447\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Molecule, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f Molecule \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 5.0.0, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c\u0441\u044f. \u0418\u043c\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 JSON-\u0441\u0445\u0435\u043c\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Molecule. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u043e\u0439, \u043d\u043e \u0438 \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Molecule, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b JSON-\u0441\u0445\u0435\u043c\u044b. \u0410 \u0437\u0430\u0442\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043f\u0438\u0438 \u0434\u0432\u0443\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432.<\/p>\n<p><strong>\u041f\u043e\u0441\u043b\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 5.0.0 \u044d\u0442\u0430\u043f \u0441 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/strong> \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u2014 molecule-*<em>,<\/em> molecule_<em>*<\/em>, custom-*<em> <\/em>\u0438\u043b\u0438 custom_*, \u0442\u043e \u043e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043d\u0430\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0434\u043e \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0439:<\/p>\n<pre><code>\u2514\u2500\u2500 molecule     \u2514\u2500\u2500 default         \u251c\u2500\u2500 verify.yml         \u251c\u2500\u2500 converge.yml         \u2514\u2500\u2500 molecule.yml<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u043b \u0442\u0430\u043a\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u2014 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438.<\/p>\n<h2>\u0421\u0442\u0430\u0440\u0442 \u0440\u0430\u0431\u043e\u0442\u044b<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Docker. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b Molecule-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u2014 <code>molecule_custom_docker<\/code> \u0438 <code>hello_world<\/code>. \u0412\u043d\u0443\u0442\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f Ansible-\u0440\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 Molecule \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u043e\u043b\u0438 hello_world:<\/p>\n<pre><code>.\/hello_world \u2514\u2500\u2500 tasks     \u2514\u2500\u2500 main.yml<\/code><\/pre>\n<p><strong>hello_world\/tasks\/main.yml<\/strong><\/p>\n<pre><code class=\"yaml\">--- - name: Say hello to user   ansible.builtin.debug:     msg: \"Hello, dear user\"<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c Python \u043d\u0435 \u0441\u0442\u0430\u0440\u0435\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 3.10 \u0438 Molecule \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 5.0.1 \u0438 \u0432\u044b\u0448\u0435. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f Ansible.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u043b\u0430\u0433\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Docker, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u0440\u0443\u0442\u043e\u0432\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/docs.docker.com\/engine\/install\/linux-postinstall\/#manage-docker-as-a-non-root-user\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 Docker<\/u><\/a>.<\/p>\n<h2>\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 <code>molecule_custom_driver<\/code>, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 Python-\u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 <code>custom_docker<\/code>. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 <code>molecule create<\/code> \u0438 <code>molecule destroy<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 <code>molecule converge<\/code> \u0438 <code>molecule login<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0435\u0445\u0430\u043b\u0438! <\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>molecule_custom_docker<\/code>, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:<\/p>\n<pre><code>. \u251c\u2500\u2500 .git \u251c\u2500\u2500 .gitignore \u251c\u2500\u2500 pyproject.toml \u251c\u2500\u2500 setup.cfg \u251c\u2500\u2500 src \u2502   \u2514\u2500\u2500 molecule_custom_docker \u2502   \u251c\u2500\u2500 driver.py \u2502   \u2514\u2500\u2500 __init__.py \u2514\u2500\u2500 venv<\/code><\/pre>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/driver\/base.py\"><u>molecule.api.Driver<\/u><\/a>, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u044f <code>_name<\/code>. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e Molecule \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435:<\/p>\n<p><strong>src\/molecule_custom_docker\/driver.py<\/strong><\/p>\n<pre><code class=\"python\">from molecule.api import Driver from molecule import logger   LOG = logger.get_logger(__name__)   class CustomDocker(Driver):     def __init__(self, config=None):         super(CustomDocker, self).__init__(config)         self._name = \"custom_docker\"       @property     def name(self):         return self._name       @name.setter     def name(self, value):         self._name = value<\/code><\/pre>\n<p>\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 <code>pyproject.toml<\/code> \u0438 <code>setup.cfg<\/code> \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 <code>molecule_docker<\/code>:<\/p>\n<p><strong>setup.cfg<\/strong><\/p>\n<pre><code>[metadata] name = molecule_custom_docker description = Molecule Custom Docker Plugin :: run molecule tests on Docker images classifiers =     Development Status :: 2 - Pre-Alpha     Environment :: Console     Intended Audience :: Developers     Intended Audience :: Information Technology     Intended Audience :: System Administrators     Natural Language :: English     Operating System :: OS Independent     Programming Language :: Python :: 3     Programming Language :: Python :: 3.10       Topic :: System :: Systems Administration     Topic :: Utilities   keywords =     ansible     roles     testing     molecule     plugin     docker   [options] use_scm_version = True python_requires = >=3.10 package_dir =   = src packages = find: include_package_data = True zip_safe = False   install_requires =    molecule >= 5.0.1   [options.entry_points] molecule.driver =    custom_docker = molecule_custom_docker.driver:CustomDocker   [options.packages.find] where = src<\/code><\/pre>\n<p><strong>pyproject.toml<\/strong><\/p>\n<pre><code>[build-system] requires = [   \"pip >= 19.3.1\",   \"setuptools >= 42\",   \"setuptools_scm[toml] >= 3.5.0\",   \"setuptools_scm_git_archive >= 1.1\",   \"wheel >= 0.33.6\", ] build-backend = \"setuptools.build_meta\"   [tool.setuptools_scm] local_scheme = \"no-local-version\"<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f TOML \u0438 CFG-\u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u043e\u0434 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432 Python-\u043f\u0430\u043a\u0435\u0442, \u0430 \u0441\u0430\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 custom_docker \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Molecule. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c:<\/p>\n<pre><code># \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 molecule_custom_docker > cd ..\/hello_world > source venv\/bin\/activate > pip install -e ..\/molecule_custom_docker\/ > molecule drivers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   custom_docker                                                                                                                                                                                                                           delegated<\/code><\/pre>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 CookieCutter<\/h2>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f:<\/p>\n<pre><code># \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 hello_world > molecule init scenario -d custom_docker default INFO Initializing new scenario default... CRITICAL The specified template directory (\/home\/pavel\/hello_world\/venv\/lib\/python3.10\/site-packages\/molecule\/cookiecutter\/scenario\/driver\/custom_docker) does not exist<\/code><\/pre>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e Molecule \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0438\u0449\u0435\u0442 \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 cookiecutter.<\/p>\n<p><a href=\"https:\/\/github.com\/cookiecutter\/cookiecutter\"><u>CookieCutter<\/u><\/a> \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/github.com\/pallets\/jinja\"><u>Jinja2<\/u><\/a><u>&#8212;<\/u>\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. CookieCutter-\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0438\u043b\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0433\u0434\u0435 \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b cookiecutter.json \u2014 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u043e \u0438 \u0434\u043b\u044f \u0438\u043c\u0435\u043d \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <code>cookiecutter: {{ cookiecutter.&lt;variable_name> }}<\/code>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d CookieCutter \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:<\/p>\n<pre><code>src\/molecule_custom_docker \u251c\u2500\u2500 cookiecutter \u2502   \u2514\u2500\u2500 cookiecutter.json \u251c\u2500\u2500 driver.py \u2514\u2500\u2500 __init__.py<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <code>cookiecutter.json<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<p><strong>src\/molecule_custom_docker\/cookiecutter\/cookiecutter.json<\/strong><\/p>\n<pre><code class=\"json\">{     \"molecule_directory\": \"molecule\",     \"dependency_name\": \"OVERRIDDEN\",     \"driver_name\": \"OVERRIDDEN\",     \"provisioner_name\": \"OVERRIDDEN\",     \"scenario_name\": \"OVERRIDDEN\",     \"role_name\": \"OVERRIDDEN\",     \"verifier_name\": \"OVERRIDDEN\" }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 CookieCutter, \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0438\u0434\u0430 <code>\"{{ cookiecutter.molecule_directory }}\"<\/code> \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 <code>\"molecule\"<\/code>, <code>\"{{ cookiecuter.dependency_name }}\"<\/code> \u043d\u0430 <code>\"OVERRIDDEN\"<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>\"OVERRIDDEN\"<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c. \u041e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u0445 \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 CookieCutter \u0438\u0437 Molecule. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u043b\u0430\u0433\u043e\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>molecule init scenario<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>dependency_name<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u0444\u043b\u0430\u0433\u0430 <code>--dependency-name<\/code>, <code>driver_name<\/code> \u2014 \u0438\u0437 \u0444\u043b\u0430\u0433\u0430 <code>--driver-name<\/code>. \u041d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432 <code>cookiecutter.json<\/code>, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Molecule \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 CookieCutter-\u0448\u0430\u0431\u043b\u043e\u043d\u0435.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0430:<\/p>\n<pre><code>src\/molecule_custom_docker \u251c\u2500\u2500 cookiecutter \u2502   \u251c\u2500\u2500 cookiecutter.json \u2502   \u2514\u2500\u2500 {{cookiecutter.molecule_directory}} \u2502   \u2514\u2500\u2500 {{cookiecutter.scenario_name}} \u251c\u2500\u2500 driver.py \u2514\u2500\u2500 __init__.py<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432:<\/p>\n<pre><code># \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 hello_world > molecule init scenario -d custom_docker INFO Initializing new scenario default... INFO Initialized scenario in \/home\/pavel\/hello_world\/molecule\/default successfully.   > molecule init scenario -d custom_docker test_a INFO Initializing new scenario test_a... INFO Initialized scenario in \/home\/pavel\/hello_world\/molecule\/test_a successfully.   > molecule init scenario -d custom_docker test_b INFO Initializing new scenario test_b... INFO Initialized scenario in \/home\/pavel\/hello_world\/molecule\/test_b successfully.   > tree .\/molecule .\/molecule \u251c\u2500\u2500 default \u2502   \u251c\u2500\u2500 molecule.yml \u2502   \u2514\u2500\u2500 verify.yml \u251c\u2500\u2500 test_a \u2502   \u251c\u2500\u2500 molecule.yml \u2502   \u2514\u2500\u2500 verify.yml \u2514\u2500\u2500 test_b     \u251c\u2500\u2500 molecule.yml     \u2514\u2500\u2500 verify.yml<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 default. \u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430: \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f Molecule, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<p><strong>molecule\/default\/molecule.yml<\/strong><\/p>\n<pre><code class=\"yaml\">--- dependency:   name: galaxy driver:   name: custom_docker platforms:   - name: instance provisioner:   name: ansible verifier:   name: ansible<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u0435\u0439 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>molecule init scenario<\/code> \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Molecule. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. <\/p>\n<p><strong>src\/molecule_custom_docker\/cookiecutter\/{{cookiecutter.molecule_directory}}\/{{cookiecutter.scenario_name}}\/molecule.yml<\/strong><\/p>\n<pre><code class=\"yaml\"> --- dependency:   name: {{cookiecutter.dependency_name}} driver:   name: {{cookiecutter.driver_name}} platforms:   - name: molecule-{{cookiecutter.role_name}}     image: python     tag: 3.10-slim-buster provisioner:   name: {{cookiecutter.provisioner_name}} verifier:   name: {{cookiecutter.verifier_name}}<\/code><\/pre>\n<p><strong>src\/molecule_custom_docker\/cookiecutter\/{{cookiecutter.molecule_directory}}\/{{cookiecutter.scenario_name}}\/converge.yml<\/strong><\/p>\n<pre><code class=\"yaml\">--- - name: Converge   hosts: all   gather_facts: true   tasks:     - name: Import role       ansible.builtin.import_role:         name: {{cookiecutter.role_name}}<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 <code>test_c<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <code>custom_docker<\/code> \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d:<\/p>\n<pre><code># \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 hello_world > molecule init scenario -d custom_docker test_c INFO Initializing new scenario test_c... INFO Initialized scenario in \/home\/pavel\/hello_world\/molecule\/test_c successfully.   > tree .\/molecule\/test_c .\/molecule\/test_c \u251c\u2500\u2500 converge.yml \u251c\u2500\u2500 molecule.yml \u2514\u2500\u2500 verify.yml   > cat .\/molecule\/test_c\/molecule.yml --- dependency:   name: galaxy driver:   name: custom_docker platforms:   - name: molecule-hello_world     image: python     tag: 3.10-slim-buster provisioner:   name: ansible verifier:   name: ansible<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434 <code>molecule create<\/code> \u0438 <code>molecule destroy<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 <code>create.yml<\/code>, <code>destroy.yml<\/code>. \u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f. \u041f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>playbooks<\/code>:<\/p>\n<p><strong>src\/molecule_custom_docker\/playbooks\/create.yml<\/strong><\/p>\n<pre><code class=\"yaml\">--- - name: Create   hosts: localhost   connection: local   gather_facts: false   no_log: \"{{ molecule_no_log }}\"     tasks:     - name: Simulate instance creation       ansible.builtin.debug:         msg: Creating instance<\/code><\/pre>\n<p><strong>src\/molecule_custom_docker\/playbooks\/destroy.yml<\/strong><\/p>\n<pre><code class=\"yaml\">--- - name: Destroy   hosts: localhost   connection: local   gather_facts: false   no_log: \"{{ molecule_no_log }}\"       tasks:     - name: Destroying instance       ansible.builtin.debug:         msg: \"Destroying instance\"<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 <code>test_c<\/code>:<\/p>\n<pre><code>> molecule create -s test_c   PLAY [Create] ******************************************************************   TASK [Simulate instance creation] ********************************************** ok: [localhost] => {     \"msg\": \"Creating instance\" }   PLAY RECAP ********************************************************************* localhost              : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   > molecule destroy -s test_c ... PLAY [Destroy] *****************************************************************   TASK [Destroying instance] ***************************************************** ok: [localhost] => {     \"msg\": \"Destroying instance\" }   PLAY RECAP ********************************************************************* localhost              : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   INFO Pruning extra files from scenario ephemeral directory Traceback (most recent call last): ...   File \"\/home\/pavel\/hello_world\/venv\/lib\/python3.10\/site-packages\/molecule\/driver\/base.py\", line 147, in safe_files     return self.default_safe_files + self._config.config[\"driver\"][\"safe_files\"] TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'<\/code><\/pre>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0418\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u043e\u0448\u0438\u0431\u043a\u0438, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/driver\/base.py#L92\"><u>default_safe_files<\/u><\/a>:<\/p>\n<p><strong>src\/molecule_custom_docker\/driver.py<\/strong><\/p>\n<pre><code class=\"python\">from molecule.api import Driver from molecule import logger   import os   LOG = logger.get_logger(__name__)   class CustomDocker(Driver):     def __init__(self, config=None):         super(CustomDocker, self).__init__(config)         self._name = \"custom_docker\"       @property     def name(self):         return self._name       @name.setter     def name(self, value):         self._name = value       @property     def default_safe_files(self):         # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0434\u0451\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438         return []<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 <code>driver.py<\/code> \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430\u0445 <code>create<\/code> \u0438 <code>destroy<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e:<\/p>\n<p><strong>src\/molecule_custom_docker\/playbooks\/create.yml<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- - name: Create   hosts: localhost   connection: local   gather_facts: false   no_log: \"{{ molecule_no_log }}\"   tasks:     - name: Create requested Docker instances       community.docker.docker_container:         name: \"{{ item.name }}\"         hostname: \"{{ item.name }}\"         image: \"docker.io\/library\/{{ item.image }}:{{ item.tag }}\"         state: started         command: \"bash -c 'while true; do sleep 10000; done'\"       register: platform       with_items: \"{{ molecule_yml.platforms }}\"       loop_control:         label: \"{{ item.name }}\"       async: 7200       poll: 0           - name: Wait for instances creation to complete       ansible.builtin.async_status:         jid: \"{{ item.ansible_job_id }}\"       register: docker_jobs       until: docker_jobs.finished       retries: 100       with_items: \"{{ platform.results }}\"<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>src\/molecule_custom_docker\/playbooks\/destroy.yml<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- - name: Destroy   hosts: localhost   connection: local   gather_facts: false   no_log: \"{{ molecule_no_log }}\"   tasks:     - name: Destroy created Docker instances       community.docker.docker_container:         name: \"{{ item.name }}\"         state: absent       register: platform       with_items: \"{{ molecule_yml.platforms }}\"       loop_control:         label: \"{{ item.name }}\"       async: 7200       poll: 0           - name: Wait for instances deletion to complete       ansible.builtin.async_status:         jid: \"{{ item.ansible_job_id }}\"       register: docker_jobs       until: docker_jobs.finished       retries: 100       with_items: \"{{ platform.results }}\"<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f <code>community.docker<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043a\u0430\u043a Ansible-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/driver\/base.py#L293\"><u>required_collections<\/u><\/a>:<\/p>\n<p><strong>src\/molecule_custom_docker\/driver.py<\/strong><\/p>\n<pre><code class=\"python\">class CustomDocker(Driver):     ...     @property     def required_collections(self):         return {\"community.docker\": \"3.4.6\"}<\/code><\/pre>\n<p>\u0412\u0435\u0440\u0441\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439. \u0412\u0441\u0435 Ansible-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 <a href=\"https:\/\/ansible.readthedocs.io\/projects\/molecule\/configuration\/#dependency\"><u>dependency<\/u><\/a> \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f <code>test_c<\/code>:<\/p>\n<pre><code>> molecule create -s test_c ... INFO Running test_c > dependency INFO Running from \/home\/pavel\/hello_world : ansible-galaxy collection install -vvv community.docker:>=3.4.6 ... INFO Running test_c > create   PLAY [Create] ******************************************************************   TASK [Create requested Docker instances] *************************************** changed: [localhost] => (item=molecule-hello_world)   TASK [Wait for instances creation to complete] ********************************* changed: [localhost] => (item={'failed': 0, 'started': 1, 'finished': 0, 'ansible_job_id': 'j538221924929.3055431', 'results_file': '\/home\/pavel\/.ansible_async\/j538221924929.3055431', 'changed': True, 'item': {'image': 'python', 'name': 'molecule-hello_world', 'tag': '3.10-slim-buster'}, 'ansible_loop_var': 'item'})   PLAY RECAP ********************************************************************* localhost              : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   INFO Running test_c > prepare WARNING  Skipping, prepare playbook not configured.<\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c.<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>molecule create<\/code> \u0438 <code>molecule destroy<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>src\/molecule_custom_docker\/ \u251c\u2500\u2500 cookiecutter \u2502   \u251c\u2500\u2500 cookiecutter.json \u2502   \u2514\u2500\u2500 {{cookiecutter.molecule_directory}} \u2502   \u2514\u2500\u2500 {{cookiecutter.scenario_name}} \u2502       \u251c\u2500\u2500 converge.yml \u2502       \u2514\u2500\u2500 molecule.yml \u251c\u2500\u2500 driver.py \u251c\u2500\u2500 __init__.py \u2514\u2500\u2500 playbooks     \u251c\u2500\u2500 create.yml     \u2514\u2500\u2500 destroy.yml<\/code><\/pre>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/h2>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u00ab\u043f\u0440\u043e\u0433\u043e\u043d\u0430\u00bb \u0440\u043e\u043b\u0438 <code>hello_wolrd<\/code> \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f <code>test_c<\/code>:<\/p>\n<pre><code>> molecule converge -s test_c   ...   INFO Running test_c > converge   PLAY [Converge] ****************************************************************   TASK [Gathering Facts] ********************************************************* fatal: [molecule-hello_world]: UNREACHABLE! => {\"changed\": false, \"msg\": \"Failed to connect to the host via ssh: ssh: Could not resolve hostname molecule-hello_world: Name or service not known\", \"unreachable\": true}   PLAY RECAP ********************************************************************* molecule-hello_world   : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0<\/code><\/pre>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e Molecule \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c \u0447\u0435\u0440\u0435\u0437 SSH. \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/driver\/base.py#L107\"><u>ansible_connections_options<\/u><\/a>, \u0433\u0434\u0435 \u0441\u043c\u0435\u043d\u0438\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441 SSH \u043d\u0430 <code>community.docker.docker<\/code>:<\/p>\n<p><strong>src\/molecule_custom_docker\/driver.py<\/strong><\/p>\n<pre><code class=\"python\">class CustomDocker(Driver):       ...       def ansible_connection_options(self, instance_name):         \"\"\"\u041e\u043f\u0446\u0438\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f Ansible, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u043d\u044b inventory.\"\"\"         return {\"ansible_connection\": \"community.docker.docker\"}<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f converge \u043d\u0430 \u0445\u043e\u0441\u0442\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e:<\/p>\n<pre><code>> molecule converge -s test_c   ...   INFO Running test_c > converge   PLAY [Converge] ****************************************************************   TASK [Gathering Facts] ********************************************************* ok: [molecule-hello_world]   TASK [hello_world : Say hello to user] ***************************************** ok: [molecule-hello_world] => {     \"msg\": \"Hello, dear user\" }   PLAY RECAP ********************************************************************* molecule-hello_world   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0<\/code><\/pre>\n<p>\u0423\u0440\u0430! \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0441\u0442\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 molecule login<\/h2>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 Molecule \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0437\u0430\u0439\u0442\u0438 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0438 <code>custom_docker<\/code> \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>driver.py <\/code>\u043f\u0443\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/driver\/base.py#L99\"><u>login_options<\/u><\/a> \u0438 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/driver\/base.py#L75\"><u>login_cmd_template<\/u><\/a>. \u041f\u0435\u0440\u0432\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0446\u0438\u0439 \u043a\u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e, \u0432\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>src\/molecule_custom_docker\/driver.py<\/strong><\/p>\n<pre><code class=\"python\">class CustomDocker(Driver):       ...       def login_options(self, instance_name):         \"\"\"\u041d\u0430\u0431\u043e\u0440 \u043e\u043f\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b login.\"\"\"         return {\"instance\": instance_name}       @property     def login_cmd_template(self):         return (             \"docker exec \"             \"-e COLUMNS={columns} \"             \"-e LINES={lines} \"             \"-e TERM=bash \"             \"-e TERM=xterm \"             \"-ti {instance} bash\"         )<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>instance<\/code> \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>login_options<\/code>, <code>columns<\/code> \u0438 <code>lines<\/code> \u2014 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/command\/login.py#L93\"><u>\u0438\u0437 Molecule \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/u><\/a>. \u0412\u0441\u0435 \u043a\u043b\u044e\u0447\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 <code>login_options<\/code>, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <code>login_cmd_template<\/code>.<\/p>\n<p>\u041e\u0431\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>molecule login<\/code>. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u0437 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f <code>test_c<\/code>:<\/p>\n<pre><code>> molecule login -s test_c -h molecule-hello_world   INFO Running test_c > login root@molecule-hello_world:\/# exit<\/code><\/pre>\n<p><strong>\u0418\u0442\u043e\u0433:<\/strong> \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 molecule_login.<\/p>\n<h2>\u0411\u043e\u043d\u0443\u0441: \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/h2>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b login \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f ID \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0430 \u043d\u0435 \u0435\u0433\u043e \u0438\u043c\u044f.<\/p>\n<p>\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u043b\u0435\u0439\u0431\u0443\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 ID, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430:<\/p>\n<p><strong>src\/molecule_custom_docker\/playbooks\/create.yml<\/strong><\/p>\n<pre><code class=\"yaml\">- name: Gather info about created containers   community.docker.docker_container_info:     name: \"{{ job_result.item.name }}\"   register: container_info   with_items: \"{{ platform.results }}\"   loop_control:     loop_var: job_result     label: \"{{ job_result.item.name }}\"   - name: Populate instance config   ansible.builtin.set_fact:     instance_conf_dict: {       'instance': \"{{ item.name }}\",       'image': \"docker.io\/library\/{{ item.image }}:{{ item.tag }}\",       'tag': \"{{ item.tag }}\",       'ID': \"{{ container_info.results[i].container.Id }}\"     }   with_items: \"{{ molecule_yml.platforms }}\"   loop_control:     label: \"{{ item.name }}\"     index_var: i   register: instance_config_dict   - name: Convert instance config dict to a list   ansible.builtin.set_fact:     instance_conf: \"{{ instance_config_dict.results | map(attribute='ansible_facts.instance_conf_dict') | list }}\"   - name: Dump instance config   ansible.builtin.copy:     content: \"{{ instance_conf | to_json | from_json | to_yaml }}\"     dest: \"{{ molecule_instance_config }}\"     mode: 0600<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>molecule create<\/code> \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b <code>~\/.cache\/molecule\/&lt;role_name>\/&lt;scenario_name>\/instance_config.yml<\/code> , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445.<\/p>\n<p><strong>~\/.cache\/molecule\/hello_world\/test_c\/instance_config.yml<\/strong><\/p>\n<pre><code class=\"yaml\">- {ID: e9ec39e81e4f85cff47f6ace3cbaf409dbe7846db307241d94a72fcdec89d108, image: 'docker.io\/library\/python:3.10-slim-buster, instance: molecule-hello_world, tag: 3.10-slim-buster}<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0430 ID \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b Ansible-\u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 Python-\u043a\u043e\u0434\u0430. \u041f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430 <code>instance_config.yml<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 <code>Driver._config.driver.instance_config<\/code>.<\/p>\n<p>\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 <code>molecule login<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f ID \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:<\/p>\n<p><strong>src\/molecule_custom_docker\/driver.py<\/strong><\/p>\n<pre><code class=\"python\">from molecule import util   ...   class CustomDocker(Driver):       ...           def _get_instance_config(self, instance_name):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u043c\u0438 \u0438\u0437 instance_config.yml\"\"\"         instance_config_dict = util.safe_load_file(self._config.driver.instance_config)         return next(             item for item in instance_config_dict if item[\"instance\"] == instance_name         )       def login_options(self, instance_name):         instance_config = self._get_instance_config(instance_name)         return {\"id\": instance_config[\"ID\"]}       @property     def login_cmd_template(self):         return (             \"docker exec \"             \"-e COLUMNS={columns} \"             \"-e LINES={lines} \"             \"-e TERM=bash \"             \"-e TERM=xterm \"             \"-ti {id} bash\"         )<\/code><\/pre>\n<p><strong>\u0418\u0442\u043e\u0433:<\/strong> \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>molecule login<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435.<\/p>\n<h2>\u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d. \u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/h2>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u0420\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0434\u0430\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Ansible \u0438\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python. \u0422\u0430\u043a \u0431\u044b\u043b\u043e \u0443 \u043d\u0430\u0441. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f. \u0412\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Python? \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0435\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u043a \u043f\u0430\u043a\u0435\u0442\u0443. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Ansible-\u043c\u043e\u0434\u0443\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0441 <code>ansible.builtin<\/code>? \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0432 <code>required_collections<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0447\u0435\u0440\u0435\u0437 lookup-\u043c\u043e\u0434\u0443\u043b\u044c, \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e. \u042d\u0442\u043e \u043d\u0435 \u0440\u0430\u0437 \u0441\u043f\u0430\u0441\u0430\u043b\u043e \u043d\u0430\u0441 \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430.\u00a0<\/p>\n<\/li>\n<li>\n<p><code>README.md<\/code> \u0441\u043f\u0430\u0441\u0435\u0442 \u0432\u0430\u0441 \u043e\u0442 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0447\u0430\u0442\u0430\u0445 \u0438 \u043f\u043e\u0447\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u0430\u043a \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f molecule_custom_docker \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/VorobevPavel-dev\/molecule_custom_docker\">\u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 GitHub<\/a>.<\/p>\n<blockquote>\n<p><strong>\u0422\u0435\u043a\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u0441 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c:<\/strong>  <\/p>\n<p>\u2192\u00a0<a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/754922\/\">\u041a\u0430\u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0437\u0430\u0434\u0430\u0447 \u0432 Jenkins \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 parallel: \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a><\/p>\n<p>\u2192 <a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/755824\/\">\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u0442: \u043e\u0442 \u042d\u0439\u0441\u043b\u0435\u0440\u0430 \u0434\u043e \u043d\u0430\u0448\u0438\u0445 \u0434\u043d\u0435\u0439<\/a><\/p>\n<p>\u2192\u00a0<a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/747308\/\">\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Go \u0431\u0435\u0437 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432<\/a><\/p>\n<\/blockquote>\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\/764906\/\"> https:\/\/habr.com\/ru\/articles\/764906\/<\/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>\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 2023 \u0433\u043e\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 <abbr class=\"habraabbr\" title=\"\u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u0438 Ansible\" data-title=\"&lt;p>\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u0438 Ansible&#187; data-title=&#187;&lt;p>\u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u043b\u0438 Ansible&lt;\/p>&#187; data-abbr=&#187;Molecule&#187;>Molecule<\/abbr> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043c\u0430\u0436\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 5.0.0.  \u041f\u043e\u043c\u0438\u043c\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u0433\u0444\u0438\u043a\u0441\u043e\u0432 \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a <code>molecule.docker<\/code> \u0438\u043b\u0438 <code>molecule.openstack<\/code>. \u042f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b <s>\u0438\u043b\u0438 \u043f\u043b\u043e\u0445\u043e \u0438\u0441\u043a\u0430\u043b<\/s> \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u2014 \u043e\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u00abHello world\u00bb \u0434\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 <code>custom_docker<\/code> \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 <code>molecule.docker<\/code>,  \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0437 API Molecule, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f. <\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u0441 \u0440\u0435\u043b\u0438\u0437\u043e\u043c 5.0.0 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0441\u0442\u0430\u043b\u043e \u043f\u0440\u043e\u0449\u0435<\/h2>\n<p>\u0412 YADRO \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439 \u0438 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0412\u041c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u044f\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a: \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c XML-\u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0438\u0441\u043a\u0438. \u0423 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b. \u0412\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 <code>molecule.libvirt<\/code>.<\/p>\n<p>\u0414\u043e \u0440\u0435\u043b\u0438\u0437\u0430 5.0.0 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0438\u0445 \u0440\u043e\u043b\u0435\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>\u251c\u2500\u2500 molecule \u2502   \u2514\u2500\u2500 default \u2502   \u251c\u2500\u2500 cleanup.yml \u2502   \u251c\u2500\u2500 converge.yml \u2502   \u251c\u2500\u2500 create.yml \u2502   \u251c\u2500\u2500 destroy.yml \u2502   \u251c\u2500\u2500 molecule.yml \u2502   \u251c\u2500\u2500 tasks \u2502   \u2502   \u251c\u2500\u2500 get-vm-info.yml \u2502   \u2502   \u2514\u2500\u2500 resize.yml \u2502   \u2514\u2500\u2500 templates \u2502       \u2514\u2500\u2500 vm_template.xml.j2<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0444\u0430\u0439\u043b\u043e\u0432 <code>molecule<\/code>, <code>converge<\/code> \u0438 <code>verify<\/code>, \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c \u0432\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b: \u0437\u0430\u0434\u0430\u0447\u0438, \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438. \u041f\u043e\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0431\u0435\u0437 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0438\u0437 \u0440\u043e\u043b\u0438 \u0432 \u0440\u043e\u043b\u044c, \u0438\u0437 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439.<\/p>\n<p>\u042d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u0440\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u2014 \u043a\u0430\u043a \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445:<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0440\u043e\u043b\u0438<\/strong> <strong>\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443<\/strong> \u2014 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0432\u044b\u0448\u0430\u043b\u0441\u044f \u043f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f.<\/strong> \u041d\u043e\u0432\u043e\u043f\u0440\u0438\u0431\u044b\u0432\u0448\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0432\u043e\u0440\u043e\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0441 \u0444\u0440\u0430\u0437\u043e\u0439: \u00ab\u042d\u0442\u043e \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435, \u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f\u00bb. \u041d\u043e, \u0435\u0441\u043b\u0438 \u0435\u043c\u0443 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0431\u0430\u0433, \u044d\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438: \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u043b\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u0434\u0442\u0438 \u043a \u0430\u0432\u0442\u043e\u0440\u0443 \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/strong>, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043a\u0438 \u0432 XML-\u0448\u0430\u0431\u043b\u043e\u043d \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c, \u0433\u0434\u0435-\u0442\u043e \u2014 \u0441 \u043d\u043e\u0432\u044b\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u2014 \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043c\u0443\u0442\u043e\u0440\u043d\u043e. \u0414\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u0440\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u2014 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0445\u0443 \u0432 Git-\u0434\u0435\u0440\u0435\u0432\u0435. \u042f \u0440\u0435\u0448\u0438\u043b \u0441\u043a\u0440\u044b\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u0447\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Molecule, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f Molecule \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 5.0.0, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c\u0441\u044f. \u0418\u043c\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 JSON-\u0441\u0445\u0435\u043c\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Molecule. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u043e\u0439, \u043d\u043e \u0438 \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Molecule, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b JSON-\u0441\u0445\u0435\u043c\u044b. \u0410 \u0437\u0430\u0442\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043f\u0438\u0438 \u0434\u0432\u0443\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432.<\/p>\n<p><strong>\u041f\u043e\u0441\u043b\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 5.0.0 \u044d\u0442\u0430\u043f \u0441 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/strong> \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u2014 molecule-*<em>,<\/em> molecule_<em>*<\/em>, custom-*<em> <\/em>\u0438\u043b\u0438 custom_*, \u0442\u043e \u043e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043d\u0430\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0434\u043e \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0439:<\/p>\n<pre><code>\u2514\u2500\u2500 molecule     \u2514\u2500\u2500 default         \u251c\u2500\u2500 verify.yml         \u251c\u2500\u2500 converge.yml         \u2514\u2500\u2500 molecule.yml<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u043b \u0442\u0430\u043a\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u2014 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438.<\/p>\n<h2>\u0421\u0442\u0430\u0440\u0442 \u0440\u0430\u0431\u043e\u0442\u044b<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Docker. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b Molecule-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u2014 <code>molecule_custom_docker<\/code> \u0438 <code>hello_world<\/code>. \u0412\u043d\u0443\u0442\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f Ansible-\u0440\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 Molecule \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u043e\u043b\u0438 hello_world:<\/p>\n<pre><code>.\/hello_world \u2514\u2500\u2500 tasks     \u2514\u2500\u2500 main.yml<\/code><\/pre>\n<p><strong>hello_world\/tasks\/main.yml<\/strong><\/p>\n<pre><code class=\"yaml\">--- - name: Say hello to user   ansible.builtin.debug:     msg: \"Hello, dear user\"<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c Python \u043d\u0435 \u0441\u0442\u0430\u0440\u0435\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 3.10 \u0438 Molecule \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 5.0.1 \u0438 \u0432\u044b\u0448\u0435. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f Ansible.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u043b\u0430\u0433\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Docker, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u0440\u0443\u0442\u043e\u0432\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/docs.docker.com\/engine\/install\/linux-postinstall\/#manage-docker-as-a-non-root-user\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 Docker<\/u><\/a>.<\/p>\n<h2>\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h2>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 <code>molecule_custom_driver<\/code>, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 Python-\u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 <code>custom_docker<\/code>. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 <code>molecule create<\/code> \u0438 <code>molecule destroy<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 <code>molecule converge<\/code> \u0438 <code>molecule login<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0435\u0445\u0430\u043b\u0438! <\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>molecule_custom_docker<\/code>, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:<\/p>\n<pre><code>. \u251c\u2500\u2500 .git \u251c\u2500\u2500 .gitignore \u251c\u2500\u2500 pyproject.toml \u251c\u2500\u2500 setup.cfg \u251c\u2500\u2500 src \u2502   \u2514\u2500\u2500 molecule_custom_docker \u2502   \u251c\u2500\u2500 driver.py \u2502   \u2514\u2500\u2500 __init__.py \u2514\u2500\u2500 venv<\/code><\/pre>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/github.com\/ansible-community\/molecule\/blob\/v5.0.1\/src\/molecule\/driver\/base.py\"><u>molecule.api.Driver<\/u><\/a>, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u044f <code>_name<\/code>. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e Molecule \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435:<\/p>\n<p><strong>src\/molecule_custom_docker\/driver.py<\/strong><\/p>\n<pre><code class=\"python\">from molecule.api import Driver from molecule import logger   LOG = logger.get_logger(__name__)   class CustomDocker(Driver):     def __init__(self, config=None):         super(CustomDocker, self).__init__(config)         self._name = \"custom_docker\"       @property     def name(self):         return self._name       @name.setter     def name(self, value):         self._name = value<\/code><\/pre>\n<p>\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 <code>pyproject.toml<\/code> \u0438 <code>setup.cfg<\/code> \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 <code>molecule_docker<\/code>:<\/p>\n<p><strong>setup.cfg<\/strong><\/p>\n<pre><code>[metadata] name = molecule_custom_docker description = Molecule Custom Docker Plugin :: run molecule tests on Docker images classifiers =     Development Status :: 2 - Pre-Alpha     Environment :: Console     Intended Audience :: Developers     Intended Audience :: Information Technology     Intended Audience :: System Administrators     Natural Language :: English     Operating System :: OS Independent     Programming Language :: Python :: 3     Programming Language :: Python :: 3.10       Topic :: System :: Systems Administration     Topic :: Utilities   keywords =     ansible     roles     testing     molecule     plugin     docker   [options] use_scm_version = True python_requires = >=3.10 package_dir =   = src packages = find: include_package_data = True zip_safe = False   install_requires =    molecule >= 5.0.1   [options.entry_points] molecule.driver =    custom_docker = molecule_custom_docker.driver:CustomDocker   [options.packages.find] where = src<\/code><\/pre>\n<p><strong>pyproject.toml<\/strong><\/p>\n<pre><code>[build-system] requires = [   \"pip >= 19.3.1\",   \"setuptools >= 42\",   \"setuptools_scm[toml] >= 3.5.0\",   \"setuptools_scm_git_archive >= 1.1\",   \"wheel >= 0.33.6\", ] build-backend = \"setuptools.build_meta\"   [tool.setuptools_scm] local_scheme = \"no-local-version\"<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f TOML \u0438 CFG-\u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u043e\u0434 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432 Python-\u043f\u0430\u043a\u0435\u0442, \u0430 \u0441\u0430\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 custom_docker \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Molecule. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c:<\/p>\n<pre><code># \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 molecule_custom_docker > cd ..\/hello_world > source venv\/bin\/activate > pip install -e ..\/molecule_custom_docker\/ > molecule drivers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   custom_docker                                                                                                                                                                                                                           delegated<\/code><\/pre>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 CookieCutter<\/h2>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f:<\/p>\n<pre><code># \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 hello_world > molecule init scenario -d custom_docker default INFO Initializing new scenario default... CRITICAL The specified template directory (\/home\/pavel\/hello_world\/venv\/lib\/python3.10\/site-packages\/molecule\/cookiecutter\/scenario\/driver\/custom_docker) does not exist<\/code><\/pre>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e Molecule \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0438\u0449\u0435\u0442 \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 cookiecutter.<\/p>\n<p><a href=\"https:\/\/github.com\/cookiecutter\/cookiecutter\"><u>CookieCutter<\/u><\/a> \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/github.com\/pallets\/jinja\"><u>Jinja2<\/u><\/a><u>&#8212;<\/u>\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. CookieCutter-\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0438\u043b\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0433\u0434\u0435 \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b cookiecutter.json \u2014 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u043e \u0438 \u0434\u043b\u044f \u0438\u043c\u0435\u043d \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <code>cookiecutter: {{ cookiecutter.&lt;variable_name> }}<\/code>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d CookieCutter \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:<\/p>\n<pre><code>src\/molecule_custom_docker \u251c\u2500\u2500 cookiecutter \u2502   \u2514\u2500\u2500 cookiecutter.json \u251c\u2500\u2500 driver.py \u2514\u2500\u2500 __init__.py<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <code>cookiecutter.json<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<p><strong>src\/molecule_custom_docker\/cookiecutter\/cookiecutter.json<\/strong><\/p>\n<pre><code class=\"json\">{     \"molecule_directory\": \"molecule\",     \"dependency_name\": \"OVERRIDDEN\",     \"driver_name\": \"OVERRIDDEN\",     \"provisioner_name\": \"OVERRIDDEN\",     \"scenario_name\": \"OVERRIDDEN\",     \"role_name\": \"OVERRIDDEN\",     \"verifier_name\": \"OVERRIDDEN\" }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 CookieCutter, \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0438\u0434\u0430 <code>\"{{ cookiecutter.molecule_directory }}\"<\/code> \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 <code>\"molecule\"<\/code>, <code>\"{{ cookiecuter.dependency_name }}\"<\/code> \u043d\u0430 <code>\"OVERRIDDEN\"<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>\"OVERRIDDEN\"<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c. \u041e\u043d\u043e<\/p>\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-356469","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/356469","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=356469"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/356469\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=356469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=356469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=356469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}