{"id":80289,"date":"2020-05-05T01:42:36","date_gmt":"2020-05-04T23:42:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ansible-migracziya-konfiguraczii-120-vm-c-coreos-na-centos-za-18-mesyaczev"},"modified":"2020-05-05T01:42:36","modified_gmt":"2020-05-04T23:42:36","slug":"ansible-migracziya-konfiguraczii-120-vm-c-coreos-na-centos-za-18-mesyaczev","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/ansible-migracziya-konfiguraczii-120-vm-c-coreos-na-centos-za-18-mesyaczev","title":{"rendered":"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/c12bef0589cc29a2a63840ecf5572357.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>This is a transcript of a presentation at <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/moscow\/2019\/meetups#2331050\">DevopsConf 2019-10-01<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"http:\/\/spblug.org\/\">SPbLUG 2019-09-25<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>This is the story of a project that used a custom configuration management system and why the transition to Ansible took 18 months.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"den---hhh-before-the-beginning\">Day \u2116 -XXX: Before the beginning<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/22ebc514d85df93237e7f7d262a393a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Initially, the infrastructure consisted of many standalone hosts managed by Hyper-V. Creating a virtual machine required several actions: placing disks in the right location, setting up DNS, reserving DHCP, and storing the VM configuration in a git repository. This process was partially automated, but for example, VMs were manually distributed among hosts. However, developers could adjust the VM configuration in git and apply it by rebooting the VM.<\/p>\n<p><\/p>\n<h3 id=\"custom-configuration-management-solution\">Custom Configuration Management Solution<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/166b61b7f70c49ba06e622cd3592826f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>The original idea, I suspect, was envisioned as IaC: numerous stateless VMs that would reset their state upon reboot. What did configuration management of VMs look like? Visually, it seems simple:<\/p>\n<p><\/p>\n<ol>\n<li>A static MAC was assigned to VMs.<\/li>\n<li>An ISO with CoreOS and a boot disk were attached to the VM.<\/li>\n<li>CoreOS runs a customization script downloaded from a web server based on its IP.<\/li>\n<li>The script fetches the VM configuration via SCP based on the IP address.<\/li>\n<li>A series of systemd unit files and a series of bash scripts are executed.<\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/6baa343ddc2b8df8812f2ed282e5bc3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>This solution had many obvious problems:<\/p>\n<p><\/p>\n<ol>\n<li>The ISO in CoreOS was deprecated.<\/li>\n<li>Many complex automated actions and magic during migration\/creation of VMs.<\/li>\n<li>Challenges with updates and when software of a specific version is needed. Even more fun with kernel modules.<\/li>\n<li>VMs weren't truly stateless, meaning some VMs had disks mounted with user data.<\/li>\n<li>Someone constantly messed up the systemd unit dependencies, causing CoreOS to hang on reboot. It was problematic to catch this with the available tools in CoreOS.<\/li>\n<li>Secret management.<\/li>\n<li>CM was virtually nonexistent. There was bash and YML configs for CoreOS.<\/li>\n<\/ol>\n<p><\/p>\n<p>To apply the VM configuration, it had to be rebooted, but it might fail to reboot. It seemed like an obvious problem, but there were no persistent disks to save logs. Alright, let\u2019s try to add kernel boot options to send logs. But no, it\u2019s all so complicated.<\/p>\n<p><\/p>\n<h2 id=\"den-0-priznanie-problemy\">Day \u21160: Acknowledgment of the problem<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/d80b98b91624085d5d11fc54647a55bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>It was an ordinary development infrastructure: Jenkins, testing environments, monitoring, registry. CoreOS was intended for hosting k8s clusters, so the issue was how CoreOS was used. The first step was choosing the stack. We decided on:<\/p>\n<p><\/p>\n<ol>\n<li><strong>CentOS<\/strong> as the base distribution, as it is the closest distribution to production environments.<\/li>\n<li><strong>Ansible<\/strong> for managing configurations, as there was extensive expertise on it.<\/li>\n<li><strong>Jenkins<\/strong> as a framework for automating existing processes, as it was already actively used for development processes.<\/li>\n<li><strong>Hyper-V<\/strong> as a virtualization platform. There are several reasons beyond this explanation, but briefly \u2013 we cannot use clouds, we must use our own hardware.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"den-30-fiksiruem-suschestvuyuschie-dogovorennosti---agreements-as-code\">Day #30: Documenting existing agreements \u2014 Agreements as Code<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/47a8cc980940b5080e195267d686df25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Once the stack was understood, preparations for the move began. Documenting existing agreements in code (<strong>Agreements as Code<\/strong>!). Transition <em>manual labor<\/em> -&gt; <em>mechanization<\/em> -&gt; <em>automation<\/em>.<\/p>\n<p><\/p>\n<h4 id=\"1-configure-vms\">1. Configure VMs<\/h4>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/90b3c4ec5d4234fc218295bd9a34d676.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ansible handles this task excellently. With minimal effort, you can take control of VM configurations:<\/p>\n<p><\/p>\n<ol>\n<li>Create a git repository.<\/li>\n<li>Store the list of VMs in inventory, configurations in playbooks and roles.<\/li>\n<li>Set up a special Jenkins slave from which Ansible can be run.<\/li>\n<li>Create a job, configure Jenkins.<\/li>\n<\/ol>\n<p><\/p>\n<p>The first process is ready. Agreements documented.<\/p>\n<p><\/p>\n<h4 id=\"2-create-new-vm\">2. Create new VM<\/h4>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/3f6a02b170e28fd34e8f5fa65d1606c2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Here, it was not very convenient. From Linux, it was not easy to create VMs on Hyper-V. One of the attempts to automate this process was:<\/p>\n<p><\/p>\n<ol>\n<li>Ansible connects to the Windows host via WinRM.<\/li>\n<li>Ansible runs a PowerShell script.<\/li>\n<li>The PowerShell script creates a new VM.<\/li>\n<li>Using Hyper-V\/ScVMM, when creating a VM in the guest OS, the hostname is configured.<\/li>\n<li>The VM sends its hostname when renewing the DHCP lease.<\/li>\n<li>The standard integration of DDNS &amp; DHCP on the Domain Controller side configures the DNS record.<\/li>\n<li>VMs can be added to the inventory and configured with Ansible.<\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"3-create-vm-template\">3. Create VM template<\/h4>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/f10929c1bd5b350c16bb691dce61653a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Here, we didn\u2019t reinvent anything \u2014 we took Packer.<\/p>\n<p><\/p>\n<ol>\n<li>We store the Packer config and kickstart in the git repository.<\/li>\n<li>Set up a special Jenkins slave with Hyper-V and Packer.<\/li>\n<li>Create a job, configure Jenkins.<\/li>\n<\/ol>\n<p><\/p>\n<p>How this combination works:<\/p>\n<p><\/p>\n<ol>\n<li>Packer creates an empty VM, attaches the ISO.<\/li>\n<li>The VM boots up, Packer prompts in the bootloader to use our kickstart file from diskette or HTTP.<\/li>\n<li>Anaconda starts with our config, performing the initial OS setup.<\/li>\n<li>Packer waits for the VM to become available.<\/li>\n<li>Packer runs Ansible in local mode inside the VM.<\/li>\n<li>Ansible operates using exactly the same roles as in step #1.<\/li>\n<li>Packer exports the VM template.<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"den-75-refaktorim-dogovorennosti-ne-lomaya--test-ansible--testkitchen\">Day #75: Refactoring agreements without breaking = Test ansible + Testkitchen.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/1b90074f3b17a77a732a259efdda518c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>It may not be enough to fix agreements in code. If you want to change something in the underlying process, you might break something. Therefore, testing of the infrastructure itself comes into play. To synchronize knowledge within the team, we started testing Ansible roles. I won\u2019t delve deeper since there are articles describing the events at that time. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/437004\/\">Test me if you can or do YML programmers dream of testing ansible?<\/a><\/noindex>(spoiler this was not the final version and later everything became more complicated <noindex><a rel=\"nofollow\" href=\"http:\/\/www.goncharov.xyz\/it\/ansible-testing-ru.html\">How to start testing Ansible, refactor a project in a year and not lose your mind.<\/a><\/noindex>).<\/p>\n<p><\/p>\n<h3 id=\"den-130-a-mozhet-centosansible-ne-nuzhen-mozhet-openshift\">Day #130: Do we really need CentOS+ansible? What about openshift?<\/h3>\n<p><\/p>\n<p>It should be understood that the process of introducing infrastructure was not the only one, and there were side subprojects. For example, a request came to deploy our application in openshift, which resulted in research lasting more than a week. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/441928\/\">We are launching the application in Openshift and comparing the existing tools.<\/a><\/noindex> What slowed down the migration process. It turned out that openshift does not meet all our needs; we need real hardware or at least the ability to tinker with the kernel.<\/p>\n<p><\/p>\n<h3 id=\"den-170-openshift-ne-podhodit-risknem-s-windows-azure-pack\">Day #170: Openshift is not suitable, shall we risk with Windows Azure Pack?<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/73cbf7fd7e0330676c4d937df68289f5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hyper-V is not very friendly, SCVMM doesn\u2019t make it much better. But there is this thing called Windows Azure Pack, which is an add-on to SCVMM and mimics Azure. However, in reality, the product appears abandoned: documentation has broken links and is quite sparse. But as part of the research into options for simplifying our cloud, we looked into it as well.<\/p>\n<p><\/p>\n<h3 id=\"den-250-windows-azure-pack-ne-ochen-ostaemsya-na-scvmm\">Day #250: Windows Azure Pack is not great. We will stay with SCVMM.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/8753b3da72adfb035d1a2f23ad28809b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Windows Azure Pack looked promising, but it was decided not to introduce WAP with all its complexities into the system for unnecessary features, so we stayed with SCVMM.<\/p>\n<p><\/p>\n<h3 id=\"den-360-edim-slona-po-chastyam\">Day #360: We eat the elephant piece by piece.<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/84e003906234c46b57b7769abd7b7993.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Only after a year was there a platform ready for migration, and the process began. For this, a S.M.A.R.T. task was set. We listed all the VMs and began to deal with the configuration one by one, documenting it in Ansible and covering it with tests.<\/p>\n<p><\/p>\n<h3 id=\"den-450-kakaya-sistema-poluchilas\">Day #450: What kind of system did we end up with?<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/1d0c64e6a229a0b4e0e49f7b832147ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>The process itself is not interesting. It's routine, and it's worth noting that most configurations were relatively simple or isomorphic, following the Pareto principle: 80% of configurations took 20% of the time. Similarly, 80% of the time was spent on preparing for the move, and only 20% was spent on the move itself. <\/p>\n<p><\/p>\n<h2 id=\"den-540-final\">Day #540: The Finale<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ansible: Migration of configuration for 120 VMs from CoreOS to CentOS over 18 months\" src=\"\/wp-content\/uploads\/2020\/05\/7e3d1936dca58506d3b8efcf4ee3c115.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>What happened over 18 months?<\/p>\n<p><\/p>\n<ol>\n<li>Agreements became the code.<\/li>\n<li><em>Manual labor<\/em> -&gt; <em>Mechanization<\/em> -&gt; <em>Automation<\/em>.<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"links\">Links<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/500350\/\">English version<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.goncharov.xyz\/it\/coreos2centos-ru.html\">Cross post from personal blog<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.mail.ru\/public\/UDCZ\/WM4Y9Qv3j\">slides<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/500058\/\">How to start testing Ansible, refactor a project in a year and not lose your mind.<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/467171\/\">Lessons learned from testing over 200,000 lines of Infrastructure Code<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/441928\/\">Let us deploy to OpenShift<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/342216\/\">How to test your own OS distribution<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/437004\/\">Test me if you can. Do YML developers dream of testing Ansible?<\/a><\/noindex><\/li>\n<\/ul>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/500040\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 DevopsConf 2019-10-01 \u0438 SPbLUG 2019-09-25. \u042d\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0435\u0437\u0434 \u043d\u0430 Ansible \u0437\u0430\u0442\u044f\u043d\u0443\u043b\u0441\u044f \u043d\u0430 18 \u043c\u0435\u0441\u044f\u0446\u0435\u0432. \u0414\u0435\u043d\u044c \u2116 -\u0425\u0425\u0425: Before the beginning \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u0441\u043e\u0431\u043e\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0445\u043e\u0441\u0442\u043e\u0432 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Hyper-V. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a\u0438 \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80290,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80289","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/ansible-migracziya-konfiguraczii-120-vm-c-coreos-na-centos-za-18-mesyaczev\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Ansible: \u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 120 VM c CoreOS \u043d\u0430 CentOS \u0437\u0430 18 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/ansible-migracziya-konfiguraczii-120-vm-c-coreos-na-centos-za-18-mesyaczev\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-04T23:42:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-04T23:42:36+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ansible: Migrating 120 VM configurations from CoreOS to CentOS over 18 months | ProHoster","description":"It is.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/ansible-migracziya-konfiguraczii-120-vm-c-coreos-na-centos-za-18-mesyaczev","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Ansible: \u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 120 VM c CoreOS \u043d\u0430 CentOS \u0437\u0430 18 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 | ProHoster","og:description":"\u042d\u0442\u043e.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/ansible-migracziya-konfiguraczii-120-vm-c-coreos-na-centos-za-18-mesyaczev","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-04T23:42:36+00:00","article:modified_time":"2020-05-04T23:42:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80289","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:21:22","updated":"2022-09-30 18:16:02","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/80289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=80289"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/80289\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/80290"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=80289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=80289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=80289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}