{"id":446259,"date":"2025-01-27T21:00:40","date_gmt":"2025-01-27T21:00:40","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=446259"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=446259","title":{"rendered":"<span>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Jira-AWX<\/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<h2>&#171;\u0414\u0435\u043f\u043b\u043e\u0439&#187; \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u043f\u0443\u0442\u0435\u043c &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u0432 Jira<\/h2>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0435\u043d\u0438\u0441, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/github.com\/ansible\/awx\" rel=\"noopener noreferrer nofollow\"><strong>AWX<\/strong><\/a> \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439. \u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0435\u0431\u044f\u0442\u0430\u043c \u0441 \u00ab\u0438\u043d\u0444\u0440\u044b\u00bb, \u0435\u0441\u043b\u0438 \u0432\u00a0\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f vmware \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 cloud \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u0447\u0430\u0441\u0442\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f, \u0430\u00a0\u0434\u043b\u044f\u00a0\u0432\u0441\u044f\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u044e\u0440\u043e\u043a\u0440\u0430\u0442\u0438\u0438 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0Jira. <\/p>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e <a class=\"mention\" href=\"\/users\/kuksepa\">@kuksepa<\/a> \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e <a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/866402\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u043f\u0440\u043e\u00a0AWX \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435\u00a0\u0441\u0442\u0430\u043d\u0443 \u043c\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0435\u0433\u043e, \u0430\u00a0\u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041f\u0440\u043e\u0448\u0443 \u043d\u0435\u00a0\u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u0437\u0430\u043c\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u00a0\u043d\u0438\u0445 \u043d\u0435\u0442 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b73\/a1b\/a05\/b73a1ba053d0a45c3bd00adf4b3cd03c.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f\" title=\"\u0421\u0445\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f\" width=\"1842\" height=\"540\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b73\/a1b\/a05\/b73a1ba053d0a45c3bd00adf4b3cd03c.png\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<h2>Jira<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Jira \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 (Deploy VM), \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f, 2 \u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (cloud \u0438 \u0426\u041e\u0414) \u0438 2 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432 ScriptRunner. \u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u044e, \u0447\u0442\u043e \u0441\u043b\u0430\u0431\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u043e\u0439 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0444\u043e\u0440\u043c \u0432 jira \u0438 \u0432\u0432\u0438\u0434\u0443 \u044d\u0442\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0430\u044f<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 Deploy VM \u0438\u043c\u0435\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0439, \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0438\u043c \u043f\u043e\u043b\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b 2 \u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (Deploy \u0438 DeployCloud).<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442\u044b (ScriptRunner) \u0432\u043d\u0443\u0442\u0440\u0438 jira \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u0432 \u0441\u0442\u0430\u0442\u0443\u0441 &#171;\u0432 \u0440\u0430\u0431\u043e\u0442\u0435&#187; \u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u044e\u0442 api \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 AWX. \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c &#8212; \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430  \u043f\u043e\u043b\u0435\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 POST \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u043c AWX \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<\/li>\n<\/ul>\n<pre><code>import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.IssueInputParametersImpl import com.atlassian.jira.user.ApplicationUser   \/\/\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0435\u0442 \u043c\u0430\u043f\u0438\u043d\u0433 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439                                   ....                                      def apiUrl switch (field2Value) {     case \"Ubuntu\":         apiUrl = \"https:\/\/\u0412\u0430\u0448 url\/v2\/workflow_job_templates\/121\/launch\/\"         break     case \"WindowsServer2019\":            \/\/\u0442\u0443\u0442 \u0435\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u041e\u0421           apiUrl = \"https:\/\/\u0412\u0430\u0448 url\/v2\/workflow_job_templates\/122\/launch\/\"         break     default:         log.error(\"\u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f customfield_21402: ${field2Value}\")         throw new IllegalArgumentException(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c URL \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: ${field2Value}\") }  def requestBody = \"\"\"{         \/\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0432 \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430     \"extra_vars\":{          \"computer_name\": \"${field3Value}\", \"VDC\": \"${field4Value}\", \"vapp_name\": \"${field5Value}\",     \"network\": \"${field6Value}\", \"ip\": \"${field7Value}\", \"gw\": \"${field8Value}\", \"ip_network\": \"${field9Value}\",         \"mask\": \"${field10Value}\", \"cpu\": \"${field11Value}\", \"memory\": \"${field12Value}\", \"disk\": \"${field13Value}\", \"group_access\": \"${field14Value}\",         \"disk2\": \"${field15Value}\",         \"size\": \"${field16Value}\",         \"mount_folder\": \"${field17Value}\",         \"description\": \"${field18Value}\",         \"JiraTicket\": \"${ticketNumber}\" } }\"\"\"  \/\/\u0414\u0430\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c POST                                   ..... <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a83\/fe4\/b51\/a83fe4b514f392a63d090769fa0cfbb8.png\" alt=\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430\" title=\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430\" width=\"1351\" height=\"1215\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a83\/fe4\/b51\/a83fe4b514f392a63d090769fa0cfbb8.png\"\/><\/p>\n<div><figcaption>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f cloud (\u0441\u043b\u0435\u0432\u0430) \u0438 vcenter (\u0441\u043f\u0440\u0430\u0432\u0430) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0413\u0434\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u0438\u0437 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c.<\/p>\n<h3>Terraform-Git<\/h3>\n<p>\u0418\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0433\u0438\u0442\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439. <\/p>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e terraform.<\/p>\n<p>1) \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u043e \u0434\u0435\u043f\u043b\u043e\u044e ubuntu \u0432 cloud, \u0441\u0435\u0442\u044c \u0438 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u0440\u0438\u043f\u0442, \u0442.\u043a. \u043e\u043f\u0446\u0438\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. <\/p>\n<pre><code>variable \"vcd_url\" {}  variable \"org_name\" {} variable \"vcd_max_retry_timeout\" { default = \"1800\" } variable \"vcd_allow_unverified_ssl\" { default = \"true\" } terraform {    backend \"local\" { path = \"\/home\/dsoldatov\/terraformstate\/terraform.tfstate\" }    required_providers {       vcd = {       source  = \"\u0412\u0430\u0448\u0435\/vmware\/vcd\"          version = \"&gt;=3.10.0\"     }   } } provider \"vcd\" {   user                  = \"none\"   password              = \"none\"   auth_type             = \"api_token_file\"   api_token_file        = \"token.json\"   allow_api_token_file  = true   org                   = var.org_name   vdc                   = \"\u0412\u0430\u0448 \u0442\u0435\u043d\u0430\u043d\u0442-{{VDC}}\"   url                   = var.vcd_url   max_retry_timeout     = var.vcd_max_retry_timeout   allow_unverified_ssl  = var.vcd_allow_unverified_ssl } variable \"attach_additional_disk\" {   type = bool   default = \"{{disk2}}\" } resource \"vcd_vapp_vm\" \"{{computer_name}}\" {   vapp_name         = \"{{vapp_name}}\"   name              = \"{{computer_name}}\"   catalog_name      = \"Ubuntu_new\"   template_name     = \"\u0412\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d\"   memory            = \"{{memory}}\"   cpus              = \"{{cpu}}\"   accept_all_eulas  = true   description       =  \"{{description}}\"   storage_profile   = \"{{disk}}\"   computer_name     = \"{{computer_name}}\"  network {     type               = \"org\"     name               = \"{{network}}\"     ip                 = \"{{ip_network}}\"     ip_allocation_mode = \"MANUAL\"     is_primary         = true }   customization {     allow_local_admin_password = \"true\"     auto_generate_password = \"false\"     admin_password = \"\u0412\u0430\u0448\u0435\"     enabled = true     initscript = &lt;&lt;-SCRIPT       #!\/bin\/bash       sudo awk '{gsub(\"\u0412\u0430\u0448 IP \u0448\u0430\u0431\u043b\u043e\u043d\u0430\", \"{{ip}}\")}1' \/etc\/netplan\/00-installer-config.yaml &gt; tmpfile &amp;&amp; sudo mv tmpfile \/etc\/netplan\/00-installer-config.yaml       sudo awk '{gsub(\"\u0412\u0430\u0448 \u0448\u043b\u044e\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\", \"{{gw}}\")}1' \/etc\/netplan\/00-installer-config.yaml &gt; tmpfile &amp;&amp; sudo mv tmpfile \/etc\/netplan\/00-installer-config.yaml       sudo awk '{gsub(\"\u0412\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d \u0448\u0430\u0431\u043b\u043e\u043d\u0430\", \"{{computer_name}}\")}1' \/etc\/hostname &gt; tmpfile &amp;&amp; sudo mv tmpfile \/etc\/hostname       netplan apply       reboot     SCRIPT   }  } resource \"time_sleep\" \"wait_for_vm\" { create_duration = \"30s\" } resource \"vcd_vm_internal_disk\" \"additional_disk\" { count         = var.attach_additional_disk ? 1 : 0 depends_on = [time_sleep.wait_for_vm] vapp_name     = \"{{vapp_name}}\" vm_name         = \"{{computer_name}}\" allow_vm_reboot = \"true\" bus_number        = 0 unit_number       = 1 bus_type        = \"parallel\" size_in_mb = \"{{size}}\" }<\/code><\/pre>\n<p>2) \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u043e &#171;\u0434\u0435\u043f\u043b\u043e\u044e&#187; windows server \u0432 vsphere \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 2 \u0444\u0430\u0439\u043b\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043f\u0446\u0438\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0442\u044c \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u043e\u043c\u0435\u043d. \u0422\u0430\u043a\u0436\u0435 \u0442\u0443\u0442 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 datastore \u0438 datacluster<\/p>\n<pre><code>provider \"vsphere\" {   user           = \"${var.vsphere_user}\"   password       = \"${var.vsphere_password}\"   vsphere_server = \"${var.vsphere_server}\"     allow_unverified_ssl = true }   data \"vsphere_datacenter\" \"dc\" {   name = \"{{datacenter}}\" } data \"vsphere_datastore\" \"datastore\" { count         = var.use_datastore_cluster ? 0 : 1 name         = \"{{datastore}}\" datacenter_id = data.vsphere_datacenter.dc.id } data \"vsphere_datastore_cluster\" \"datastore_cluster\" { count         = var.use_datastore_cluster ? 1 : 0 name         = \"{{datastore}}\" datacenter_id = data.vsphere_datacenter.dc.id }   data \"vsphere_compute_cluster\" \"cluster\" {   name          = \"{{cluster}}\"   datacenter_id = \"${data.vsphere_datacenter.dc.id}\" }   data \"vsphere_network\" \"network\" {   name          = \"{{env}}_vlan{{vlan}}\"   datacenter_id = \"${data.vsphere_datacenter.dc.id}\" }   data \"vsphere_virtual_machine\" \"template\" {  name          = \"\u0412\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d\"   datacenter_id = \"${data.vsphere_datacenter.dc.id}\" } #data \"vsphere_custom_attribute\" \"attribute\" { #  name = \"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\" #} terraform {   backend \"local\" { path = \"\/home\/dsoldatov\/terraformstate\/terraform.tfstate\" }   required_providers {     \u0412\u0430\u0448\u0435 = {       source  = \"\u0412\u0430\u0448\u0435\"     }   } }<\/code><\/pre>\n<pre><code>variable \"use_datastore_cluster\" { description = \"use datastore cluster\" type        = bool default     = \"{{datacluster}}\" } locals { add_extra_disk = \"{{disk2}}\" selected_datastore = var.use_datastore_cluster ? data.vsphere_datastore_cluster.datastore_cluster[0].id : data.vsphere_datastore.datastore[0].id } resource \"vsphere_virtual_machine\" \"vm1\" {   name             = \"{{computer_name}}\"   resource_pool_id = \"${data.vsphere_compute_cluster.cluster.resource_pool_id}\"   datastore_id     =   local.selected_datastore   folder = \"{{folder}}\" #  custom_attributes = tomap({\"${data.vsphere_custom_attribute.attribute.id}\" = \"{{description}}\"})       num_cpus = \"{{cpu}}\"   memory   = \"{{memory}}\"   firmware = \"efi\"   guest_id = \"${data.vsphere_virtual_machine.template.guest_id}\"     scsi_type = \"${data.vsphere_virtual_machine.template.scsi_type}\"        network_interface {     network_id   = \"${data.vsphere_network.network.id}\"     adapter_type = \"${data.vsphere_virtual_machine.template.network_interface_types[0]}\"   }      disk {     label            = \"disk0\"     size             = \"${data.vsphere_virtual_machine.template.disks.0.size}\"     eagerly_scrub    = \"${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}\"     thin_provisioned = \"${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}\" }      dynamic \"disk\" {     for_each = local.add_extra_disk ? [1] : []     content {        label            = \"disk1\"        size             = \"{{size}}\"        eagerly_scrub    = false        thin_provisioned = false        unit_number      = 1        controller_type = \"scsi\"      } }       clone {     template_uuid = \"${data.vsphere_virtual_machine.template.id}\"      customize {       windows_options {         computer_name         = \"{{computer_name}}\"         join_domain           = \"\u0412\u0430\u0448 \u0434\u043e\u043c\u0435\u043d\"         domain_admin_user     = \"{{login}}\"         domain_admin_password = \"{{pass}}\" #        admin_password        = var.local_adminpass         run_once_command_list = [           \"C:\\\\Distr\\\\installer.exe \/s\",           \"msiexec \/i C:\\\\Distr\\\\\u0412\u0430\u0448\u0435 \/quiet\"         ]        }              network_interface {         ipv4_address = \"{{ip_network}}\"         ipv4_netmask = \"{{mask}}\"         dns_server_list     = [\"\u0412\u0430\u0448\u0438 dns\"]       }         ipv4_gateway = \"{{gw}}\" }   } }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 terraform \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f ansible \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c. \u041f\u0440\u0438\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<pre><code class=\"yaml\">  gather_facts: false   tasks:      - name: Wait   #\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u0435\u043f\u043b\u043e\u044f     ansible.builtin.wait_for:       path: \/home\/dsoldatov\/terraformstate\/.terraform.tfstate.lock.info       state: absent    - name: Run state.sh script #\u0417\u0430\u043f\u0443\u0441\u043a \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0430 \u0441\u0431\u0440\u043e\u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f     command: \/home\/dsoldatov\/templates_cloud_windows\/state.sh     ignore_errors: yes     args:      chdir: \/home\/dsoldatov\/templates_cloud_windows\/         - name: Copy #\u0417\u0430\u043c\u0435\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0430 \u0434\u0435\u043f\u043b\u043e\u0439     template:       src: ..\/Playbooks\/main_windows.j2       dest: \/home\/dsoldatov\/templates_cloud_windows\/main.tf        - name: Init     command: \"terraform init\"     args:       chdir: \/home\/dsoldatov\/templates_cloud_windows     - name: Plan                                             #\u0418\u043d\u0438\u0442 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u043f\u043b\u043e\u044f     command: terraform plan -out=plan.out     args:       chdir: \/home\/dsoldatov\/templates_cloud_windows    - name: Apply     command: terraform apply -input=false plan.out     args:       chdir: \/home\/dsoldatov\/templates_cloud_windows    - name: Pause #\u041f\u0430\u0443\u0437\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0435\u043f\u043b\u043e\u0439\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f     ansible.builtin.pause:       seconds: 60<\/code><\/pre>\n<h2>AWX<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u0432\u00a0Jira \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0412\u041c, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432\u00a0\u0434\u043e\u043c\u0435\u043d\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u0441 &#171;\u043c\u0430\u043f\u0438\u043d\u0433\u043e\u043c&#187; \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f\u00a0\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u0430 &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u0432\u00a0Jira, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c5d\/5f4\/955\/c5d5f495507b485c925386fb20cd1174.png\" alt=\"\u042d\u0442\u0430\u043f\u044b workflow \u0434\u0435\u043f\u043b\u043e\u044f ubuntu \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 &quot;\u0438\u043d\u0432\u0435\u043d\u0442\u043e\u0440\u0438&quot; AWX, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432 \u0434\u043e\u043c\u0435\u043d\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u043e\u0439 \u0434\u043e\u043f. \u0434\u0438\u0441\u043a\u0430. \" title=\"\u042d\u0442\u0430\u043f\u044b workflow \u0434\u0435\u043f\u043b\u043e\u044f ubuntu \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 &quot;\u0438\u043d\u0432\u0435\u043d\u0442\u043e\u0440\u0438&quot; AWX, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432 \u0434\u043e\u043c\u0435\u043d\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u043e\u0439 \u0434\u043e\u043f. \u0434\u0438\u0441\u043a\u0430. \" width=\"1072\" height=\"316\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c5d\/5f4\/955\/c5d5f495507b485c925386fb20cd1174.png\"\/><\/p>\n<div><figcaption>\u042d\u0442\u0430\u043f\u044b workflow \u0434\u0435\u043f\u043b\u043e\u044f ubuntu \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 &#171;\u0438\u043d\u0432\u0435\u043d\u0442\u043e\u0440\u0438&#187; AWX, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432 \u0434\u043e\u043c\u0435\u043d\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u043e\u0439 \u0434\u043e\u043f. \u0434\u0438\u0441\u043a\u0430. <\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u00a0\u0434\u0435\u043f\u043b\u043e\u0435\u0432 \u0432\u00a0AWX \u0441\u043e\u0437\u0434\u0430\u043d\u044b workflow \u0441\u00a0\u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0438\u0437\u00a0\u0440\u044f\u0434\u0430 job_template, \u0442.\u043a. \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043f\u043b\u043e\u044f \u0412\u041c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c \u0432\u00a0\u0434\u043e\u043c\u0435\u043d, a \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043f\u043b\u043e\u044f (terraform) \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 ansible \u0448\u0430\u0431\u043b\u043e\u043d\u0430 (\u043a\u0440\u043e\u043c\u0435 windows server \u0432\u00a0vsphere) \u0441\u00a0AWX (job_template) \u043d\u0430\u00a0\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u00a0\u0434\u043e\u043c\u0435\u043d, \u043d\u043e\u00a0\u043c\u044b \u043d\u0435\u00a0\u0441\u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u043d\u0435\u0442 \u0432 &#171;\u0438\u043d\u0432\u0435\u043d\u0442\u043e\u0440\u0438&#187;. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 workflow \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 ansible \u0448\u0430\u0431\u043b\u043e\u043d. <\/p>\n<pre><code class=\"yaml\">- hosts: localhost   tasks:   - name: Add new host     uri:        url: \"\u0432\u0430\u0448 url\"        method: POST        headers:          Content-Type: \"application\/json\"          Authorization: \"Bearer \u0412\u0430\u0448 \u0442\u043e\u043a\u0435\u043d\"        body: &gt;              {              \"name\": \"{{ computer_name }}\",              \"variables\": \"{\\\"ansible_host\\\": \\\"{{ ip_network }}\\\"}\"              }        body_format: json            status_code: 201     register: result   - name: Debug result     debug:       var: result<\/code><\/pre>\n<div class=\"floating-image\">\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0445\u043e\u0441\u0442\u0430 \u0432 &#171;\u0438\u043d\u0432\u0435\u043d\u0442\u043e\u0440\u0438&#187; \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 Jira \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187;. \u0422\u043e\u043a\u0435\u043d \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u043e\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 jira \u0423\u0417 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0432 AWX.<\/p>\n<p>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0434\u043e\u043c\u0435\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 job_template ansible  \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432  \u0438\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u043b\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f.<\/p>\n<\/div>\n<pre><code class=\"yaml\">- name: enter domain   hosts: \"{{computer_name}}\"   gather_facts: false   vars_files:     - ..\/Playbooks\/credentials_win.yml   tasks:      - name: Pause        ansible.builtin.pause:         seconds: 90       - name: Join domain        win_domain_membership:         dns_domain_name: \"\u0412\u0430\u0448\u0435 \u0434\u043e\u043c\u0435\u043d\"         hostname: \"{{computer_name}}\"         domain_admin_user: \"{{login}}\"         domain_admin_password: \"{{pass}}\"         state: domain<\/code><\/pre>\n<div class=\"floating-image\">\n<p>&#171;\u041a\u0440\u0435\u0434\u044b&#187; \u0434\u043b\u044f\u00a0\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u00a0\u0434\u043e\u043c\u0435\u043d \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u00a0\u0444\u0430\u0439\u043b\u0430 credentials_win.yml \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u00a0ansible vault \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u0411\u0435\u0437\u00a0\u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 winrm \u043d\u0435\u00a0\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d.<\/p>\n<\/div>\n<p>\u0414\u043b\u044f\u00a0\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f &#171;\u043f\u043e\u0441\u043b\u0435\u0434\u0435\u043f\u043b\u043e\u0439\u043d\u043e\u0439&#187; Ubuntu c \u0434\u043e\u043f. \u0434\u0438\u0441\u043a\u043e\u043c, \u0432\u00a0workflow \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0448\u0430\u0431\u043b\u043e\u043d ansible \u0441\u00a0\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438<\/p>\n<pre><code class=\"yaml\">- name: add_seconddisk   hosts: \"{{ computer_name }}\"   become: yes   vars:     disk2: \"{{ lookup('env', 'DISK2') | default(false) }}\"  #\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 true \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u0438\u0441\u043a \u0438 \u043f\u0440\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u044f\u0432\u043a\u0438 \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 true   tasks:     - name: reboot                   #\u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0431\u0443\u0442 \u0438 \u0436\u0434\u0435\u043c \u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f       shell: |        #!\/bin\/bash             \/sbin\/shutdown -r now             sleep 45       async: 1       poll: 0     - name: Wait       wait_for_connection:         delay: 30         timeout: 45      - name: Resize       block:         - name: Copy #\u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 LVM, \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443 \u0438 \u043c\u0430\u043f\u0438\u043d\u0433 \u043f\u0430\u043f\u043a\u0438 \u043a \u0434\u0438\u0441\u043a\u0443           copy:             dest: \/home\/ansible_usr\/disk2.sh             content: |               #!\/bin\/bash               sudo echo -e \"nn\\np\\n1\\n\\n\\nw\\nq\" | sudo fdisk \/dev\/sdb               sudo pvcreate \/dev\/sdb1               sudo vgcreate datavolume \/dev\/sdb1               sudo lvcreate -l +100%FREE -n data datavolume               sudo mkfs.ext4 \/dev\/mapper\/datavolume-data               sudo mkdir -p \"{{ mount_folder }}\"               sudo echo \"\/dev\/datavolume\/data {{ mount_folder }}     ext4    rw     1 1\" &gt;&gt; \/etc\/fstab               sudo mount -a             mode: '0755'          - name: Execute           shell: \/home\/ansible_usr\/disk2.sh          - name: Remove           file:             path: \/home\/ansible_usr\/disk2.sh             state: absent       when: disk2 | bool     - name: Skip disk2             #\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u0435\u0441\u043b\u0438 false       debug:         msg: \"Disk skipped.\"       when: not disk2 | bool<\/code><\/pre>\n<div class=\"floating-image\">\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f4f\/3b0\/861\/f4f3b08615ed867aa5e543171d1c3233.png\" width=\"468\" height=\"237\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f4f\/3b0\/861\/f4f3b08615ed867aa5e543171d1c3233.png\"\/><\/figure>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 mount_folder \u0431\u044b\u043b \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u043a\u0430\u043a \/var\/postgres1<\/p>\n<\/div>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 webhook \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f workflow<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d4a\/be5\/726\/d4abe5726f95cad100674caeac530f40.png\" alt=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0432 AWX\" title=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0432 AWX\" width=\"979\" height=\"192\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d4a\/be5\/726\/d4abe5726f95cad100674caeac530f40.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0432 AWX<\/figcaption><\/div>\n<\/figure>\n<p>    \u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430\/\u043f\u0440\u043e\u0432\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f workflow \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u044f\u0449\u0438\u0439 flask \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e JiraTicket. \u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u0432 jira \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 AWX, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f issue_key \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u044f\u0432\u043a\u0438.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/49b\/869\/10f\/49b86910fc16bd72a856866919d1b580.png\" width=\"460\" height=\"657\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/49b\/869\/10f\/49b86910fc16bd72a856866919d1b580.png\"\/><\/figure>\n<\/div>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443, \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0434\u0435\u043f\u043b\u043e\u0435\u043c \u0412\u041c, \u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u043f\u043e \u0442\u0440\u0430\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 &#8212; \u044d\u0442\u043e jira \u0441 \u0435\u0435 insight \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u043f\u043e\u043b\u0435\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 jira \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0432\u0430\u0448 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u0435\u043a, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c web-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 AWX \u0441 \u0435\u0433\u043e Survey. <\/p>\n<\/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\/876934\/\"> https:\/\/habr.com\/ru\/articles\/876934\/<\/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<h2>&#171;\u0414\u0435\u043f\u043b\u043e\u0439&#187; \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u043f\u0443\u0442\u0435\u043c &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u0432 Jira<\/h2>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0435\u043d\u0438\u0441, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/github.com\/ansible\/awx\" rel=\"noopener noreferrer nofollow\"><strong>AWX<\/strong><\/a> \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439. \u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0435\u0431\u044f\u0442\u0430\u043c \u0441 \u00ab\u0438\u043d\u0444\u0440\u044b\u00bb, \u0435\u0441\u043b\u0438 \u0432\u00a0\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f vmware \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 cloud \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u0447\u0430\u0441\u0442\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f, \u0430\u00a0\u0434\u043b\u044f\u00a0\u0432\u0441\u044f\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u044e\u0440\u043e\u043a\u0440\u0430\u0442\u0438\u0438 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0Jira. <\/p>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e <a class=\"mention\" href=\"\/users\/kuksepa\">@kuksepa<\/a> \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e <a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/866402\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u043f\u0440\u043e\u00a0AWX \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435\u00a0\u0441\u0442\u0430\u043d\u0443 \u043c\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0435\u0433\u043e, \u0430\u00a0\u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041f\u0440\u043e\u0448\u0443 \u043d\u0435\u00a0\u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u0437\u0430\u043c\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u00a0\u043d\u0438\u0445 \u043d\u0435\u0442 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<h2>Jira<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Jira \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 (Deploy VM), \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f, 2 \u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (cloud \u0438 \u0426\u041e\u0414) \u0438 2 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432 ScriptRunner. \u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u044e, \u0447\u0442\u043e \u0441\u043b\u0430\u0431\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u043e\u0439 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0444\u043e\u0440\u043c \u0432 jira \u0438 \u0432\u0432\u0438\u0434\u0443 \u044d\u0442\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0430\u044f<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 Deploy VM \u0438\u043c\u0435\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0439, \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0438\u043c \u043f\u043e\u043b\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b 2 \u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (Deploy \u0438 DeployCloud).<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442\u044b (ScriptRunner) \u0432\u043d\u0443\u0442\u0440\u0438 jira \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 &#171;\u0442\u0438\u043a\u0435\u0442\u0430&#187; \u0432 \u0441\u0442\u0430\u0442\u0443\u0441 &#171;\u0432 \u0440\u0430\u0431\u043e\u0442\u0435&#187; \u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u044e\u0442 api \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 AWX. \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c &#8212; \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430  \u043f\u043e\u043b\u0435\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 POST \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u043c AWX \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<\/li>\n<\/ul>\n<pre><code>import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.IssueInputParametersImpl import com.atlassian.jira.user.ApplicationUser   \/\/\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0435\u0442 \u043c\u0430\u043f\u0438\u043d\u0433 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439                                   ....                                      def apiUrl switch (field2Value) {     case \"Ubuntu\":         apiUrl = \"https:\/\/\u0412\u0430\u0448 url\/v2\/workflow_job_templates\/121\/launch\/\"         break     case \"WindowsServer2019\":            \/\/\u0442\u0443\u0442 \u0435\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u041e\u0421           apiUrl = \"https:\/\/\u0412\u0430\u0448 url\/v2\/workflow_job_templates\/122\/launch\/\"         break     default:         log.error(\"\u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f customfield_21402: ${field2Value}\")         throw new IllegalArgumentException(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c URL \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: ${field2Value}\") }  def requestBody = \"\"\"{         \/\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0432 \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430     \"extra_vars\":{          \"computer_name\": \"${field3Value}\", \"VDC\": \"${field4Value}\", \"vapp_name\": \"${field5Value}\",     \"network\": \"${field6Value}\", \"ip\": \"${field7Value}\", \"gw\": \"${field8Value}\", \"ip_network\": \"${field9Value}\",         \"mask\": \"${field10Value}\", \"cpu\": \"${field11Value}\", \"memory\": \"${field12Value}\", \"disk\": \"${field13Value}\", \"group_access\": \"${field14Value}\",         \"disk2\": \"${field15Value}\",         \"size\": \"${field16Value}\",         \"mount_folder\": \"${field17Value}\",         \"description\": \"${field18Value}\",         \"JiraTicket\": \"${ticketNumber}\" } }\"\"\"  \/\/\u0414\u0430\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c POST                                   ..... <\/code><\/pre>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f cloud (\u0441\u043b\u0435\u0432\u0430) \u0438 vcenter (\u0441\u043f\u0440\u0430\u0432\u0430) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0413\u0434\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u0438\u0437 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c.<\/p>\n<h3>Terraform-Git<\/h3>\n<p>\u0418\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0433\u0438\u0442\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439. <\/p>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e terraform.<\/p>\n<p>1) \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u043e \u0434\u0435\u043f\u043b\u043e\u044e ubuntu \u0432 cloud, \u0441\u0435\u0442\u044c \u0438 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u0440\u0438\u043f\u0442, \u0442.\u043a. \u043e\u043f\u0446\u0438\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. <\/p>\n<pre><code>variable \"vcd_url\" {}  variable \"org_name\" {} variable \"vcd_max_retry_timeout\" { default = \"1800\" } variable \"vcd_allow_unverified_ssl\" { default = \"true\" } terraform {    backend \"local\" { path = \"\/home\/dsoldatov\/terraformstate\/terraform.tfstate\" }    required_providers {       vcd = {       source  = \"\u0412\u0430\u0448\u0435\/vmware\/vcd\"          version = \"&gt;=3.10.0\"     }   } } provider \"vcd\" {   user                  = \"none\"   password              = \"none\"   auth_type             = \"api_token_file\"   api_token_file        = \"token.json\"   allow_api_token_file  = true   org                   = var.org_name   vdc                   = \"\u0412\u0430\u0448 \u0442\u0435\u043d\u0430\u043d\u0442-{{VDC}}\"   url                   = var.vcd_url   max_retry_timeout     = var.vcd_max_retry_timeout   allow_unverified_ssl  = var.vcd_allow_unverified_ssl } variable \"attach_additional_disk\" {   type = bool   default = \"{{disk2}}\" } resource \"vcd_vapp_vm\" \"{{computer_name}}\" {   vapp_name         = \"{{vapp_name}}\"   name              = \"{{computer_name}}\"   catalog_name      = \"Ubuntu_new\"   template_name     = \"\u0412\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d\"   memory            = \"{{memory}}\"   cpus              = \"{{cpu}}\"   accept_all_eulas  = true   description       =  \"{{description}}\"   storage_profile   = \"{{disk}}\"   computer_name     = \"{{computer_name}}\"  network {     type               = \"org\"     name               = \"{{network}}\"     ip                 = \"{{ip_network}}\"     ip_allocation_mode = \"MANUAL\"     is_primary         = true }   customization {     allow_local_admin_password = \"true\"     auto_generate_password = \"false\"     admin_password = \"\u0412\u0430\u0448\u0435\"     enabled = true     initscript = &lt;&lt;-SCRIPT       #!\/bin\/bash       sudo awk '{gsub(\"\u0412\u0430\u0448 IP \u0448\u0430\u0431\u043b\u043e\u043d\u0430\", \"{{ip}}\")}1' \/etc\/netplan\/00-installer-config.yaml &gt; tmpfile &amp;&amp; sudo mv tmpfile \/etc\/netplan\/00-installer-config.yaml       sudo awk '{gsub(\"\u0412\u0430\u0448 \u0448\u043b\u044e\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\", \"{{gw}}\")}1' \/etc\/netplan\/00-installer-config.yaml &gt; tmpfile &amp;&amp; sudo mv tmpfile \/etc\/netplan\/00-installer-config.yaml       sudo awk '{gsub(\"\u0412\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d \u0448\u0430\u0431\u043b\u043e\u043d\u0430\", \"{{computer_name}}\")}1' \/etc\/hostname &gt; tmpfile &amp;&amp; sudo mv tmpfile \/etc\/hostname       netplan apply       reboot     SCRIPT   }  } resource \"time_sleep\" \"wait_for_vm\" { create_duration = \"30s\" } resource \"vcd_vm_internal_disk\" \"additional_disk\" { count         = var.attach_additional_disk ? 1 : 0 depends_on = [time_sleep.wait_for_vm] vapp_name     = \"{{vapp_name}}\" vm_name         = \"{{computer_name}}\" allow_vm_reboot = \"true\" bus_number        = 0 unit_number       = 1 bus_type        = \"parallel\" size_in_mb = \"{{size}}\" }<\/code><\/pre>\n<p>2) \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u043e &#171;\u0434\u0435\u043f\u043b\u043e\u044e&#187; windows server \u0432 vsphere \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 2 \u0444\u0430\u0439\u043b\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043f\u0446\u0438\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0442\u044c \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u043e\u043c\u0435\u043d. \u0422\u0430\u043a\u0436\u0435 \u0442\u0443\u0442 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 datastore \u0438 datacluster<\/p>\n<pre><code>provider \"vsphere\" {   user           = \"${var.vsphere_user}\"   password       = \"${var.vsphere_password}\"   vsphere_server = \"${var.vsphere_server}\"     allow_unverified_ssl = true }   data \"vsphere_datacenter\" \"dc\" {   name = \"{{datacenter}}\" } data \"vsphere_datastore\" \"datastore\" { count         = var.use_datastore_cluster ? 0 : 1 name         = \"{{datastore}}\" datacenter_id = data.vsphere_datacenter.dc.id } data \"vsphere_datastore_cluster\" \"datastore_cluster\" { count         = var.use_datastore_cluster ? 1 : 0 name         = \"{{datastore}}\" datacenter_id = data.vsphere_datacenter.dc.id }   data \"vsphere_compute_cluster\" \"cluster\" {   name          = \"{{cluster}}\"   datacenter_id = \"${data.vsphere_datacenter.dc.id}\" }   data \"vsphere_network\" \"network\" {   name          = \"{{env}}_vlan{{vlan}}\"   datacenter_id = \"${data.vsphere_datacenter.dc.id}\" }   data \"vsphere_virtual_machine\" \"template\" {  name          = \"\u0412\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d\"   datacenter_id = \"${data.vsphere_datacenter.dc.id}\" } #data \"vsphere_custom_attribute\" \"attribute\" { #  name = \"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\" #} terraform {   backend \"local\" { path = \"\/home\/dsoldatov\/terraformstate\/terraform.tfstate\" }   required_providers {     \u0412\u0430\u0448\u0435 = {       source  = \"\u0412\u0430\u0448\u0435\"     }   } }<\/code><\/pre>\n<pre><code>variable \"use_datastore_cluster\" { description = \"use datastore cluster\" type        = bool default     = \"{{datacluster}}\" } locals { add_extra_disk = \"{{disk2}}\" selected_datastore = var.use_datastore_cluster ? data.vsphere_datastore_cluster.datastore_cluster[0].id : data.vsphere_datastore.datastore[0].id } resource \"vsphere_virtual_machine\" \"vm1\" {   name             = \"{{computer_name}}\"   resource_pool_id = \"${data.vsphere_compute_cluster.cluster.resource_pool_id}\"   datastore_id     =   local.selected_datastore   folder = \"{{folder}}\" #  custom_attributes = tomap({\"${data.vsphere_custom_attribute.attribute.id}\" = \"{{description}}\"})       num_cpus = \"{{cpu}}\"   memory   = \"{{memory}}\"   firmware = \"efi\"   guest_id = \"${data.vsphere_virtual_machine.template.guest_id}\"     scsi_type = \"${data.vsphere_virtual_machine.template.scsi_type}\"        network_interface {     network_id   = \"${data.vsphere_network.network.id}\"     adapter_type = \"${data.vsphere_virtual_machine.template.network_interface_types[0]}\"   }      disk {     label            = \"disk0\"     size             = \"${data.vsphere_virtual_machine.template.disks.0.size}\"     eagerly_scrub    = \"${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}\"     thin_provisioned = \"${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}\" }      dynamic \"disk\" {     for_each = local.add_extra_disk ? [1] : []     content {        label            = \"disk1\"        size             = \"{{size}}\"        eagerly_scrub    = false        thin_provisioned = false        unit_number      = 1        controller_type = \"scsi\"      } }       clone {     template_uuid = \"${data.vsphere_virtual_machine.template.id}\"      customize {       windows_options {         computer_name         = \"{{computer_name}}\"         join_domain           = \"\u0412\u0430\u0448 \u0434\u043e\u043c\u0435\u043d\"         domain_admin_user     = \"{{login}}\"         domain_admin_password = \"{{pass}}\" #        admin_password        = var.local_adminpass         run_once_command_list = [           \"C:\\\\Distr\\\\installer.exe \/s\",           \"msiexec \/i C:\\\\Distr\\\\\u0412\u0430\u0448\u0435 \/quiet\"         ]        }              network_interface {         ipv4_address = \"{{ip_network}}\"         ipv4_netmask = \"{{mask}}\"         dns_server_list     = [\"\u0412\u0430\u0448\u0438 dns\"]       }         ipv4_gateway = \"{{gw}}\" }   } }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 terraform \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f ansible \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c. \u041f\u0440\u0438\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<pre><code class=\"yaml\">  gather_facts: false   tasks:      - name: Wait   #\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u0435\u043f\u043b\u043e\u044f     ansible.builtin.wait_for:       path: \/home\/dsoldatov\/terraformstate\/.terraform.tfstate.lock.info       state: absent    - name: Run state.sh script #\u0417\u0430\u043f\u0443\u0441\u043a \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0430 <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-446259","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/446259","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=446259"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/446259\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=446259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=446259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=446259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}