{"id":462586,"date":"2025-06-09T15:01:26","date_gmt":"2025-06-09T15:01:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=462586"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=462586","title":{"rendered":"<span>VMmanager, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 VMmanager API \u0438 Ansible<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/971\/7dd\/fa0\/9717ddfa00e4148e438222968321c692.JPG\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/971\/7dd\/fa0\/9717ddfa00e4148e438222968321c692.JPG 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/971\/7dd\/fa0\/9717ddfa00e4148e438222968321c692.JPG 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043b\u044e\u0431\u0438\u043c\u043e\u043c\u0443 \u043c\u043d\u043e\u0439 IaC. \u0427\u0442\u043e\u0431\u044b \u0432\u0432\u0435\u0441\u0442\u0438 \u0432 \u043a\u0443\u0440\u0441 \u0434\u0435\u043b\u0430, \u043a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e VMmanager \u0438 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u0417\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 VMmanager \u0441 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c Infrastructure as Code, \u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u043f\u0440\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b VMmanager \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u0432 \u043d\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible.<\/p>\n<h2>\u041e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 VMmanager<\/h2>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 VMmanager. \u042d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u041e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 VMmanager Hosting \u0438 VMmanager Infrastructure \u2014 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0435\u0440\u0441\u0438\u044f<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Hosting<\/p>\n<\/td>\n<td>\n<p align=\"left\">Infrastructure<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u2014 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u0432 IT-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u0430\u0432<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u2014 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<br \/>\u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0440\u0435\u043d\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<br \/>\u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u0415\u0434\u0438\u043d\u043e\u043c \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 <br \/>\u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u041e\u0421 Astra Linux, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0424\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u043e\u0439 \u043f\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044e (\u0424\u0421\u0422\u042d\u041a \u0420\u043e\u0441\u0441\u0438\u0438)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>VMmanager \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 ISPsystem, \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u043c\u0438, \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044c.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c5\/43b\/b45\/7c543bb45a3dcc4eae0a502ed4ed4b5a.png\" width=\"809\" height=\"601\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7c5\/43b\/b45\/7c543bb45a3dcc4eae0a502ed4ed4b5a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c5\/43b\/b45\/7c543bb45a3dcc4eae0a502ed4ed4b5a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div class=\"floating-image\">\n<p>\u042f \u0431\u0443\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 VMmanager Infrastructure.<\/p>\n<\/div>\n<h2>IaC-\u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 Infrastructure as Code \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 VMmanager \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 Terraform \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c VMmanager API. \u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Terraform \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 <a href=\"https:\/\/habr.com\/ru\/companies\/ispsystem\/articles\/688616\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f.<\/a> \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043c\u0441\u044f \u043d\u0430 Ansible. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 (\u0441\u043f\u043e\u0439\u043b\u0435\u0440: \u043d\u0430\u0431\u043e\u0440 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044c ansible.builtin.uri). \u0410 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u044f \u043f\u043e\u0433\u0440\u0443\u0436\u0443\u0441\u044c \u0432 VMmanager API \u0438 \u043d\u0430\u043f\u0438\u0448\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430 Python.<\/p>\n<h2>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 VMmanager API \u0438 Ansible<\/h2>\n<h3>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b VMmanager, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Astra Linux \u0432\u0435\u0440\u0441\u0438\u0438 1.8.1 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u00ab\u041e\u0440\u0435\u043b\u00bb. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0437, \u0435\u0433\u043e \u044f \u0438 \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432 Yandex Cloud. \u0423\u0437\u0435\u043b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c: \u0432 VMmanager \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <a href=\"https:\/\/www.ispsystem.ru\/docs\/vmmanager-admin\/razrabotchiku\/sozdanie-klastera-zaglushki\" rel=\"noopener noreferrer nofollow\">\u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443<\/a>, \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0443\u0437\u043b\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c: \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438 \u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0448\u0430\u0433\u0438 \u2014 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u043f\u043e \u043d\u0438\u043c \u0438\u0434\u0442\u0438, \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f; \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0442\u0435\u043c\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0443\u043c\u0435\u0441\u0442\u043d\u043e \u0441\u044e\u0434\u0430 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u043f\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u041d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 Yandex Cloud \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437 \u0432\u0441\u0435\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \/etc\/apt\/sources.list. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b \u00ab\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0443\u0437\u043b\u0430\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u00bb \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e VMmanager. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c step-by-step \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 VMmanager \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible. \u041d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0448\u0430\u0433\u043e\u0432 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u043e IaC, \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u044e \u0432\u0441\u0435 \u0448\u0430\u0433\u0438, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u0440\u0438\u0430\u043b, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0437\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0433\u043b\u0430\u0437\u0430, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 VMmanager.\u00a0<\/p>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b ISPsystem \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0442\u0440\u0438\u0430\u043b \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0435\u043c\u043e\u0441\u0442\u0435\u043d\u0434\u0443. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u043d\u0430 \u0441\u0430\u0439\u0442\u0435: <a href=\"https:\/\/www.ispsystem.ru\/dcimanager\" rel=\"noopener noreferrer nofollow\">DCImanager<\/a>, <a href=\"https:\/\/www.ispsystem.ru\/vmmanager\" rel=\"noopener noreferrer nofollow\">VMmanager<\/a>, <a href=\"https:\/\/www.ispsystem.ru\/billmanager\" rel=\"noopener noreferrer nofollow\">BILLmanager<\/a>, <a href=\"https:\/\/www.ispsystem.ru\/dnsmanager\" rel=\"noopener noreferrer nofollow\">DNSmanager<\/a>.<\/p>\n<p>\u041d\u0430\u0441 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u0440\u0438\u0430\u043b \u0434\u043b\u044f VMmanager.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Ansible \u043d\u0430 \u041f\u041a, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/installation_guide\/intro_installation.html?roistat_visit=2788175\" rel=\"noopener noreferrer nofollow\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Ansible.<\/a><\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u041f\u041a \u0441 Ansible:<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430 \u041f\u041a \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 curl, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0435\u0435:\u00a0<\/p>\n<p><code>dnf install curl || apt install curl<\/code><\/p>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:\u00a0<\/p>\n<p><code>curl <\/code><a href=\"https:\/\/download.ispsystem.com\/extras\/ansible\/vmmanager6_common.tar.gz\" rel=\"noopener noreferrer nofollow\"><code>https:\/\/download.ispsystem.com\/extras\/ansible\/vmmanager6_common.tar.gz<\/code><\/a><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 SSH-\u043a\u043b\u044e\u0447 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u2014 <a href=\"https:\/\/www.ispsystem.ru\/docs\/vmmanager-admin\/vnutrennee-ustrojstvo\/ispol-zuemye-podsistemy\/ssh-protokol\" rel=\"noopener noreferrer nofollow\">\u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e SSH-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/a><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:\u00a0<\/p>\n<p><code>mkdir vm6_ansible<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u043f\u0430\u043a\u0443\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0430\u0440\u0445\u0438\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c\u0438:\u00a0<\/p>\n<p><code>tar xzf vmmanager6_common.tar.gz -C vm6_ansible\/<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e:<\/p>\n<p><code>cd vm6_ansible<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0436\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 vars \u0444\u0430\u0439\u043b\u0430 vmmanager6.yml:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"yaml\">  vars:     vmi_first_username: \"admin@example.com\"     vmi_first_password: \"q1w2e3r4\"     vmmanager6_license_token: \"..........:...................\"     vmi_domain: \"{{ ansible_ssh_host }}\" # \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0432 Yandex Cloud,  # \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0442\u0438 \u0431\u0435\u0440\u0435\u043c \u043f\u043e \u0444\u0430\u043a\u0442\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c.      vmi_network: \"10.177.91.0\/24\"     vmi_network_gateway: \"10.177.91.1\"     vmi_network_note: \"some network notes\"     vmi_pool_name: \"some_pool\"     vmi_pool_note: \"testing pool\"     vmi_cluster_name: \"new_cluster\"     vmi_time_zone: \"UTC\"     vmi_cluster_note: \"some cluster note\"     vmi_domain_template: \".example.com\" # \u042f \u0443\u043a\u0430\u0437\u0430\u043b \u0434\u043b\u044f check ip \u0438\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a dns, \u043d\u043e \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u0441\u0442\u0430.     vmi_node_check_ip: \"10.177.181.142\" # \u041c\u044b \u0434\u0430\u043b\u0435\u0435 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f ssl \u0438 \u0431\u044d\u043a\u0430\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 # \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c.     vmi_certificate: \"-----BEGIN CERTIFICATE-----\\nMIIDkT\u2026\u20267s=\\n-----END CERTIFICATE-----\\n\"     vmi_certificate_key: \"-----BEGIN PRIVATE KEY-----\\nMI\u2026.BlXDeTd\\n-----END PRIVATE KEY-----\\n\"     vmi_certificate_ca: \"\"     vmi_backup_ip: \"10.177.91.71\"     vmi_backup_user: \"root\"     vmi_backup_password: \"q1w2e3p4\"     vmi_backup_path: \"\/backup\"<\/code><\/pre>\n<ol>\n<li>\n<p>\u041c\u044b \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 vmmanager6.yml \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p><code>#\u00a0 \u00a0 - include_tasks: cert.yml<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c, \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 vmmanager6.yml \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p><code>#\u00a0 \u00a0 - include_tasks: backup.yml<\/code><\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443: <\/p>\n<p><code>ansible-playbook -i &lt;IP&gt;, -u root vmmanager6.yml<\/code><\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e &lt;IP&gt; \u0443\u043a\u0430\u0436\u0438\u0442\u0435 ip \u0441\u0432\u043e\u0435\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0433\u043b\u0443\u0431\u0436\u0435 \u0432 Ansible-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 VMmanager. \u0412 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0430\u0440\u0445\u0438\u0432\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0431\u043e\u0440 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b4e\/c05\/4b7\/b4ec054b701a058626d312458a7e20e9.png\" width=\"1431\" height=\"316\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b4e\/c05\/4b7\/b4ec054b701a058626d312458a7e20e9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b4e\/c05\/4b7\/b4ec054b701a058626d312458a7e20e9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div class=\"floating-image\">\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043b\u0435\u0439\u0431\u0443\u043a vmmanager6.yml, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.<\/p>\n<\/div>\n<pre><code class=\"yaml\">--- - name: Install VMmanager 6 playbook   hosts: all   debugger: on_failed   vars:     vmi_first_username: \"admin@example.com\"     vmi_first_password: \"q1w2e3r4\"     vmmanager6_license_token: \".............:................\"     vmi_domain: \"{{ ansible_ssh_host }}\"     vmi_network: \"10.177.91.0\/24\"     vmi_network_gateway: \"10.177.91.1\"     vmi_network_note: \"some network notes\"     vmi_pool_name: \"some_pool\"     vmi_pool_note: \"testing pool\"     vmi_cluster_name: \"new_cluster\"     vmi_time_zone: \"UTC\"     vmi_cluster_note: \"some cluster note\"     vmi_domain_template: \".example.com\"     vmi_node_check_ip: \"10.177.181.142\"     vmi_certificate: \"-----BEGIN CERTIFICATE-----\\nMIIDkT\u2026\u20267s=\\n-----END CERTIFICATE-----\\n\"     vmi_certificate_key: \"-----BEGIN PRIVATE KEY-----\\nMI\u2026.BlXDeTd\\n-----END PRIVATE KEY-----\\n\"    vmi_certificate_ca: \"\"     vmi_backup_ip: \"10.177.91.71\"     vmi_backup_user: \"root\"     vmi_backup_password: \"q1w2e3p4\"     vmi_backup_path: \"\/backup\"   tasks:     - include_tasks: remove_and_install.yml      - name: First time token       uri:         url: \"https:\/\/{{ vmi_domain }}\/auth\/v4\/public\/token\"         method: POST         body_format: json         status_code: [200,201,503]         return_content: yes         body:           email: \"{{ vmi_first_username }}\"           password: \"{{ vmi_first_password }}\"         validate_certs: no       register: first_token       retries: 3       delay: 30       until: first_token.status == 201      - name: make ses6 a fact       set_fact:         ses6: \"{{ (first_token.content|from_json).token }}\"      - include_tasks: first_run.yml #   - include_tasks: cert.yml     - include_tasks: setup_ip.yml     - include_tasks: cluster.yml     - include_tasks: storage.yml #   - include_tasks: backup.yml<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 cluster.yml, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f ansible.builtin.uri. <\/p>\n<pre><code class=\"yaml\">--- - name: Set up cluster   uri: # \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 API \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c url \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 url, # \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c.     url: \"https:\/\/{{ vmi_domain }}\/vm\/v3\/cluster\"     method: POST     body_format: json     status_code: [200, 401, 409, 500, 503]     headers:       Cookie: \"ses6={{ ses6 }}\"       x-xsrf-token: \"{{ ses6 }}\"     body:       name: \"{{ vmi_cluster_name }}\"       virtualization_type: \"kvm\"       time_zone: \"{{ vmi_time_zone }}\"       dns_servers:         - \"1.1.1.1\"       comment: \"{{ vmi_cluster_note }}\"       os:         - 1       iso_enabled: false       manage_disk_enabled: false       domain_template: \"{{ vmi_domain_template }}\"       domain_change_allowed: false       overselling: 1       host_per_node_limit: -1       host_distribution_policy: \"spread\"       host_filter: []       backup_locations: []       image_storage_path: \"\/image\"       os_storage_path: \"\/share\"       datacenter_type: \"common\"       interfaces:         - interface: 0           ippool: [ 1 ]       node_network:         gateway: \"{{ vmi_node_check_ip }}\"         timeout: 300       vxlan_mode: \"disabled\"     validate_certs: no   register: cluster   retries: 3   delay: 10   until: cluster.status == 200<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u044b \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043b\u0438 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447. ansible.builtin.uri \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 VMmanager API \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u0410 \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u0433\u0438\u044f\u2026 \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a VMmanager API \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.\u00a0<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043d\u0430 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 VMmanager API \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u0430\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 VMmanager \u2014 <a href=\"https:\/\/www.ispsystem.ru\/docs\/vmmanager-admin\/klastery\/sozdanie-klastera\" rel=\"noopener noreferrer nofollow\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u042d\u0442\u0438 \u0448\u0430\u0433\u0438 \u044f \u0442\u043e\u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c, \u0447\u0442\u043e \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c:<\/p>\n<p><code>update vm_cluster set virtualization_type = 'dummy' where id = &lt;cluster_id&gt;;\u00a0<\/code><\/p>\n<p>\u0413\u0434\u0435 \u2018dummy\u2019 \u0432 \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445.<\/p>\n<\/div>\n<\/details>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0412\u041c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f ansible.builtin.uri<\/h3>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0433\u043e\u0442\u043e\u0432\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 VMmanager, \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d, \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432 IaC \u2014 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b. \u041d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u2014 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f ansible.builtin.uri. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 VMmanager API \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0438\u0431\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<p>\u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u043c\u0435\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: \u043c\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0433\u043e Infrastructure as Code. VMmanager API \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e id, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u043c\u0435\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 \u0438\u043c\u0435\u043d\u0430\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u043d\u043e \u043c\u043e\u0434\u0443\u043b\u044c ansible.builtin.uri \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442. \u0412 POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c id, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c id.\u00a0<\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0430 \u044d\u0442\u043e Ansible. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. \u0421\u0435\u0442\u044c \u0438 \u043f\u0443\u043b IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043f\u0440\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u043e\u0442 \u0430\u0434\u043c\u0438\u043d\u0441\u043a\u043e\u0439, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c <a href=\"https:\/\/www.ispsystem.ru\/docs\/vmmanager-admin\/pol-zovateli\/dobavlenie-pol-zovatelej%5C\" rel=\"noopener noreferrer nofollow\">\u0438\u0437 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/a> \u0410 \u0434\u0430\u043b\u0435\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 API.<\/p>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u2014 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\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.<\/p>\n<pre><code class=\"yaml\">--- - name: Install VMmanager 6 playbook   hosts: all   debugger: on_failed   vars:     vmi_first_username: \"vm@example.com\"     vmi_first_password: \"uA2sW2nT9czV\"     vmi_domain: \"{{ ansible_ssh_host }}\"   tasks:     - name: First time token       uri:         url: \"https:\/\/{{ vmi_domain }}\/auth\/v4\/public\/token\"         method: POST         body_format: json         status_code: [200,201,503]         return_content: yes         body:           email: \"{{ vmi_first_username }}\"           password: \"{{ vmi_first_password }}\"         validate_certs: no       register: first_token       retries: 3       delay: 30       until: first_token.status == 201      - name: make ses6 a fact       set_fact:         ses6: \"{{ (first_token.content|from_json).token }}\"      - include_tasks: vm.yml<\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0430\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438.<\/p>\n<pre><code class=\"yaml\">\u2013 # \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0436\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b,  # \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 url \u0432\u044b\u0434\u0430\u0441\u0442 \u0432\u0441\u0435, \u0431\u0435\u0437 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438. - name: Get up vm   uri:     url: \"https:\/\/{{ vmi_domain }}\/vm\/v3\/host\"     method: GET     body_format: json     status_code: [200, 401, 409, 500, 503]     headers:       Cookie: \"ses6={{ ses6 }}\"       x-xsrf-token: \"{{ ses6 }}\"     validate_certs: no   # \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. - name: Set up vm   uri:     url: \"https:\/\/{{ vmi_domain }}\/vm\/v3\/host\"     method: POST     body_format: json     status_code: [200, 401, 409, 500, 503]     headers:       Cookie: \"ses6={{ ses6 }}\"       x-xsrf-token: \"{{ ses6 }}\"     body:       name: My_vm       password: vmsecret # \u0414\u043b\u044f cluster, ipv4_pool, os \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c id, \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u044b,  # \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.        cluster: 1       os: 1       ram_mib: 512       hdd_mib: 5000       cpu_number: 1       ipv4_pool: [1]     validate_certs: no<\/code><\/pre>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0412\u041c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f Ansible<\/h3>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 Infrastructure as Code. \u042f \u043d\u0430\u043f\u0438\u0448\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430 Python \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0432 VMmanager. \u0413\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Ansible \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b\u0442\u044c \u0442\u043e\u0447\u043d\u044b\u043c\u0438, \u0442\u043e \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f vm_info, vm \u0438 \u0434\u0432\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f auth_utils \u0438 info_utils. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u043c Ansible, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0431\u043e\u0440 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u0435 \u0432\u043d\u043e\u0441\u044f\u0449\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0432 \u043c\u043e\u0434\u0443\u043b\u044c info, \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u2014 \u0432\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043c\u043e\u0434\u0443\u043b\u044f auth_utils. \u041e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0432\u044b\u0437\u0432\u0430\u0432\u0448\u0438\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0434\u0443\u043b\u044c.<\/p>\n<pre><code class=\"python\"># -*- coding: utf-8 -*-  import json import time import urllib3 from ansible.module_utils.urls import open_url, SSLValidationError  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)  def get_auth_token(base_url, email, password, retries=3, delay=30, validate_certs_param=None, module=None):     \"\"\"     \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 API VMI.      :param base_url: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, https:\/\/vmi.example.com)     :param email: \u041b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     :param password: \u041f\u0430\u0440\u043e\u043b\u044c     :param retries: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a     :param delay: \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u043c\u0438     :param validate_certs_param: \u0441\u0442\u0440\u043e\u043a\u0430 'no' \u0438\u043b\u0438 None (\u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440)     :param module: \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 AnsibleModule \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043e\u043a     :return: \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438     \"\"\"     url = f\"{base_url}\/auth\/v4\/public\/token\"     headers = {         'Content-Type': 'application\/json'     }     body = json.dumps({         \"email\": email,         \"password\": password     })      last_exception = None     for attempt in range(1, retries + 1):         try:             kwargs = {                 \"url\": url,                 \"method\": \"POST\",                 \"headers\": headers,                 \"data\": body,             }              if validate_certs_param == \"no\":                 kwargs[\"validate_certs\"] = False              response = open_url(**kwargs)              if response.getcode() in (200, 201):                 result = json.loads(response.read())                 return result.get(\"token\")          except (SSLValidationError) as e:             last_exception = e             if module:                 module.warn(f\"\u041f\u043e\u043f\u044b\u0442\u043a\u0430 {attempt} \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c: {e}\")         time.sleep(delay)      if module:         module.fail_json(msg=\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a\", exception=str(last_exception))     else:         raise Exception(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430: {last_exception}\")<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 vm_info. \u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c info \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python  from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.auth_utils import get_auth_token from ansible.module_utils.info_utils import get_vmi_info  DOCUMENTATION = r''' --- module: vmi_info short_description: \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0445\u043e\u0441\u0442\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u0437 VMI API description:   - \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0447\u0435\u0440\u0435\u0437 auth_utils.get_auth_token, \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u043b\u0430\u0435\u0442 GET \u0437\u0430\u043f\u0440\u043e\u0441 \u0447\u0435\u0440\u0435\u0437 info_utils.get_vmi_info options:   vmi_domain:     description: \u0414\u043e\u043c\u0435\u043d VMI \u0431\u0435\u0437 https:\/\/     required: true     type: str   vmi_first_username:     description: Email \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     required: true     type: str   vmi_first_password:     description: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     required: true     type: str   name:     description: \u0418\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438     required: true     type: str   validate_certs:     description:       - \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 ('no' \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f).     required: false     type: str '''  EXAMPLES = r''' - name: \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0445\u043e\u0441\u0442\u0435   vm_info:     vmi_domain: vmi.example.com     vmi_first_username: admin@example.com     vmi_first_password: secret     name: my-host     validate_certs: no   register: result '''  def main():     module = AnsibleModule(         argument_spec=dict(             vmi_domain=dict(required=True, type='str'),             vmi_first_username=dict(required=True, type='str'),             vmi_first_password=dict(required=True, type='str'),             name=dict(required=True, type='str'),             validate_certs=dict(required=False, type='str'),         )     )      base_url = f\"https:\/\/{module.params['vmi_domain']}\"     email = module.params['vmi_first_username']     password = module.params['vmi_first_password']     name = module.params['name']     validate_certs = module.params.get('validate_certs')      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d     token = get_auth_token(         base_url=base_url,         email=email,         password=password,         validate_certs_param=validate_certs,         module=module     )      # \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c endpoint     endpoint = f\"\/vm\/v3\/host?where=(name+EQ+'{name}')\"      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e     data = get_vmi_info(base_url, token, endpoint, validate_certs, module)      module.exit_json(changed=False, finder=data.get('size', []))   if __name__ == '__main__':     main()<\/code><\/pre>\n<p><em>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a <\/em>\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043c\u043e\u0434\u0443\u043b\u044e info_utils. \u041e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Ansible-\u043c\u043e\u0434\u0443\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u0427\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435.<\/p>\n<pre><code class=\"python\"># -*- coding: utf-8 -*-  from ansible.module_utils.urls import open_url import json  def get_vmi_info(base_url, token, endpoint, validate_certs, module):     \"\"\"     \u0414\u0435\u043b\u0430\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API \u043f\u043e endpoint \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u0430.      :param base_url: \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 https     :param token: \u0442\u043e\u043a\u0435\u043d \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 ses6     :param endpoint: \u043f\u0443\u0442\u044c API \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \/, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \/vm\/v3\/host?where=(name+...     :param validate_certs: 'no' \u0438\u043b\u0438 None     :param module: \u043e\u0431\u044a\u0435\u043a\u0442 AnsibleModule \u0434\u043b\u044f fail_json     :return: \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430     \"\"\"     url = f\"{base_url}{endpoint}\"     headers = {         'Accept': 'application\/json',         'Cookie': f'ses6={token}',         'x-xsrf-token': token,     }      kwargs = {         'url': url,         'method': 'GET',         'headers': headers,     }     if validate_certs == 'no':         kwargs['validate_certs'] = False      try:         response = open_url(**kwargs)         return json.loads(response.read())     except Exception as e:         module.fail_json(msg=f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 GET-\u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043a {url}\", error=str(e))<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0431\u0443\u0434\u0435\u0442 vm. \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0435\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u2014 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043e\u0442\u0434\u0430\u0432\u0430\u044f changed False.<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python  from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.auth_utils import get_auth_token from ansible.module_utils.info_utils import get_vmi_info from ansible.module_utils.urls import open_url import ssl import http.client import json from urllib.parse import urlparse  DOCUMENTATION = r''' --- module: vm short_description: \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 \u0432 VM description:   - \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0447\u0435\u0440\u0435\u0437 get_auth_token.   - \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 VM \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 get_vmi_info.   - \u0421\u043e\u0437\u0434\u0430\u0435\u0442 VM \u0435\u0441\u043b\u0438 state=present \u0438 VM \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. options:   vmi_domain:     description: \u0414\u043e\u043c\u0435\u043d VMI \u0431\u0435\u0437 https:\/\/     required: true     type: str   vmi_first_username:     description: Email \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     required: true     type: str   vmi_first_password:     description: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     required: true     type: str   state:     description: \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 VM     required: false     default: present     choices: [present, absent]     type: str   name:     description: \u0418\u043c\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b     required: true     type: str   password:     description: \u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f VM     required: true     type: str   cluster:     description: ID \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430     required: true     type: int   os:     description: ID \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b     required: true     type: int   ram_mib:     description: RAM \u0432 \u041c\u0438\u0431\u0438\u0431\u0430\u0439\u0442\u0430\u0445     required: true     type: int   hdd_mib:     description: HDD \u0432 \u041c\u0438\u0431\u0438\u0431\u0430\u0439\u0442\u0430\u0445     required: true     type: int   cpu_number:     description: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e CPU     required: true     type: int   ipv4_pool:     description: \u0421\u043f\u0438\u0441\u043e\u043a ID \u043f\u0443\u043b\u043e\u0432 IPv4     required: true     type: list     elements: int   validate_certs:     description:       - \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 ('no' \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f).     required: false     type: str '''  EXAMPLES = r''' - name: \u0421\u043e\u0437\u0434\u0430\u0442\u044c VM \u0435\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442   vm:     vmi_domain: vmi.example.com     vmi_first_username: admin@example.com     vmi_first_password: secret     name: My_vm     password: vmsecret     cluster: 1     os: 1     ram_mib: 512     hdd_mib: 5000     cpu_number: 1     ipv4_pool: [1]     validate_certs: no     state: present '''  def create_vm(base_url, token, vm_spec, validate_certs, module):     url = f\"{base_url}\/vm\/v3\/host\"     body = json.dumps(vm_spec)     headers = {         'Content-Type': 'application\/json',         'Cookie': f'ses6={token}',         'x-xsrf-token': token,     }     body = json.dumps(vm_spec)     kwargs = {         'url': url,         'method': 'POST',         'headers': headers,         'data': body,     }     if validate_certs == 'no':         kwargs['validate_certs'] = False      try:         response = open_url(**kwargs)         response_body = response.read().decode('utf-8')         if response.getcode() in (200, 201):             return json.loads(response_body)         else:             module.fail_json(msg=f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f VM. HTTP {response.getcode()}\", response_body=response_body)     except Exception as e:         module.fail_json(msg=\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 VM, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 \u0443\u0437\u043b\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\", kwargs=kwargs, error=str(e))  def run(base_url, token, state, validate_certs, module):      vm_name = module.params['name']     vm_password = module.params['password']     cluster = module.params['cluster']     os_id = module.params['os']     ram_mib = module.params['ram_mib']     hdd_mib = module.params['hdd_mib']     cpu_number = module.params['cpu_number']     ipv4_pool = module.params['ipv4_pool']      endpoint = f\"\/vm\/v3\/host?where=(name+EQ+'{vm_name}')\"     vmi_info = get_vmi_info(base_url, token, endpoint, validate_certs, module).get('size', 0)      if state == 'present':         if vmi_info != 0:             # VM \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c             module.exit_json(changed=False, finder=vmi_info)         else:             # \u0421\u043e\u0437\u0434\u0430\u0435\u043c VM             vm_spec = {                 \"name\": vm_name,                 \"password\": vm_password,                 \"cluster\": cluster,                 \"os\": os_id,                 \"ram_mib\": ram_mib,                 \"hdd_mib\": hdd_mib,                 \"cpu_number\": cpu_number,                 \"ipv4_pool\": ipv4_pool,             }             created_vm = create_vm(base_url, token, vm_spec, validate_certs, module)             module.exit_json(changed=True, vm=created_vm)     else:         # \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 state=absent \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0437\u0436\u0435         module.exit_json(changed=False, msg=\"state=absent \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\")  def main():     module = AnsibleModule(         argument_spec=dict(             vmi_domain=dict(required=True, type='str'),             vmi_first_username=dict(required=True, type='str'),             vmi_first_password=dict(required=True, type='str'),             state=dict(required=False, default='present', choices=['present', 'absent']),             name=dict(required=True, type='str'),             password=dict(required=True, type='str'),             cluster=dict(required=True, type='int'),             os=dict(required=True, type='int'),             ram_mib=dict(required=True, type='int'),             hdd_mib=dict(required=True, type='int'),             cpu_number=dict(required=True, type='int'),             ipv4_pool=dict(required=True, type='list', elements='int'),             validate_certs=dict(required=False, type='str'),         ),         supports_check_mode=False,     )      base_url = f\"https:\/\/{module.params['vmi_domain']}\"     email = module.params['vmi_first_username']     password_user = module.params['vmi_first_password']     state = module.params['state']     validate_certs = module.params.get('validate_certs')      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d     token = get_auth_token(         base_url=base_url,         email=email,         password=password_user,         validate_certs_param=validate_certs,         module=module     )     # \u0412\u044b\u0437\u043e\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     run(base_url, token, state, validate_certs, module)  if __name__ == '__main__':     main()<\/code><\/pre>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 vm.yml, \u0437\u0430\u043c\u0435\u043d\u0438\u043c ansible.builtin.uri \u043d\u0430 \u0441\u0432\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u041f\u0440\u043e\u0448\u0443 \u043d\u0435 \u0440\u0443\u0433\u0430\u0442\u044c \u0437\u0430 FQCN: \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u044b \u043d\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0438 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u043c \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"yaml\">--- - name: Install VMmanager 6 playbook   hosts: all   debugger: on_failed   tasks:     - name: Get up vm       vm_info:         vmi_domain: \"{{ ansible_ssh_host }}\"         vmi_first_username: vm@example.com         vmi_first_password: uA2sW2nT9czV         name: My_vm         validate_certs: no      - name: \u0421\u043e\u0437\u0434\u0430\u0442\u044c VM \u0435\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442       vm:         vmi_domain: \"{{ ansible_ssh_host }}\"         vmi_first_username: vm@example.com         vmi_first_password: uA2sW2nT9czV         name: My_vm         password: vmsecret         cluster: 1         os: 1         ram_mib: 512         hdd_mib: 5000         cpu_number: 1         ipv4_pool: [1]         validate_certs: no         state: present<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0443\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"bash\">export ANSIBLE_LIBRARY=\/home\/my_user\/vm6_ansible\/plugins\/modules export ANSIBLE_MODULE_UTILS=\/home\/my_user\/vm6_ansible\/plugins\/module_utils<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u0432\u0430\u0436\u0434\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u0435\u043d. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">ansible-playbook --private-key \/root\/.ssh\/private_key -i IP, -u root vm.yml<\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d22\/47a\/648\/d2247a6483b7d11416ab79dd2d4a6f57.png\" width=\"1457\" height=\"952\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d22\/47a\/648\/d2247a6483b7d11416ab79dd2d4a6f57.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d22\/47a\/648\/d2247a6483b7d11416ab79dd2d4a6f57.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u0435\u043d, \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043e\u0434\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c23\/b2e\/42c\/c23b2e42ccf5ecfa672134fe0d9645c2.png\" width=\"1600\" height=\"827\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c23\/b2e\/42c\/c23b2e42ccf5ecfa672134fe0d9645c2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c23\/b2e\/42c\/c23b2e42ccf5ecfa672134fe0d9645c2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0448\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 Infrastructure as Code, \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 VMmanager \u0438 VMmanager API \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b. \u0416\u0435\u043b\u0430\u044e \u0443\u0441\u043f\u0435\u0445\u043e\u0432 \u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/916884\/\"> https:\/\/habr.com\/ru\/articles\/916884\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043b\u044e\u0431\u0438\u043c\u043e\u043c\u0443 \u043c\u043d\u043e\u0439 IaC. \u0427\u0442\u043e\u0431\u044b \u0432\u0432\u0435\u0441\u0442\u0438 \u0432 \u043a\u0443\u0440\u0441 \u0434\u0435\u043b\u0430, \u043a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e VMmanager \u0438 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u0417\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 VMmanager \u0441 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c Infrastructure as Code, \u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u043f\u0440\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b VMmanager \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u0432 \u043d\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible.<\/p>\n<h2>\u041e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 VMmanager<\/h2>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 VMmanager. \u042d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u041e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 VMmanager Hosting \u0438 VMmanager Infrastructure \u2014 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0435\u0440\u0441\u0438\u044f<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Hosting<\/p>\n<\/td>\n<td>\n<p align=\"left\">Infrastructure<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u2014 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u0432 IT-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u0430\u0432<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u2014 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<br \/>\u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0440\u0435\u043d\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<br \/>\u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u0415\u0434\u0438\u043d\u043e\u043c \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 <br \/>\u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u041e\u0421 Astra Linux, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0424\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u043e\u0439 \u043f\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044e (\u0424\u0421\u0422\u042d\u041a \u0420\u043e\u0441\u0441\u0438\u0438)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>VMmanager \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 ISPsystem, \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u043c\u0438, \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u044c.<\/p>\n<figure class=\"full-width\"><\/figure>\n<div class=\"floating-image\">\n<p>\u042f \u0431\u0443\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 VMmanager Infrastructure.<\/p>\n<\/div>\n<h2>IaC-\u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 Infrastructure as Code \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 VMmanager \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 Terraform \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c VMmanager API. \u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Terraform \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 <a href=\"https:\/\/habr.com\/ru\/companies\/ispsystem\/articles\/688616\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f.<\/a> \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043c\u0441\u044f \u043d\u0430 Ansible. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 (\u0441\u043f\u043e\u0439\u043b\u0435\u0440: \u043d\u0430\u0431\u043e\u0440 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044c ansible.builtin.uri). \u0410 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u044f \u043f\u043e\u0433\u0440\u0443\u0436\u0443\u0441\u044c \u0432 VMmanager API \u0438 \u043d\u0430\u043f\u0438\u0448\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430 Python.<\/p>\n<h2>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 VMmanager API \u0438 Ansible<\/h2>\n<h3>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b VMmanager, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f Astra Linux \u0432\u0435\u0440\u0441\u0438\u0438 1.8.1 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u00ab\u041e\u0440\u0435\u043b\u00bb. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0437, \u0435\u0433\u043e \u044f \u0438 \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432 Yandex Cloud. \u0423\u0437\u0435\u043b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c: \u0432 VMmanager \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <a href=\"https:\/\/www.ispsystem.ru\/docs\/vmmanager-admin\/razrabotchiku\/sozdanie-klastera-zaglushki\" rel=\"noopener noreferrer nofollow\">\u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443<\/a>, \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0443\u0437\u043b\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c: \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438 \u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0448\u0430\u0433\u0438 \u2014 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u043f\u043e \u043d\u0438\u043c \u0438\u0434\u0442\u0438, \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f; \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0442\u0435\u043c\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0443\u043c\u0435\u0441\u0442\u043d\u043e \u0441\u044e\u0434\u0430 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u043f\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u041d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 Yandex Cloud \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437 \u0432\u0441\u0435\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \/etc\/apt\/sources.list. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b \u00ab\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0443\u0437\u043b\u0430\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u00bb \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e VMmanager. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c step-by-step \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 VMmanager \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible. \u041d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0448\u0430\u0433\u043e\u0432 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u043e IaC, \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u044e \u0432\u0441\u0435 \u0448\u0430\u0433\u0438, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u0440\u0438\u0430\u043b, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0437\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0433\u043b\u0430\u0437\u0430, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 VMmanager.\u00a0<\/p>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b ISPsystem \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0442\u0440\u0438\u0430\u043b \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0435\u043c\u043e\u0441\u0442\u0435\u043d\u0434\u0443. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u043d\u0430 \u0441\u0430\u0439\u0442\u0435: <a href=\"https:\/\/www.ispsystem.ru\/dcimanager\" rel=\"noopener noreferrer nofollow\">DCImanager<\/a>, <a href=\"https:\/\/www.ispsystem.ru\/vmmanager\" rel=\"noopener noreferrer nofollow\">VMmanager<\/a>, <a href=\"https:\/\/www.ispsystem.ru\/billmanager\" rel=\"noopener noreferrer nofollow\">BILLmanager<\/a>, <a href=\"https:\/\/www.ispsystem.ru\/dnsmanager\" rel=\"noopener noreferrer nofollow\">DNSmanager<\/a>.<\/p>\n<p>\u041d\u0430\u0441 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u0440\u0438\u0430\u043b \u0434\u043b\u044f VMmanager.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Ansible \u043d\u0430 \u041f\u041a, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/installation_guide\/intro_installation.html?roistat_visit=2788175\" rel=\"noopener noreferrer nofollow\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Ansible.<\/a><\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u041f\u041a \u0441 Ansible:<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430 \u041f\u041a \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 curl, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0435\u0435:\u00a0<\/p>\n<p><code>dnf install curl || apt install curl<\/code><\/p>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:\u00a0<\/p>\n<p><code>curl <\/code><a href=\"https:\/\/download.ispsystem.com\/extras\/ansible\/vmmanager6_common.tar.gz\" rel=\"noopener noreferrer nofollow\"><code>https:\/\/download.ispsystem.com\/extras\/ansible\/vmmanager6_common.tar.gz<\/code><\/a><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 SSH-\u043a\u043b\u044e\u0447 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u2014 <a href=\"https:\/\/www.ispsystem.ru\/docs\/vmmanager-admin\/vnutrennee-ustrojstvo\/ispol-zuemye-podsistemy\/ssh-protokol\" rel=\"noopener noreferrer nofollow\">\u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e SSH-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/a><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:\u00a0<\/p>\n<p><code>mkdir vm6_ansible<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u043f\u0430\u043a\u0443\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0430\u0440\u0445\u0438\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c\u0438:\u00a0<\/p>\n<p><code>tar xzf vmmanager6_common.tar.gz -C vm6_ansible\/<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e:<\/p>\n<p><code>cd vm6_ansible<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0436\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 vars \u0444\u0430\u0439\u043b\u0430 vmmanager6.yml:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"yaml\">  vars:     vmi_first_username: \"admin@example.com\"     vmi_first_password: \"q1w2e3r4\"     vmmanager6_license_token: \"..........:...................\"     vmi_domain: \"{{ ansible_ssh_host }}\" # \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0432 Yandex Cloud,  # \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0442\u0438 \u0431\u0435\u0440\u0435\u043c \u043f\u043e \u0444\u0430\u043a\u0442\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c.      vmi_network: \"10.177.91.0\/24\"     vmi_network_gateway: \"10.177.91.1\"     vmi_network_note: \"some network notes\"     vmi_pool_name: \"some_pool\"     vmi_pool_note: \"testing pool\"     vmi_cluster_name: \"new_cluster\"     vmi_time_zone: \"UTC\"     vmi_cluster_note: \"some cluster note\"     vmi_domain_template: \".example.com\" # \u042f \u0443\u043a\u0430\u0437\u0430\u043b \u0434\u043b\u044f check ip \u0438\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a dns, \u043d\u043e \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u0441\u0442\u0430.     vmi_node_check_ip: \"10.177.181.142\" # \u041c\u044b \u0434\u0430\u043b\u0435\u0435 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f ssl \u0438 \u0431\u044d\u043a\u0430\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 # \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c.     vmi_certificate: \"-----BEGIN CERTIFICATE-----\\nMIIDkT\u2026\u20267s=\\n-----END CERTIFICATE-----\\n\"     vmi_certificate_key: \"-----BEGIN PRIVATE KEY-----\\nMI\u2026.BlXDeTd\\n-----END PRIVATE KEY-----\\n\"     vmi_certificate_ca: \"\"     vmi_backup_ip: \"10.177.91.71\"     vmi_backup_user: \"root\"     vmi_backup_password: \"q1w2e3p4\"     vmi_backup_path: \"\/backup\"<\/code><\/pre>\n<ol>\n<li>\n<p>\u041c\u044b \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 vmmanager6.yml \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p><code>#\u00a0 \u00a0 - include_tasks: cert.yml<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c, \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 vmmanager6.yml \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p><code>#\u00a0 \u00a0 - include_tasks: backup.yml<\/code><\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443: <\/p>\n<p><code>ansible-playbook -i &lt;IP&gt;, -u root vmmanager6.yml<\/code><\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e &lt;IP&gt; \u0443\u043a\u0430\u0436\u0438\u0442\u0435 ip \u0441\u0432\u043e\u0435\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0433\u043b\u0443\u0431\u0436\u0435 \u0432 Ansible-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 VMmanager. \u0412 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0430\u0440\u0445\u0438\u0432\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0431\u043e\u0440 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432.<\/p>\n<figure class=\"full-width\"><\/figure>\n<div class=\"floating-image\">\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043b\u0435\u0439\u0431\u0443\u043a vmmanager6.yml, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.<\/p>\n<\/div>\n<pre><code class=\"yaml\">--- - name: Install VMmanager 6 playbook   hosts: all   debugger: on_failed   vars:     vmi_first_username: \"admin@example.com\"     vmi_first_password: \"q1w2e3r4\"     vmmanager6_license_token: \".............:................\"     vmi_domain: \"{{ ansible_ssh_host }}\"     vmi_network: \"10.177.91.0\/24\"     vmi_network_gateway: \"10.177.91.1\"     vmi_network_note: \"some network notes\"     vmi_pool_name: \"some_pool\"     vmi_pool_note: \"testing pool\"     vmi_cluster_name: \"new_cluster\"     vmi_time_zone: \"UTC\"     vmi_cluster_note: \"some cluster note\"     vmi_domain_template: \".example.com\"     vmi_node_check_ip: \"10.177.181.142\"     vmi_certificate: \"-----BEGIN CERTIFICATE-----\\nMIIDkT\u2026\u20267s=\\n-----END CERTIFICATE-----\\n\"     vmi_certificate_key: \"-----BEGIN PRIVATE KEY-----\\nMI\u2026.BlXDeTd\\n-----END PRIVATE KEY-----\\n\"    vmi_certificate_ca: \"\"     vmi_backup_ip: \"10.177.91.71\"     vmi_backup_user: \"root\"     vmi_backup_password: \"q1w2e3p4\"     vmi_backup_path: \"\/backup\"   tasks:     - include_tasks: remove_and_install.yml      - name: First time token       uri:         url: \"https:\/\/{{ vmi_domain }}\/auth\/v4\/public\/token\"         method: POST         body_format: json         status_code: [200,201,503]         return_content: yes         body:           email: \"{{ vmi_first_username }}\"           password: \"{{ vmi_first_password }}\"         validate_certs: no       register: first_token       retries: 3       delay: 30       until: first_token.status == 201      - name: make ses6 a fact       set_fact:         ses6: \"{{ (first_token.content|from_json).token }}\"      - include_tasks: first_run.yml #   - include_tasks: cert.yml     - include_tasks: setup_ip.yml     - include_tasks: cluster.yml     - include_tasks: storage.yml #   - include_tasks: backup.yml<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 cluster.yml, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f ansible.builtin.uri. <\/p>\n<pre><code class=\"yaml\">--- - name: Set up cluster   uri: # \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 API \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c url \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 url, # \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c.     url: \"https:\/\/{{ vmi_domain }}\/vm\/v3\/cluster\"     method: POST     body_format: json     status_code: [200, 401, 409, 500, 503]     headers:       Cookie: \"ses6={{ ses6 }}\"       x-xsrf-token: \"{{ ses6 }}\"     body:       name: \"{{ vmi_cluster_name }}\"       virtualization_type: \"kvm\"       time_zone: \"{{ vmi_time_zone }}\"       dns_servers:         - \"1.1.1.1\"       comment: \"{{ vmi_cluster_note }}\"       os:         - 1       iso_enabled: false       manage_disk_enabled: false       domain_template: \"{{ vmi_domain_template }}\"       domain_change_allowed: false       overselling: 1       host_per_node_limit: -1       host_distribution_policy: \"spread\"       host_filter: []       backup_locations: []       image_storage_path: \"\/image\"       os_storage_path: \"\/share\"       datacenter_type: \"common\"       interfaces:         - interface: 0           ippool: [ 1 ]       node_network:         gateway: \"{{ vmi_node_check_ip }}\"         timeout: 300       vxlan_mode: \"disabled\"     validate_certs: no   register: cluster   retries: 3   delay: 10   until: cluster.status == 200<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u044b \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043b\u0438 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447. ansible.builtin.uri \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 VMmanager API \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u0410 \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u0433\u0438\u044f\u2026 \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a VMmanager API \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.\u00a0<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043d\u0430 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 VMmanager API \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u0430\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 VMmanager \u2014 <a href=\"https:\/\/www.ispsystem.ru\/docs\/vmmanager-admin\/klastery\/sozdanie-klastera\" rel=\"noopener noreferrer nofollow\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u043f\u043e\u0448\u0430\u0433\u043e\u0432\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-462586","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462586","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=462586"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462586\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=462586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=462586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=462586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}