<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Devops on Giedrius Statkevičius</title><link>https://giedrius.blog/categories/devops/</link><description>Recent content in Devops on Giedrius Statkevičius</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Fri, 24 May 2024 14:30:01 +0000</lastBuildDate><atom:link href="https://giedrius.blog/categories/devops/feed.xml" rel="self" type="application/rss+xml"/><item><title>Dynamic hashrings with WAL in Thanos are bad</title><link>https://giedrius.blog/2024/05/24/dynamic-hashrings-with-wal-in-thanos-are-bad/</link><pubDate>Fri, 24 May 2024 14:30:01 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=1186</guid><description>&lt;p&gt;Hashrings are everywhere in distributed systems. Combined with a write-ahead log that uses an unbounded amount of RAM during WAL replay, they are a terrible idea. If there is a constant stream of metrics coming into Thanos, you want to push back on the producers of those metrics in case of one or a few node&amp;rsquo;s downtime. Having a dynamic hashring i.e. a hashring that immediately updates as soon as it notices that one node is down, prevents that. The same stream is now going to fewer nodes. And so on until, most likely, your whole stack collapses. In practice, this means that you should not remove a node from the hashring if it is unhealthy or unready.&lt;/p&gt;</description></item><item><title>"Observability Engineering" Book Review</title><link>https://giedrius.blog/2022/05/23/observability-engineering-book-review/</link><pubDate>Mon, 23 May 2022 14:39:43 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=981</guid><description>&lt;p&gt;A great, new book &amp;ldquo;&lt;a href="https://www.amazon.co.uk/Observability-Engineering-Charity-Majors-ebook/dp/B09ZQ6FHTT"&gt;Observability Engineering&lt;/a&gt;&amp;rdquo; came out very recently and I had to jump on reading it. Since it is very closely related to my work, I devoured the pages and read the book in about a day (505 pages). While doing so I wrote down some thoughts that I want to share with you today. They might or might not be true, I am only speaking about the book from my own perspective. Feel free to share your own thoughts!&lt;/p&gt;</description></item><item><title>Custom Metric Retention Periods on Thanos</title><link>https://giedrius.blog/2021/12/07/custom-metric-retention-periods-on-thanos/</link><pubDate>Tue, 07 Dec 2021 20:38:21 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=882</guid><description>&lt;p&gt;Setting custom metric retention periods on Thanos is one of the longest feature requests that we have had: &lt;a href="https://github.com/thanos-io/thanos/issues/903"&gt;https://github.com/thanos-io/thanos/issues/903&lt;/a&gt;. It seems like there is still no solution in sight but actually, it is already possible to have custom metrics retention periods. It is quite a simple idea but could be hard to implement if you do not have comfortable deployment tooling in place. You can achieve custom retention periods for different metrics in the following way:&lt;/p&gt;</description></item><item><title>How to Visualize Prometheus TSDB With Thanos</title><link>https://giedrius.blog/2021/01/10/how-to-visualize-prometheus-tsdb-with-thanos/</link><pubDate>Sun, 10 Jan 2021 19:18:55 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=785</guid><description>&lt;p&gt;Have you ever tried to &lt;code&gt;ls&lt;/code&gt; the Prometheus TSDB data directory just to understand what kind of data you have from the perspective of time? Here is an example listing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxrwxr-x 3 gstatkevicius gstatkevicius 4096 Jun 26 2020 01EBRP7DA9N67RTT9AFE0KMXFJ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxrwxr-x 3 gstatkevicius gstatkevicius 4096 Jun 26 2020 01EBRP7DCM68X5SPQGK3T8NNER
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxrwxr-x 2 gstatkevicius gstatkevicius 4096 Jun 26 2020 chunks_head
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- 1 gstatkevicius gstatkevicius 0 Apr 17 2020 lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- 1 gstatkevicius gstatkevicius 20001 Jan 2 14:01 queries.active
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwxr-xr-x 3 gstatkevicius gstatkevicius 4096 Jan 2 14:01 wal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We could assume that each block is 2 hours long. However, they can be compacted i.e. &amp;ldquo;joined&amp;rdquo; into bigger ones if that is enabled. Then, the blocks would not line up in a sequential way. Plus, this output of &lt;code&gt;ls&lt;/code&gt; doesn&amp;rsquo;t even show the creation time of different blocks. We could theoretically get those timestamps with &lt;code&gt;stat(2)&lt;/code&gt;, &lt;code&gt;statx(2)&lt;/code&gt; and some shell magic but that&amp;rsquo;s cumbersome. Overall, this doesn&amp;rsquo;t seem too helpful and we can do better.&lt;/p&gt;</description></item><item><title>Equivocal Puppet Class Parameters</title><link>https://giedrius.blog/2020/11/08/equivocal-puppet-class-parameters/</link><pubDate>Sun, 08 Nov 2020 20:13:43 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=744</guid><description>&lt;p&gt;While working with Puppet recently I have noticed that there is some funny business going on with the rules of parameter naming. The Puppet&amp;rsquo;s documentation &lt;a href="https://puppet.com/docs/puppet/6.17/lang_reserved.html#variable-names"&gt;states&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Parameter names begin with a dollar sign prefix ($). The parameter name after the prefix:&lt;/p&gt;
&lt;p&gt;Must begin with a lowercase letter.&lt;/p&gt;
&lt;p&gt;Can include lowercase letters.&lt;/p&gt;
&lt;p&gt;Can include digits.&lt;/p&gt;
&lt;p&gt;Can include underscores.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s see if this is true. Tried applying this manifest with Puppet 5.5.10 which is available on Ubuntu Focal Fossa (20.04):&lt;/p&gt;</description></item><item><title>Crash-Only Software In Practice With Filebeat On Kubernetes</title><link>https://giedrius.blog/2020/07/08/crash-only-software-in-practice-with-filebeat-on-kubernetes/</link><pubDate>Wed, 08 Jul 2020 20:28:27 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=676</guid><description>&lt;p&gt;Some time ago I read an article called &lt;a href="https://lwn.net/Articles/191059/"&gt;Crash-only software: More than meets the eye&lt;/a&gt;. It&amp;rsquo;s about an idea that sometimes it is easier and faster to just crash and restart the whole process than handle the error appropriately. Sometimes, obviously, it is even impossible to handle errors as in, for example, &lt;a href="https://en.wikipedia.org/wiki/Kernel_panic"&gt;Linux kernel panics&lt;/a&gt;. Nowadays programming languages especially tend to make it so that it would be very hard, almost impossible to &lt;em&gt;not&lt;/em&gt; handle errors. For instance, Rust has a &lt;a href="https://doc.rust-lang.org/std/result/enum.Result.html"&gt;type&lt;/a&gt; that either represents success or an error. You have to explicitly unwrap that type and decide what to do in either case. But, apart from those obvious cases, I haven&amp;rsquo;t seen any examples of crash-only software. Until recently.&lt;/p&gt;</description></item><item><title>Load Testing Thanos Query (StoreAPI)</title><link>https://giedrius.blog/2020/05/10/load-testing-thanos-query-storeapi/</link><pubDate>Sun, 10 May 2020 11:05:27 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=437</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Thanos Query is the component of &lt;a href="https://thanos.io"&gt;Thanos&lt;/a&gt; that fans out a query to one or more nodes that implement the &lt;a href="https://thanos.io/integrations.md/#storeapi"&gt;StoreAPI&lt;/a&gt; and then it can deduplicate the results. It also implements the Prometheus API which lets you use it via Grafana.&lt;/p&gt;
&lt;p&gt;Any of the other components may be the receivers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thanos Receive;&lt;/li&gt;
&lt;li&gt;Thanos Rule;&lt;/li&gt;
&lt;li&gt;Thanos Sidecar;&lt;/li&gt;
&lt;li&gt;Thanos Compact;&lt;/li&gt;
&lt;li&gt;Thanos Query itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is tricky to know how much resources you will need for any given deployment of Thanos Query because it depends on a lot of different criteria. So, to know that and to actually test the limits in practice, you ought to perform what is commonly called a load/stress test. We will use a tool called &lt;a href="https://github.com/thanos-io/thanosbench/"&gt;thanosbench&lt;/a&gt; to do that in this tutorial.&lt;/p&gt;</description></item><item><title>Is it a good idea to use Prometheus for storing ASCII paintings?</title><link>https://giedrius.blog/2019/09/21/is-it-a-good-idea-to-use-prometheus-for-storing-ascii-paintings/</link><pubDate>Sat, 21 Sep 2019 10:35:31 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=592</guid><description>&lt;p&gt;In the Cloud-based computing world, a relatively popular free and open-source software product called &lt;a href="https://prometheus.io/"&gt;Prometheus&lt;/a&gt; exists which lets you monitor and observe other things. One of the components of its user interface lets you execute ad-hoc queries on the data that it has and see their results - not just in a table but also in a graphical way as well. For example, this is a query &lt;code&gt;time()&lt;/code&gt; which plots the current time using two dimensions:&lt;/p&gt;</description></item><item><title>What I would love to see in the Puppet configuration management software</title><link>https://giedrius.blog/2019/07/25/what-i-would-love-to-see-in-the-puppet-configuration-management-software/</link><pubDate>Thu, 25 Jul 2019 20:01:09 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=561</guid><description>&lt;figure&gt;
&lt;img loading="lazy" src="https://upload.wikimedia.org/wikipedia/commons/f/fb/Hand%5FPuppet.jpg"
alt="Image result for puppet"/&gt; &lt;figcaption&gt;
&lt;p&gt;Image result for puppet&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I have been using &lt;a href="https://github.com/puppetlabs/puppet"&gt;Puppet&lt;/a&gt; off-and-on by now for almost a couple of years and saw it transform from a domain-specific language with lots warts to a pretty and functional language. However, not all is completely fine and dandy. I feel that in some ways it could still be improved a lot.&lt;/p&gt;
&lt;h2 id="namespaces-support-of-modules-in-environments"&gt;Namespaces support of modules in environments&lt;/h2&gt;
&lt;p&gt;Puppet has somewhat good support for namespaces in the code with the special delimiter of &lt;code&gt;::&lt;/code&gt; which has a magical meaning for it: the Puppet agent expects to find the code in one level deeper when it sees such thing in a class name or a &lt;code&gt;define&lt;/code&gt;. From now on, I will only talk about &lt;code&gt;class&lt;/code&gt; objects and not other things which work similarly from the point of view of the parser. However, at the top level, all names of the &lt;code&gt;class&lt;/code&gt; definitions (before &lt;code&gt;::&lt;/code&gt;, if it exists) are at the same, top-most scope. In a very big environment, you could easily run into such a situation that two different modules (competing implementation) configure the same piece of software and they have identical names.&lt;/p&gt;</description></item><item><title>What Is New In Thanos 0.5.0</title><link>https://giedrius.blog/2019/06/03/what-is-new-in-thanos-0-5-0/</link><pubDate>Mon, 03 Jun 2019 16:52:32 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=480</guid><description>&lt;figure&gt;
&lt;img loading="lazy" src="https://giedrius.blog/wp-content/uploads/2019/06/97e49180-661b-11e9-9882-fdc44b74debd.png"/&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://thanos.io/"&gt;Thanos&lt;/a&gt; 0.5.0-rc.0 has been recently released and the final 0.5.0 version is just around the corner. It is a good opportunity to look back on what has changed since the last version. I hope that I will be able to present a good enough perspective since I have been recently appointed as a maintainer of the project. Thanks to everyone who has contributed pull requests and bug reports 💖This could not have been done without you.&lt;/p&gt;</description></item><item><title>Push Vs. Pull In Monitoring Systems</title><link>https://giedrius.blog/2019/05/11/push-vs-pull-in-monitoring-systems/</link><pubDate>Sat, 11 May 2019 18:04:49 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=484</guid><description>&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;
&lt;p&gt;There are two different schools of thought when thinking about how metrics are ingested into a monitoring system: either the metrics get &lt;em&gt;pushed (usually via UDP)&lt;/em&gt; into the system or they get &lt;em&gt;pulled (usually via HTTP)&lt;/em&gt;. I might not mention that I have that in mind when saying &amp;ldquo;push or pull based systems&amp;rdquo; in some places to keep the article terse.&lt;/p&gt;
&lt;p&gt;The push method is used in systems such as &lt;a href="https://graphiteapp.org/"&gt;Graphite&lt;/a&gt; whereas the pull method is used by monitoring systems like &lt;a href="https://prometheus.io/"&gt;Prometheus&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Everything You Need To Know About The Index Cache Size in Thanos</title><link>https://giedrius.blog/2019/04/28/everything-you-need-to-know-about-the-index-cache-size-in-thanos/</link><pubDate>Sun, 28 Apr 2019 08:29:42 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=471</guid><description>&lt;p&gt;&lt;img alt="Thanos Logo" loading="lazy" src="https://thanos.io/Thanos-logo_full.svg"&gt;Just like most pieces of software nowadays, &lt;a href="https://github.com/improbable-eng/thanos"&gt;Thanos&lt;/a&gt; is not an exception and there is some caching going on there. In particular, we will talk about the index cache and its&amp;rsquo; size in &lt;a href="https://thanos.io/components/store.md/"&gt;Thanos Store&lt;/a&gt;. After a certain bug was &lt;a href="https://github.com/improbable-eng/thanos/pull/873"&gt;fixed&lt;/a&gt;, a lot of problems came up to users who were running with the default size of 200MiB. This is because this limit started being enforced whereas it was not before.&lt;/p&gt;
&lt;p&gt;I feel that it would be the perfect opportunity to explain how it works and how to determine what would be the appropriate size in your deployment.&lt;/p&gt;</description></item><item><title>Choosing Maximum Concurrent Queries in Prometheus Smartly</title><link>https://giedrius.blog/2019/01/13/choosing-maximum-concurrent-queries-in-prometheus-smartly/</link><pubDate>Sun, 13 Jan 2019 16:59:27 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=368</guid><description>&lt;p&gt;The popular monitoring software Prometheus has recently introduced (from &lt;strong&gt;2.6&lt;/strong&gt;) new knobs which regulate how many queries can be executed concurrently.&lt;/p&gt;
&lt;figure&gt;
&lt;img loading="lazy" src="https://upload.wikimedia.org/wikipedia/en/thumb/3/38/Prometheus%5Fsoftware%5Flogo.svg/1033px-Prometheus%5Fsoftware%5Flogo.svg.png"
alt="Prometheus logo from Wikipedia" width="382"/&gt; &lt;figcaption&gt;
&lt;p&gt;Prometheus logo from Wikipedia&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There are even the same knobs for different interfaces. Here they are with their default values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;ndash;storage.remote.read-concurrent-limit=10&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ndash;query.max-concurrency=20&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The latter is an upper-bound value to the former option. However, the question is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do you choose sensible values for them?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well, I think I have the answer.&lt;/p&gt;</description></item><item><title>Apply The Same Principle to Monitoring Alerts as to Software Bugs</title><link>https://giedrius.blog/2019/01/06/apply-the-same-principle-to-monitoring-alerts-as-to-software-bugs/</link><pubDate>Sun, 06 Jan 2019 14:04:52 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=366</guid><description>&lt;p&gt;It is almost a mantra in the quality assurance world to always add a test case to your unit, integration, or any other tests whenever you find a new error in your software product which checks for exactly that case. Over time I have noticed that the same principle should be applied to monitoring.&lt;/p&gt;
&lt;p&gt;Consider adding new alerting rules whenever you run into anomalous behavior and afterward you see the metrics which have indicated it. Treat it as if they are tests but they are &amp;ldquo;real-time&amp;rdquo; tests which provide not just more confidence in your software but also more transparency. After all, all tests &lt;strong&gt;do not show that there are no bugs in your program&lt;/strong&gt; &lt;strong&gt;but that at least those defined use cases &lt;a href="http://wiki.c2.com/?TestsCantProveTheAbsenceOfBugs"&gt;work&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Capacity planning of Prometheus 2.4.2 + Thanos Sidecar 0.1.0</title><link>https://giedrius.blog/2018/12/16/capacity-planning-of-prometheus-2-4-2-thanos-sidecar-0-1-0/</link><pubDate>Sun, 16 Dec 2018 19:35:38 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=313</guid><description>&lt;figure&gt;
&lt;img loading="lazy" src="https://giedrius.blog/wp-content/uploads/2018/12/devops-what-is.png" width="955"/&gt;
&lt;/figure&gt;
&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;
&lt;p&gt;Having a monitoring infrastructure is one of the tenets of the DevOps world. And, it seems that Prometheus and all of its extraneous integrations such as Thanos or Uber&amp;rsquo;s M3DB is taking over that world slowly. They give you a lot of improvements over the old Graphite set-ups such as increased reliability since Prometheus is based on HTTP which uses TCP thus you explicitly know when something goes wrong compared to UDP; it uses a pull based model so you explicitly know when something goes wrong and so on.&lt;/p&gt;</description></item><item><title>Are Scrum, Agile, and other iterative programming methodologies useful for niche programming specialties such as SREs, DevOps engineers, and so on?</title><link>https://giedrius.blog/2018/10/08/are-scrum-agile-and-other-iterative-programming-methodologies-useful-for-niche-programming-specialties-such-as-sres-devops-engineers-and-so-on/</link><pubDate>Mon, 08 Oct 2018 12:00:41 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=255</guid><description>&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;
&lt;p&gt;Recently I heard that someone asked in an &amp;ldquo;IT Systems Engineer&amp;rdquo; interview a question: &amp;ldquo;Why are you using Agile in your team? Are not most of the tasks on your team ad-hoc?&amp;rdquo;. This made me think about this topic deeply. The work being done in these types of teams might seem distant from regular programming at the beginning. However, it is not because in general it is focused on automating stuff using software, avoiding manual labor, building reliable systems or, in other words, the product and your clients are just different - they are internal whereas usually, they are external. Let me try to explain.&lt;/p&gt;</description></item><item><title>Tutorial: Poor Man's Release/Shipping Process on GitLab</title><link>https://giedrius.blog/2018/10/01/tutorial-poor-mans-release-shipping-process-on-gitlab/</link><pubDate>Mon, 01 Oct 2018 20:15:55 +0000</pubDate><guid isPermaLink="false">https://giedrius.blog/?p=278</guid><description>&lt;p&gt;&lt;img alt="Image result for gitlab" loading="lazy" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/GitLab_Logo.svg/2000px-GitLab_Logo.svg.png"&gt;&lt;/p&gt;
&lt;p&gt;Since the recent acquisition of GitHub by Microsoft, a lot of people and companies are migrating to GitLab. The GitLab offering is especially attractive to early-stage start-ups since they offer free 10000 CI minutes or, in other words, 10000 minutes on their CI servers. It is easy to move over the workload to your own Kubernetes cluster once you run out of them - there is an easy-to-use user interface available where you could do that with just a few clicks.&lt;/p&gt;</description></item><item><title>Terraform vSphere provider 1.x now supports deploying OVA files, makes using ovftool on ESXi hosts obsolete</title><link>https://giedrius.blog/2018/04/23/terraform-vsphere-provider-1-x-now-supports-deploying-ova-files-makes-using-ovftool-on-esxi-hosts-obsolete/</link><pubDate>Mon, 23 Apr 2018 15:54:01 +0000</pubDate><guid isPermaLink="false">http://giedrius.blog/?p=164</guid><description>&lt;p&gt;You may currently have this pipe-line in your CI/CD process that involves running &lt;em&gt;ovftool&lt;/em&gt; directly on your ESXi host so as to deploy an OVA appliance directly from it and with as less overhead as possible as in &lt;a href="https://www.virtuallyghetto.com/2014/05/how-to-finally-inject-ovf-properties-into-vcsa-when-deploying-directly-onto-esxi.html"&gt;this&lt;/a&gt; tutorial on virtuallyGhetto or you could have picked up some tips about running &lt;em&gt;ovftool&lt;/em&gt; on ESXi from this &lt;a href="https://giedrius.blog/2017/10/12/do-not-forget-to-open-443-port-while-using-ovftool-on-esxi-hosts/"&gt;article&lt;/a&gt; that I wrote some time ago.&lt;/p&gt;
&lt;p&gt;However, that is certainly not the best solution for many reasons. For example, if the input is not sanitized in some location(-s) then it becomes trivial to execute any command on the ESXi host. Thus, instead I recommend you to use a tool like Terraform to save your infrastructure as code in a Git repository, for example. With the 1.x version of the Terraform&amp;rsquo;s vSphere provider you can implement such pipe-line in Terraform as well.&lt;/p&gt;</description></item><item><title>Tutorial: Automatic, Reproducible Preparation of Virtual Machine templates for your vSphere environment with HashiCorp's Packer</title><link>https://giedrius.blog/2018/01/14/tutorial-automatic-reproducible-preparation-of-virtual-machine-templates-for-your-vsphere-environment-with-hashicorps-packer/</link><pubDate>Sun, 14 Jan 2018 10:45:52 +0000</pubDate><guid isPermaLink="false">http://giedrius.blog/?p=105</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Let us say that you are using an vSphere (VMWare vCenter + one or more ESXi servers) environment in your company and you are creating virtual machines pretty often. Obviously you are familiar with the virtual machines template functionality but where could you get the templates? Well, one of the options is to look for them somewhere on the internet but that is not a very reliable thing to do since you have to trust a third-party to provide these to you. Most, if not all, operating systems distributors do not provide a VMWare template for their operating system. For example, Canonical only provides Ubuntu in a form of an ISO file. Thus, you have to change your approach and make the templates yourself. However, doing that manually that is tedious and very menial so you will look for solutions to this problem. Packer is something that solves this problem.&lt;/p&gt;</description></item></channel></rss>