<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archives des YaK - dbi Blog</title>
	<atom:link href="https://www.dbi-services.com/blog/category/yak/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.dbi-services.com/blog/category/yak/</link>
	<description></description>
	<lastBuildDate>Wed, 25 Feb 2026 20:29:43 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/05/cropped-favicon_512x512px-min-32x32.png</url>
	<title>Archives des YaK - dbi Blog</title>
	<link>https://www.dbi-services.com/blog/category/yak/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to add Column Filtering to Vuetify Data Table</title>
		<link>https://www.dbi-services.com/blog/how-to-add-column-filtering-to-vuetify-data-table/</link>
					<comments>https://www.dbi-services.com/blog/how-to-add-column-filtering-to-vuetify-data-table/#respond</comments>
		
		<dc:creator><![CDATA[Joan Frey]]></dc:creator>
		<pubDate>Mon, 25 Aug 2025 19:22:27 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[vue]]></category>
		<category><![CDATA[vuejs]]></category>
		<category><![CDATA[vuetify]]></category>
		<category><![CDATA[yak]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=38050</guid>

					<description><![CDATA[<p>For a long time, my v-data-table-server implementation in the YaK only supported global search through a simple text input. While it was good enough for basic queries, I needed something more powerful—the ability to filter by individual columns using custom operators. Here’s a walkthrough of how I added column filters with v-select and v-text-field embedded [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/how-to-add-column-filtering-to-vuetify-data-table/">How to add Column Filtering to Vuetify Data Table</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>For a long time, my v-data-table-server implementation in the <a href="https://yak4all.io/">YaK </a>only supported global search through a simple text input. While it was good enough for basic queries, I needed something more powerful—the ability to filter by individual columns using custom operators.</p>



<p>Here’s a walkthrough of how I added column filters with v-select and v-text-field embedded in v-menu components right inside the table headers.</p>



<h2 class="wp-block-heading" id="h-the-problem">The Problem</h2>



<p>My users wanted to search not just by a global term but with more granularity—for example:</p>



<ul class="wp-block-list">
<li>Show only items where provider contains “aws”</li>



<li>Filter out items with a specific state</li>



<li>View all entries with a name that contains “master”</li>
</ul>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="468" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-34-1024x468.png" alt="" class="wp-image-38053" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-34-1024x468.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-34-300x137.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-34-768x351.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-34-1536x702.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-34.png 1761w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>The default Vuetify Data Table doesn’t support per-column filtering out of the box, so I needed to get creative, even if you can override the default filtering used with the <strong><a href="https://vuetifyjs.com/en/components/data-tables/data-and-display/#custom-filter">search</a></strong> prop.</p>



<h2 class="wp-block-heading" id="h-the-approach">The Approach</h2>



<ul class="wp-block-list">
<li><code>Attach filter UI elements to each column header</code></li>



<li><code>Bind filters to a filters object keyed by column title</code></li>



<li><code>Apply the filters to the data using a computed property</code></li>



<li><code>Change the icon and icon color on the header to indicate active filters</code></li>
</ul>



<h2 class="wp-block-heading" id="h-i-injecting-the-filter-ui-into-headers">I. Injecting the Filter UI into Headers</h2>



<p>In the v-slot:[header.key], I added a v-menu that displays a filter operator dropdown and a text input:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: xml; title: ; notranslate">
&lt;template
  v-for=&quot;header in dataHeaders&quot;
  v-slot:&#x5B;header.${header.key}]=&quot;{ column }&quot;
  :key=&quot;header.key&quot;
&gt;
  {{ column.title }}
  &lt;v-menu :close-on-content-click=&quot;false&quot;&gt;
    &lt;template v-slot:activator=&quot;{ props }&quot;&gt;
      &lt;v-btn icon v-bind=&quot;props&quot; color=&quot;transparent&quot;&gt;
        &lt;v-icon v-if=&quot;filters&#x5B;column.title].value&quot;&gt;mdi-filter&lt;/v-icon&gt;
        &lt;v-icon v-else&gt;mdi-filter-outline&lt;/v-icon&gt;
      &lt;/v-btn&gt;
    &lt;/template&gt;
    &lt;div class=&quot;filter-menu&quot;&gt;
      &lt;v-select
        v-model=&quot;filters&#x5B;column.title].operator&quot;
        :items=&quot;&#x5B;&#039;=&#039;, &#039;!=&#039;]&quot;
        label=&quot;Operator&quot;
        variant=&quot;outlined&quot;
        density=&quot;compact&quot;
      &gt;&lt;/v-select&gt;
      &lt;v-text-field
        v-model=&quot;filters&#x5B;column.title].value&quot;
        label=&quot;Search Term&quot;
        variant=&quot;outlined&quot;
        clearable
        density=&quot;compact&quot;
      &gt;&lt;/v-text-field&gt;
    &lt;/div&gt;
  &lt;/v-menu&gt;
&lt;/template&gt;
</pre></div>


<p>Each filter’s state is stored in a reactive object:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
const filters = ref&lt;Record&lt;string, { value: string; operator: string }&gt;&gt;({});
</pre></div>


<h2 class="wp-block-heading" id="h-ii-initializing-filters-for-each-column">II. Initializing Filters for Each Column</h2>



<p>Once I loaded the table headers, I made sure to initialize the corresponding filters:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
dataHeaders.value.forEach((header) =&gt; {
    if (!filters.value&#x5B;header.title]) {
        filters.value&#x5B;header.title] = { value: &quot;&quot;, operator: &quot;=&quot; };
     }
});
</pre></div>


<p>This ensured every column could be filtered independently and to avoid errors related to empty/null data.</p>



<h2 class="wp-block-heading" id="h-iii-applying-the-filters-to-the-data">III. Applying the Filters to the Data</h2>



<p>I used a computed property to transform the data on the fly:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
const filteredData = computed(() =&gt; {
  return recordData.value.filter((item) =&gt; {
    return Object.entries(filters.value).every((&#x5B;filterKey, filter]) =&gt; {
      if (!filter.value) return true;

      const matchingKey = Object.keys(item).find((key) =&gt; {
        const normalizedFilterKey = filterKey.toLowerCase();
        return key.toLowerCase() === normalizedFilterKey ||
               key.toLowerCase().endsWith(&quot;name&quot;) &amp;&amp;
               key.toLowerCase().startsWith(normalizedFilterKey);
      });

      if (!matchingKey) return true;

      const itemValue = String(item&#x5B;matchingKey] || &quot;&quot;).toLowerCase();
      const filterValue = filter.value.toLowerCase();

      return filter.operator === &quot;=&quot;
        ? itemValue.includes(filterValue)
        : !itemValue.includes(filterValue);
    });
  });
});
</pre></div>


<p>This filtering happens client-side after the data is fetched.</p>



<h2 class="wp-block-heading" id="h-iv-adding-ux-details">IV. Adding UX Details</h2>



<p>A few extra things I did for better UX:</p>



<ul class="wp-block-list">
<li>Colored icons: A regular filter icon shows when a filter is active.</li>



<li>Clear filters button (optional): Could be added for each column.</li>



<li>Auto-focus: Focuses on the text field when the menu opens.</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: xml; title: ; notranslate">
&lt;v-data-table-server
    v-model:items-per-page=&quot;itemsPerPage&quot;
    :items-per-page-options=&quot;itemsPerPageOptions&quot;
    :max-height=&quot;&#039;50vh&#039;&quot;
    fixed-header
    v-model=&quot;selected&quot;
    class=&quot;rounded-lg&quot;
    :headers=&quot;dataHeaders&quot;
    :items-length=&quot;recordLength&quot;
    :items=&quot;filteredData&quot;
    :loading=&quot;data.loading&quot;
    :search=&quot;search&quot;
    :select-strategy=&quot;&#039;all&#039;&quot;
    @update:options=&quot;loadRecord&quot;
    @click:row=&quot;onRowClick&quot;
    show-select
  &gt;
    &lt;template
      v-for=&quot;dataKey in dataHeaders&quot;
      v-slot:&#x5B;`item.${dataKey.key}`]=&quot;{ item }&quot;
    &gt;
      &lt;slot
        v-if=&quot;item&quot;
        :name=&quot;dataKey.key&quot;
        :value=&quot;item&#x5B;dataKey.key]&quot;
        :record=&quot;item&quot;
        &gt;{{ item&#x5B;dataKey.key] }}&lt;/slot
      &gt;
      &lt;span :key=&quot;`${dataKey.key}-placeholder`&quot; v-else&gt;-&lt;/span&gt;
    &lt;/template&gt;

    &lt;template
      v-for=&quot;header in dataHeaders&quot;
      v-slot:&#x5B;`header.${header.key}`]=&quot;{ column }&quot;
      :key=&quot;header.key&quot;
    &gt;
      {{ column.title }}
      &lt;v-menu :close-on-content-click=&quot;false&quot;&gt;
        &lt;template v-slot:activator=&quot;{ props }&quot;&gt;
          {{ filters&#x5B;header] }}
          &lt;v-btn
            icon
            v-bind=&quot;props&quot;
            color=&quot;rgba(255, 0, 0, 0.0)&quot;
            style=&quot;box-shadow: none&quot;
          &gt;
            &lt;v-icon v-if=&quot;filters&#x5B;column!.title!].value == &#039;&#039; ||filters&#x5B;column!.title!].value == null&quot; color=&quot;white&quot; size=&quot;small&quot;&gt;mdi-filter-outline&lt;/v-icon&gt;
            &lt;v-icon v-else color=&quot;orange&quot; size=&quot;small&quot;&gt;mdi-filter&lt;/v-icon&gt;
          &lt;/v-btn&gt;
        &lt;/template&gt;
        &lt;div style=&quot;background-color: white; width: 200px; border-radius: 10px;&quot;&gt;
          &lt;v-select
            v-model=&quot;filters&#x5B;column.title!].operator&quot;
            :items=&quot;&#x5B;&#039;=&#039;, &#039;!=&#039;]&quot;
            label=&quot;Select operator&quot;
            class=&quot;pt-4 pl-4 pr-4&quot;
            variant=&quot;outlined&quot;
            density=&quot;compact&quot;
          &gt;&lt;/v-select&gt;
          &lt;v-text-field
            v-model=&quot;filters&#x5B;column.title!].value&quot;
            class=&quot;pl-4 pr-4&quot;
            type=&quot;text&quot;
            label=&quot;Enter the search term&quot;
            :autofocus=&quot;true&quot;
            variant=&quot;outlined&quot;
            clearable
            density=&quot;compact&quot;
          &gt;&lt;/v-text-field&gt;
        &lt;/div&gt;
      &lt;/v-menu&gt;
    &lt;/template&gt;
  &lt;/v-data-table-server&gt;
</pre></div>


<h2 class="wp-block-heading" id="h-what-s-next">What’s Next?</h2>



<p>After adding this new feature, the sort indicator next to each column header disappeared—although sorting still works as expected. I haven’t had time to look into it yet, but I’d like to find a solution. If you happen to figure it out, feel free to share it in the comments!</p>



<h2 class="wp-block-heading" id="h-where-to-find-the-complete-code">Where to find the complete code ?</h2>



<p>You can check out the complete and latest code in the open-source project on GitLab:<br>👉 <a class="" href="https://gitlab.com/yak4all/yak_frontend/yak_ui">https://gitlab.com/yak4all/yak_frontend/yak_ui</a><br>The relevant logic lives in the <code>YakGrid.vue</code> component.</p>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p>By embedding filter controls directly into column headers and managing state reactively, I was able to turn a basic Vuetify data table into a much more powerful data exploration tool.</p>



<p>Let me know if you try this pattern or come up with improvements—I’m always up for iterating! You can also suggest changes or contribute directly on the GitLab repo of the Yak project.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/how-to-add-column-filtering-to-vuetify-data-table/">How to add Column Filtering to Vuetify Data Table</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/how-to-add-column-filtering-to-vuetify-data-table/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Try YaK for free with YaK Demo</title>
		<link>https://www.dbi-services.com/blog/try-yak-for-free-with-yak-demo/</link>
					<comments>https://www.dbi-services.com/blog/try-yak-for-free-with-yak-demo/#respond</comments>
		
		<dc:creator><![CDATA[Rémy Gaudey]]></dc:creator>
		<pubDate>Tue, 29 Jul 2025 07:40:00 +0000</pubDate>
				<category><![CDATA[YaK]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=39584</guid>

					<description><![CDATA[<p>dbi services makes free demo environments available to all, so that you can play with the YaK and deploy instances and components to Azure and AWS. The YaK Demo environment is hosted on one of dbi services AWS tenants and is automatically destroyed after 4 hours. The demo environment is not supposed to be used [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/try-yak-for-free-with-yak-demo/">Try YaK for free with YaK Demo</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>dbi services makes free demo environments available to all, so that you can play with the <a href="https://yak4all.io/">YaK</a> and deploy instances and components to Azure and AWS. The <a href="https://yak4all.io/demo">YaK Demo</a> environment is hosted on one of dbi services AWS tenants and is automatically destroyed <strong>after 4 hours</strong>.</p>



<p class="is-style-plain"><em>The demo environment is not supposed to be used for production purpose (it’s just a demo and everything is scrubbed after 4 hours)</em><br><em>dbi services shall not be held liable for any data loss on this demo environmen</em>t.</p>



<h2 class="wp-block-heading" id="wanna-give-it-a-try"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#wanna-give-it-a-try"></a>Wanna give it a try?</h2>



<p>To do so, simply connect to <a href="https://yak4all.io/demo/">https://yak4all.io/demo/</a>, fill in the form and you will receive a confirmation email from <strong>no-reply@dbi-services.com</strong>.</p>



<p>Please allow 5 to 10 minutes for the environment to be provisioned and the YaK to spin up. Once up and running you&#8217;ll receive a second email from <strong>no-reply@demo.yak4all.io</strong> with the URL and credentials to connect to your YaK.</p>



<p>Check your inbox and junk mail to make sure you don&#8217;t miss out on your YaK experience!</p>



<h3 class="wp-block-heading" id="limitations"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#limitations"></a>Limitations</h3>



<p>The demo environment we provision comes with the following restrictions (this will not be the case with a regular installation of YaK):</p>



<ul class="wp-block-list">
<li>AWS infrastructure:
<ul class="wp-block-list">
<li><strong>Available shapes</strong>: t3.micro, t3.small, t3.medium</li>



<li><strong>Available disk types:</strong> gp2, gp3</li>



<li><strong>Disk sizes:</strong> max 50gb</li>



<li><strong>Available component:</strong> PostgreSQL</li>



<li><strong>AWS Region:</strong> eu-west-1</li>
</ul>
</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li>Azure infrastructure:
<ul class="wp-block-list">
<li><strong>Available shapes</strong>: Standard_B2s, Standard_B2ms</li>



<li><strong>Available disk types:</strong> Standard_LRS, StandardSSD_LRS</li>



<li><strong>Disk sizes:</strong> max 64gb</li>



<li><strong>Available component:</strong> PostgreSQL</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading" id="yak-login-page"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#yak-login-page"></a>YaK Login Page</h2>



<p>Open the link received and log into the YaK with the credentials from the email.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img decoding="async" src="https://dbi-services.gitbook.io/yak-user-doc/~gitbook/image?url=https%3A%2F%2F2436296891-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FMGFsptWcTlGb6Djq7qsZ%252Fuploads%252Fgit-blob-b9dc83c9accd5b35765d2050064ef9091960a0dc%252FYaK_login_page.png%3Falt%3Dmedia&amp;width=768&amp;dpr=4&amp;quality=100&amp;sign=3eab5c65&amp;sv=2" alt="YaK Login page" style="width:548px;height:auto" /></figure>
</div>


<h2 class="wp-block-heading" id="where-to-start"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#where-to-start"></a>Where to start?</h2>



<p>Alright, you&#8217;re all set, your environment is ready. Let&#8217;s give it a try!</p>



<p>We have pre-provisioned the YaK with a few things for you so that you can almost immediately deploy your servers and components:</p>



<ul class="wp-block-list">
<li>2 infrastructures have been pre-provisioned:
<ul class="wp-block-list">
<li>An AWS demo infrastructure:<strong> &#8220;aws-demo-1&#8221;</strong></li>



<li>A Microsoft Azure demo infrastructure: <strong>&#8220;azure-demo-1&#8221;</strong></li>
</ul>
</li>



<li>Cloud providers secrets have been attached to these infrastructures</li>



<li>A PostgreSQL component type is available to you</li>
</ul>



<h2 class="wp-block-heading" id="what-you-need-to-do-now"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#what-you-need-to-do-now"></a>What you need to do now</h2>



<p>Well, we&#8217;ve thought of a scenario, but feel free to explore the YaK on your own if you prefer.</p>



<p>Our use case here is to deploy a server to AWS or to Azure and then deploy a PostgreSQL database instance on it.</p>



<h3 class="wp-block-heading" id="id-1.-declare-a-ssh-key"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#id-1.-declare-a-ssh-key"></a>1. Declare a SSH key</h3>



<p>In order to connect securely to the Linux servers once created, a pair of SSH keys must be generated and the <strong>private key</strong> must be transferred to the servers.</p>



<ul class="wp-block-list">
<li>Generate your SSH key:</li>
</ul>



<p>SSH keys can be generated from any Linux-based machine running openSSH with the &#8220;ssh-keygen&#8221; command.</p>



<pre class="wp-block-code"><code>$ ssh-keygen -b 4096 -m PEM -t rsa -f my-ssh-key -q -N ""</code></pre>



<p>Windows users can generate SSH keys using the PuTTYgen utility (<a href="https://dbi-services.gitbook.io/yak-user-doc/appendix/create-ssh-keys-with-puttygen">follow this link</a>)</p>



<ul class="wp-block-list">
<li>Copy the content of the <strong>private key</strong> file:</li>
</ul>



<pre class="wp-block-code"><code>$ cat my-ssh-key
##This is just an example, generate your own private key

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABASDILVb1
MiZ78g848c6Dk6KYwkJZXloSIruLe+Sid0Xd+Lb1rAxbwzAhXWRMzzBT5k3WciXk2fMhUD
p4YSahpYvquZK950aXiZNDOJpKZP8wjf4g4nQyiJZ/0G0J9mIaI2h/fr8TA67KHYtu/Eyf
PN9bKJwII3aiGlu5/Viq2cgYT8jJ01AK8cY3tSqKdlrN2GyxllBFl42QplbxA2USPJ1E6v
VIjtbmJjdz&#091;...........................................]qAc4HxP02t/N2ZN
q+dDNWeShfVz4zjApPQCzdiGqLAlzUy67KNxQgljhaOEaYTQgrLE8XNGsIFNZwGvsEo/xZ
XnN2p
-----END OPENSSH PRIVATE KEY-----</code></pre>



<ol class="wp-block-list">
<li>Feed the YaK with the SSH key:
<ul class="wp-block-list">
<li>From the menu, navigate to <strong>Configuration</strong> -&gt; S<strong>ecrets</strong></li>



<li>Click &#8220;<strong>Declare</strong>&#8220;</li>



<li>Give a name to your secret (my-ssh-key)</li>



<li>Select &#8220;<strong>ssh key</strong>&#8221; as secret type</li>
</ul>
</li>



<li>Paste the entirety of the <strong>private key</strong> previously copied, into the corresponding field of the form</li>



<li>Click &#8220;<strong>Save</strong>&#8220;</li>
</ol>



<h3 class="wp-block-heading" id="id-2.-attach-your-ssh-secret"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#id-2.-attach-your-ssh-secret"></a>2. Attach your SSH key to the infrastructure</h3>



<ol class="wp-block-list">
<li>From the menu, navigate to &#8220;<strong>Infrastructures</strong>&#8220;</li>



<li>Select the infrastructure you would like to deploy to in the list (<strong>&#8220;aws-demo-1&#8221;</strong> or <strong>&#8220;azure-demo-1&#8221;</strong>)</li>



<li>Click the &#8220;<strong>Action</strong>&#8221; button</li>



<li>Click &#8220;<strong>Attach secret</strong>&#8220;</li>



<li>Select the SSH secret created in the previous step from the list</li>



<li>Click &#8220;<strong>Attach</strong>&#8220;</li>
</ol>



<h3 class="wp-block-heading" id="id-3.-declare-a-server"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#id-3.-declare-a-server"></a>3. Declare a server</h3>



<ol class="wp-block-list">
<li>Navigate to the &#8220;<strong>Servers</strong>&#8221; menu</li>



<li>Click &#8220;<strong>Declare</strong>&#8220;</li>



<li>Give it a name</li>



<li>Select the <strong>Infrastructure </strong>to deploy your server to (<strong>&#8220;aws-demo-1&#8221;</strong> or <strong>&#8220;azure-demo-1&#8221;</strong>)</li>



<li>Select an <strong>Image</strong> to install : let&#8217;s take Debian 12 for example</li>



<li>Select a server <strong>Shape</strong></li>



<li>Add custom tags as per your need (optional)</li>



<li>Network section:
<ul class="wp-block-list">
<li>Mode: <strong>automatic</strong></li>



<li>IP: <strong>leave blank</strong></li>



<li>Scope: <strong>public</strong></li>



<li>Tick the &#8220;Admin access&#8221; checkbox: this defines the IP address used to connect to the server for configuration purpose.</li>
</ul>
</li>



<li>Click <strong>Save</strong></li>
</ol>



<p><em>In Azure, VM names must be unique. Since we&#8217;re all sharing the same demo environment, avoid instance names that are too obvious and could conflict with other users&#8217; machines, such as “srv01”, ‘server1’, “myserver”, etc. Be creative to avoid potential conflicts with other users </em><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h3 class="wp-block-heading" id="id-4.-deploy-server"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#id-4.-deploy-server"></a>4. Deploy your server</h3>



<ol class="wp-block-list">
<li>Select your server in the list</li>



<li>Click &#8220;<strong>Deploy</strong>&#8221; from the &#8220;<strong>Actions</strong>&#8221; menu</li>



<li>Confirm &#8220;<strong>Deploy</strong>&#8221; in the pop up box
<ul class="wp-block-list">
<li>Follow the deployment steps from the Jobs menu to see what the YaK is doing behind the scene. If you&#8217;ve followed the steps it should succeed (if not you must have missed something <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" />)</li>
</ul>
</li>



<li>Wait until the job status is <strong>&#8220;Successful&#8221;</strong></li>



<li>Your server should be started automatically and will soon be in a <strong>&#8220;running&#8221;</strong> state
<ul class="wp-block-list">
<li>You should already be able to connect to it via SSH by selecting the server and retrieving the <strong>public IP</strong> from the server parameters. (see step &#8220;7. Connect to your server&#8221;)</li>



<li>But hold your horses! Let&#8217;s deploy a component on it! (if you can&#8217;t wait, skip the component deployment and come back to it later, that&#8217;s OK)</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading" id="id-5.-declare-component"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#id-5.-declare-component"></a>5. Declare your component</h3>



<ol class="wp-block-list">
<li>Navigate to the &#8220;<strong>Components</strong>&#8221; menu</li>



<li>Click &#8220;<strong>Declare</strong>&#8220;</li>



<li>Give it a name (ex: PG01)</li>



<li>Select your component type (postgresql_instance)</li>



<li>Select your subcomponent type (standalone)
<ul class="wp-block-list">
<li>HA requires 3 servers be deployed, in this example we will consider a <strong>standalone</strong> setup as we have declared 1 server only</li>
</ul>
</li>



<li>Choose your Provider (here it will be <strong>aws </strong>or<strong> azure</strong>)</li>



<li>Select the <strong>PostgreSQL host</strong> where you want to deploy your database instance (the server created previously)</li>



<li>Fill in the <strong>&#8220;Instance name&#8221;</strong> field (ex: mypgdb)</li>



<li>Navigate to the <strong>&#8220;Storage&#8221;</strong> tab and fill in the required fields.
<ul class="wp-block-list">
<li>Set <strong>Max size of component disks</strong> for the 3 file systems:
<ul class="wp-block-list">
<li>/u01 -&gt; <strong>40GB</strong></li>



<li>/u02 -&gt; <strong>20GB</strong></li>



<li>/u90 -&gt; <strong>20GB</strong></li>
</ul>
</li>
</ul>
</li>



<li>Click &#8220;<strong>Save</strong>&#8220;</li>
</ol>



<h3 class="wp-block-heading" id="id-6.-deploy-component"><a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo#id-6.-deploy-component"></a>6. Deploy your component</h3>



<p>Your PostgreSQL database instance is configured, now let&#8217;s deploy it:</p>



<ol class="wp-block-list">
<li>Select the component you&#8217;ve just configured from the list</li>



<li>Click &#8220;<strong>Actions</strong>&#8220;</li>



<li>Then click <strong>&#8220;Deploy a new PostgreSQL Standalone instance&#8221;</strong></li>



<li>Confirm your choice in the pop-up menu</li>



<li>Seat back, relax, follow the deployment steps from the <strong>jobs</strong> menu and wait until your component is successfully installed and configured.</li>
</ol>



<h3 class="wp-block-heading" id="h-7-connect-to-your-server-and-play-around">7. Connect to your server and play around</h3>



<ul class="wp-block-list">
<li>Open a SSH connection to the <strong>public IP address</strong> of your server:</li>
</ul>



<pre class="wp-block-code"><code>DEMOUSER@demo$ ssh -i my-ssh-key &lt;user&gt;@&lt;PUBLIC_IP&gt;</code></pre>



<ul class="wp-block-list">
<li>Your <code>PUBLIC_IP</code> address can be retrieved from <strong>Servers</strong> -&gt; <strong>Parameters</strong></li>



<li>User:
<ul class="wp-block-list">
<li><strong>Azure</strong> default user is <code>azureuser</code></li>



<li><strong>AWS</strong> default users (see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/managing-users.html">AWS doc</a> for more details):
<ul class="wp-block-list">
<li>The default user for debian based AMI is &#8220;<code>admin</code>&#8220;, but this could be something else, based on the AMI you selected.</li>



<li>For an Amazon Linux AMI, the username is <code>ec2-user</code>.</li>



<li>For a CentOS AMI, the username is <code>centos</code> or <code>ec2-user</code>.
<ul class="wp-block-list">
<li>For a Debian AMI, the username is <code>admin</code>.</li>



<li>For a Fedora AMI, the username is <code>fedora</code> or <code>ec2-user</code>.</li>



<li>For a RHEL AMI, the username is <code>ec2-user</code> or <code>root</code>.</li>



<li>For a SUSE AMI, the username is <code>ec2-user</code> or <code>root</code>.</li>



<li>For an Ubuntu AMI, the username is <code>ubuntu</code>.</li>



<li>For an Oracle AMI, the username is <code>ec2-user</code>.</li>



<li>For a Bitnami AMI, the username is <code>bitnami</code>.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li>Play with your PostgreSQL database instance!</li>
</ul>



<pre class="wp-block-code"><code>admin@my-server1:~$ sudo su - postgres


 PostgreSQL Clusters up and running on this host:
 ----------------------------------------------------------------------------------------------
    mypgdb      -&gt;  /u02/pgdata/17/mypgdb                                    -&gt;  5432  ==&gt; OPEN

 PostgreSQL Clusters NOT running on this host:
 ----------------------------------------------------------------------------------------------

16:39:13 postgres@my-server1:/home/postgres/ &#091;pg17.2] psql -p 5432
psql (17.2 dbi services build)
Type "help" for help.

postgres=#</code></pre>



<p>Thanks for reading this blog, for more info about the YaK, visit&nbsp;<a href="https://yak4all.io/">yak4all.io</a> or <a href="https://yak4all.io/contact/">contact us</a> directly.</p>



<p>Read my <a href="https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/">other blog</a> if you&#8217;d like to install your own RKE2 Kubernetes cluster and your own YaK at home!<br><br>Happy YaKing <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> !<br></p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://yak4all.io/contact/">Contact the YaK team</a></div>



<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://yak4all.io/">Visit yak4all.io</a></div>
</div>



<p></p>
<p>L’article <a href="https://www.dbi-services.com/blog/try-yak-for-free-with-yak-demo/">Try YaK for free with YaK Demo</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/try-yak-for-free-with-yak-demo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Install a single node Kubernetes cluster with SUSE RKE2 and deploy your own YaK instance</title>
		<link>https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/</link>
					<comments>https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/#respond</comments>
		
		<dc:creator><![CDATA[Rémy Gaudey]]></dc:creator>
		<pubDate>Tue, 15 Jul 2025 07:30:00 +0000</pubDate>
				<category><![CDATA[YaK]]></category>
		<category><![CDATA[#yak]]></category>
		<category><![CDATA[kubernetes]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=39390</guid>

					<description><![CDATA[<p>I bought a mini PC last year and I use it as a home lab to test things and play around.So I thought, why not install a RKE2 Kubernetes cluster and deploy my own YaK instance on it? Let’s dive-in. In this article, I will explain how I installed a single node Kubernetes cluster with [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/">Install a single node Kubernetes cluster with SUSE RKE2 and deploy your own YaK instance</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>I bought a mini PC last year and I use it as a home lab to test things and play around.<br>So I thought, why not install a RKE2 Kubernetes cluster and deploy my own YaK instance on it?</p>



<p>Let’s dive-in.</p>



<p>In this article, I will explain how I installed a single node Kubernetes cluster with SUSE RKE2 and deployed my own local YaK instance.</p>



<p>Here is my setup:</p>



<ul class="wp-block-list">
<li>Intel NUC 13 Pro (with Intel Core i5-1340P)</li>



<li>64GB of RAM DDR4</li>



<li>1TB SSD</li>
</ul>



<p>I’m using <a href="https://www.proxmox.com/en/">Proxmox</a> as a virtualisation platform on this mini PC, and I’ve chosen SUSE Leap 15.6 as the operating system for the virtual machine that will host my RKE2 installation.</p>



<h2 class="wp-block-heading" id="h-create-my-vm-in-proxmox">Create my VM in Proxmox</h2>



<p>First, I created a VM and dedicated some resources to my instance.</p>



<p>SUSE recommends at least 8GB of RAM and 4vCPU for RKE2 to run smoothly.</p>



<p>Let’s start with that, I can adjust later if the system struggles.</p>



<p>I added 50GB of storage, that should be more than enough (that’s a lot of storage, we really don’t need that much for the YaK itself, but I might reuse this VM for other purposes too)</p>



<figure class="wp-block-image size-full"><img decoding="async" width="904" height="478" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-9.png" alt="" class="wp-image-39392" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-9.png 904w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-9-300x159.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-9-768x406.png 768w" sizes="(max-width: 904px) 100vw, 904px" /></figure>



<p>I’m passing the installation steps of SUSE Leap in server mode, as they are straightforward.<br>But, just in case, I&#8217;m adding the links to <a href="https://www.proxmox.com/en/products/proxmox-virtual-environment/get-started">Proxmox</a> and to <a href="https://doc.opensuse.org/documentation/leap/startup/html/book-startup/art-opensuse-installquick.html">SUSE Leap</a> install docs here.</p>



<h2 class="wp-block-heading" id="h-install-packages">Install packages</h2>



<p>First of all, we need to install the following packages on the VM hosting the YaK:</p>



<ul class="wp-block-list">
<li>Tar</li>



<li>Git</li>



<li>Helm</li>
</ul>



<p>Let’s check what is already installed by default with SUSE Leap 15.6:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [12,20,25]; title: ; notranslate">
localhost:~ # zypper se --installed-only tar
Loading repository data...
Reading installed packages...

S  | Name                    | Summary                                          | Type
---+-------------------------+--------------------------------------------------+--------
i  | cantarell-fonts         | Contemporary Humanist Sans Serif Font            | package
i  | deltarpm                | Tools to Create and Apply deltarpms              | package
i  | shared-python-startup   | Startup script shared by all Python interpreters | package
i  | star                    | POSIX.1-2001-Compliant Tar Implementation        | package
i  | star-rmt                | Magnetic tape control and server                 | package
i  | tar                     | GNU implementation of ((t)ape (ar)chiver)        | package
i  | tar-lang                | Translations for package tar                     | package
i  | tar-rmt                 | Remote tape drive control server by GNU          | package
i  | zypper-needs-restarting | needs-restarting compatibility with zypper       | package

localhost:~ # zypper se --installed-only git
Loading repository data...
Reading installed packages...
No matching items found.

localhost:~ # zypper se --installed-only helm
Loading repository data...
Reading installed packages...
No matching items found.
</pre></div>


<p>As you can see, <strong>Tar</strong> is already installed but not <strong>Git</strong> nor <strong>Helm</strong>. Let’s install them:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
localhost:~ # zypper install git
localhost:~ # zypper install helm
</pre></div>


<h2 class="wp-block-heading" id="h-stop-firewalld">Stop firewalld</h2>



<p>As a <a href="https://dbi-services.gitbook.io/yak-user-doc/installation/system-requirements">pre-requisite</a>, Firewalld must be stopped. <br>Let’s check its status:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [4]; title: ; notranslate">
localhost:~ # systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: disabled)
     Active: active (running) since Wed 2025-04-30 12:12:43 CEST; 2h 7min ago
       Docs: man:firewalld(1)
   Main PID: 743 (firewalld)
      Tasks: 2 (limit: 4915)
        CPU: 349ms
     CGroup: /system.slice/firewalld.service
             └─743 /usr/bin/python3 /usr/sbin/firewalld --nofork --nopid

Apr 30 12:12:43 localhost systemd&#x5B;1]: Starting firewalld - dynamic firewall daemon...
Apr 30 12:12:43 localhost systemd&#x5B;1]: Started firewalld - dynamic firewall daemon.

</pre></div>


<p>Firewalld is active. I need to stop and disable the service so that it does not restart at system startup:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
localhost:~ # systemctl stop firewalld
localhost:~ # systemctl disable firewalld
</pre></div>


<h2 class="wp-block-heading" id="h-install-rke2">Install RKE2</h2>



<p>Next, I installed RKE2. To do so, I simply followed the official procedure: <a href="https://docs.rke2.io/install/quickstart">https://docs.rke2.io/install/quickstart</a></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
localhost:~ # curl -sfL https://get.rke2.io | sh -
localhost:~ # systemctl enable rke2-server.service
localhost:~ # systemctl start rke2-server.service

</pre></div>


<p>As mentioned in the RKE2 documentation: <em>“additional utilities will be installed at&nbsp;<code>/var/lib/rancher/rke2/bin/</code>. They include:&nbsp;kubectl,&nbsp;crictl, and&nbsp;ctr.<br>Note that these are not on your path by default.”</em></p>



<p>I’m adding the repository to my default PATH (this step can be done temporarily or permanently, by editing your <code>~/.bashrc file</code>). I chose to make it permanent by editing my <code>~/.bashrc file</code>, but it’s up to you.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
export PATH=&quot;/var/lib/rancher/rke2/bin:$PATH&quot;
</pre></div>


<p>RKE2 install writes a kubeconfig file to&nbsp;<code>/etc/rancher/rke2/rke2.yaml</code><strong>.</strong><br>Again, I’m adding this into my <code>~/.bashrc</code> file</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
</pre></div>


<p>I check that the Kubernetes cluster is up and pods are running:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [1,5]; title: ; notranslate">
localhost:~ # kubectl get nodes
NAME        STATUS   ROLES                       AGE   VERSION
localhost   Ready    control-plane,etcd,master   22m   v1.31.7+rke2r1

localhost:~ # kubectl get pods -A
NAMESPACE     NAME                                                    READY   STATUS      RESTARTS      AGE
kube-system   cloud-controller-manager-localhost                      1/1     Running     1 (23m ago)   22m
kube-system   etcd-localhost                                          1/1     Running     0             22m
kube-system   helm-install-rke2-canal-nxphw                           0/1     Completed   0             23m
kube-system   helm-install-rke2-coredns-2whps                         0/1     Completed   0             23m
kube-system   helm-install-rke2-ingress-nginx-9mpwb                   0/1     Completed   0             23m
kube-system   helm-install-rke2-metrics-server-t8g27                  0/1     Completed   0             23m
kube-system   helm-install-rke2-runtimeclasses-nbq2v                  0/1     Completed   0             23m
kube-system   helm-install-rke2-snapshot-controller-crd-fmwqh         0/1     Completed   0             23m
kube-system   helm-install-rke2-snapshot-controller-nqq5g             0/1     Completed   1             23m
kube-system   kube-apiserver-localhost                                1/1     Running     0             22m
kube-system   kube-controller-manager-localhost                       1/1     Running     0             22m
kube-system   kube-proxy-localhost                                    1/1     Running     0             22m
kube-system   kube-scheduler-localhost                                1/1     Running     0             22m
kube-system   rke2-canal-qlk8b                                        2/2     Running     0             22m
kube-system   rke2-coredns-rke2-coredns-autoscaler-596dcdf688-dsjjz   1/1     Running     0             22m
kube-system   rke2-coredns-rke2-coredns-cf7df985b-zqwqn               1/1     Running     0             22m
kube-system   rke2-ingress-nginx-controller-b52nh                     1/1     Running     0             21m
kube-system   rke2-metrics-server-58ff89f9c7-dndfb                    0/1     Running     0             21m
kube-system   rke2-snapshot-controller-58dbcfd956-srw5z               1/1     Running     0             21m

</pre></div>


<h2 class="wp-block-heading" id="h-add-a-persistent-volume">Add a persistent volume</h2>



<p>We need some storage, don&#8217;t we?<br>By default, RKE2 does not provide persistent volumes.<br>However, “Local Path Provisioner” provides a way for the Kubernetes users to utilize the local storage in each node (<a href="https://github.com/rancher/local-path-provisioner">https://github.com/rancher/local-path-provisioner</a>). Let&#8217;s use that.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [1]; title: ; notranslate">
localhost:~ # kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.31/deploy/local-path-storage.yaml
namespace/local-path-storage created
serviceaccount/local-path-provisioner-service-account created
role.rbac.authorization.k8s.io/local-path-provisioner-role created
clusterrole.rbac.authorization.k8s.io/local-path-provisioner-role created
rolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created
clusterrolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created
deployment.apps/local-path-provisioner created
storageclass.storage.k8s.io/local-path created
configmap/local-path-config created
</pre></div>


<h2 class="wp-block-heading" id="h-install-yak">Install YaK</h2>



<p>Alright, I now have a fully functional Kubernetes cluster.<br>Let’s install the YaK on it now.</p>



<ul class="wp-block-list">
<li>Create a namespace:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
kubectl create ns yak
</pre></div>


<ul class="wp-block-list">
<li>Add yak repo</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
helm repo add yak https://gitlab.com/api/v4/projects/63133284/packages/helm/stable &amp;&amp; helm repo update
</pre></div>


<ul class="wp-block-list">
<li>Create the yak.values.yaml definition file</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
localhost:~ # vi yak.values.yaml
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
global:
  hostname: yak.lab
  admin_credentials:
    password: &quot;ABCdef1234@&quot; #default password to be changed to your need

yak-postgres:
  postgresPassword: &quot;&quot; # Randomly generated if not set
  persistence:
    size: 20Gi
    storageClassName: &quot;local-path&quot; # Uses default if empty

yak-graphile:
  # Archive storage stores the component types archives at import time
  persistence: &amp;archives_storage
    size: 20Gi
    storageClassName: &quot;local-path&quot; # Uses default if empty
  # If using a multi-node cluster, uncomment these 2 lines:
    #accessModes:
     # - ReadWriteMany

  # If you want to expose the rest API at https://hostname/data/graphql and have the postgraphile UI at https://yak.my-domain.local/data/graphiql
  ingress:
    enabled: true
    className: &quot;&quot; # Uses default if empty
    tls:
     - secretName: yak-tls-secret
       hosts:
       - yak.lab

yak-runner:
  image:
    pullPolicy: Always
  persistence:
  # Runner shares the archives storage with graphile
    graphile: *archives_storage
    components:
      enabled: true
      storageClassName: &quot;local-path&quot; # Uses default if empty
      size: 8Gi
    sshconfig:
      enabled: true
      storageClassName: &quot;local-path&quot; # Uses default if empty
      size: 1Gi

yak-ui:
  # Mandatory if you want to access the UI through ingress
  ingress:
    enabled: true
    className: &quot;&quot; # Uses default if empty
    tls:
     - secretName: yak-tls-secret
       hosts:
       - yak.lab

</pre></div>


<ul class="wp-block-list">
<li>Run Helm install YaK</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
helm install yak yak/yak -f yak.values.yaml -n yak
</pre></div>


<ul class="wp-block-list">
<li>Check that YaK is properly deployed (all 4 pods should be Running after a few minutes)</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
localhost:~ # kubectl get pods -n yak
NAME                            READY   STATUS    RESTARTS   AGE
yak-graphile-5b5454fd64-hmk2c   1/1     Running   0          1m
yak-postgres-7bcf4f9897-7mrdg   1/1     Running   0          1m
yak-runner-6669948599-9ggwn     1/1     Running   0          1m
yak-ui-7f6d77c765-spgfn         1/1     Running   0          1m

</pre></div>


<h2 class="wp-block-heading" id="h-connect-to-the-yak-with-https">Connect to the YaK with https</h2>



<p>Finally, let&#8217;s connect to our web app!</p>



<ul class="wp-block-list">
<li>Update your local <code>/etc/hosts</code> file and add your YaK server, in my case:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
192.168.10.185   yak.lab
</pre></div>


<ul class="wp-block-list">
<li>Open a web browser and navigate to your URL : https://yak.lab
<ul class="wp-block-list">
<li>Default credentials :
<ul class="wp-block-list">
<li>User: admin</li>



<li>Password: ABCdef1234@</li>
</ul>
</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="650" height="500" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-15.png" alt="YaK login page" class="wp-image-39435" style="width:650px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-15.png 650w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-15-300x231.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="692" height="446" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-16.png" alt="YaK Dashboard" class="wp-image-39436" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-16.png 692w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/07/image-16-300x193.png 300w" sizes="auto, (max-width: 692px) 100vw, 692px" /></figure>



<p>Voilà!!</p>



<p>I’ve now got a local YaK on RKE2 running at home, ready to deploy infrastructures, servers and components wherever I want.</p>



<p>For more info about the YaK, visit <a href="https://yak4all.io">yak4all.io</a></p>



<p>And if you can&#8217;t be bothered installing your own YaK, you can bring up a fully functional YaK demo environment, within minutes : <a href="https://yak4all.io/demo/">yak4all.io/demo</a><br>Feel free to play around and explore our <a href="https://dbi-services.gitbook.io/yak-user-doc/yak-demo">use cases</a> </p>



<p>Happy YaKing 😉 !</p>
<p>L’article <a href="https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/">Install a single node Kubernetes cluster with SUSE RKE2 and deploy your own YaK instance</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/install-a-single-node-kubernetes-cluster-with-suse-rke2-and-deploy-your-own-yak-instance/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)</title>
		<link>https://www.dbi-services.com/blog/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization/</link>
					<comments>https://www.dbi-services.com/blog/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization/#respond</comments>
		
		<dc:creator><![CDATA[Donovan Winter]]></dc:creator>
		<pubDate>Tue, 24 Jun 2025 12:42:55 +0000</pubDate>
				<category><![CDATA[Development & Performance]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Developer Experience]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[OpenShift]]></category>
		<category><![CDATA[openshift virtualization]]></category>
		<category><![CDATA[yak]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=39053</guid>

					<description><![CDATA[<p>YaK is a platform-agnostic framework designed to streamline and automate the deployment of infrastructure and&#160;middleware&#160;components&#160;(database, K8S,etc..) across various environments. With its open-source core, YaK enables developers, DevOps teams, and IT professionals to manage infrastructure provisioning and component deployment efficiently, without being tied to a specific vendor. Whether you&#8217;re working with AWS, Azure, Oracle Cloud Infrastructure [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization/">How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>YaK is a platform-agnostic framework designed to streamline and automate the deployment of infrastructure and&nbsp;middleware&nbsp;components&nbsp;(database, K8S,etc..) across various environments. With its open-source core, YaK enables developers, DevOps teams, and IT professionals to manage infrastructure provisioning and component deployment efficiently, without being tied to a specific vendor. Whether you&#8217;re working with AWS, Azure, Oracle Cloud Infrastructure (OCI), or on-premises servers, YaK provides a consistent and flexible solution for your deployment needs. To have more informations, visit <a href="https://yak4all.io/">https://yak4all.io/</a></p>



<p>In this guide, we&#8217;ll walk you through the process of contributing to the YaK project by adding support for a new infrastructure provider, using OpenShift Virtualization as an example. We&#8217;ll cover the steps to fork the necessary repositories, implement the required changes, and integrate your contributions into the main project.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="900" height="600" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-30.png" alt="" class="wp-image-39138" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-30.png 900w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-30-300x200.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-30-768x512.png 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /></figure>



<h2 class="wp-block-heading" id="h-overview-of-the-yak-project-architecture">Overview of the YaK Project Architecture</h2>



<p>YaK is organized into multiple GitLab repositories, each responsible for a specific part of the system, here the ones we will participate:</p>



<ul class="wp-block-list">
<li><a class="" href="https://gitlab.com/yak4all/yakenv"><code>yakenv</code></a>: Environment container image with all the packages and dependencies</li>



<li><a class="" href="https://gitlab.com/yak4all/yak_core"><code>yak_core</code></a>: Is using yakenv as based image, core logic</li>



<li><a class="" href="https://gitlab.com/yak4all/yak_backend/yak_runner"><code>yak_runner</code></a>: Is using yak_core as based image, backend logic for automation jobs</li>



<li><a class="" href="https://gitlab.com/yak4all/yak_frontend/yak_ui"><code>yak_ui</code></a>: Web-based frontend</li>
</ul>



<p>These components work together to provide a modular, extensible framework for managing your different infrastructures and attached components.</p>



<h2 class="wp-block-heading" id="h-step-1-fork-the-repositories">Step 1: Fork the Repositories</h2>



<p>Before starting development, fork each of the required repositories into your own GitLab account:</p>



<ol class="wp-block-list">
<li>Go to each project page:
<ul class="wp-block-list">
<li><a class="" href="https://gitlab.com/yak4all/yakenv">yakenv</a></li>



<li><a class="" href="https://gitlab.com/yak4all/yak_core">yak_core</a></li>



<li><a class="" href="https://gitlab.com/yak4all/yak_backend/yak_runner">yak_runner</a></li>



<li><a class="" href="https://gitlab.com/yak4all/yak_frontend/yak_ui">yak_ui</a></li>
</ul>
</li>



<li>Click the <strong>Fork</strong> button at the top right of the page.</li>



<li>Choose your namespace (e.g., your GitLab username or organization).</li>



<li>Repeat for all repositories.</li>
</ol>



<h2 class="wp-block-heading" id="h-step-2-set-up-your-local-environment">Step 2: Set Up Your Local Environment</h2>



<p>Clone the forked repositories to your local machine:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
git clone https://gitlab.com/&lt;your-namespace&gt;/yakenv.git
git clone https://gitlab.com/&lt;your-namespace&gt;/yak_core.git
git clone https://gitlab.com/&lt;your-namespace&gt;/yak_backend/yak_runner.git
git clone https://gitlab.com/&lt;your-namespace&gt;/yak_frontend/yak_ui.git
</pre></div>


<p>Then install dependencies (Docker or Podman) and ensure each project builds correctly. Refer to the <code>README.md</code> files for project-specific setup instructions.</p>



<h2 class="wp-block-heading" id="h-step-3-implement-the-new-infrastructure-provider">Step 3: Implement the New Infrastructure Provider</h2>



<p>To add OpenShift Virtualization as a new provider, you will need to make coordinated changes across the different components:</p>



<h3 class="wp-block-heading" id="h-yakenv">yakenv</h3>



<ul class="wp-block-list">
<li><code>Dockerfile</code>: Add to this file the commands to install Ansible collections and/or CLI packages that you will need to interract with your new provider.<br>Here&#8217;s the lines we added for Openshift Virtualization:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Install Kubevirt collection (OpenShift Virtualization)
RUN ansible-galaxy collection install kubevirt.core==2.1.0 --collections-path /etc/ansible/collections --force

# Install virtctl CLI (Kubevirt)
RUN curl -lL https://github.com/kubevirt/kubevirt/releases/download/v1.5.1/virtctl-v1.5.1-linux-amd64 -o /usr/bin/virtctl &amp;amp;&amp;amp; chmod +x /usr/bin/virtctl
</pre></div>


<ul class="wp-block-list">
<li><code>requirements.txt</code>: The python pip packages to install.<br>Here&#8217;s the line we added for Openshift Virtualization:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
kubernetes==22.6.0
</pre></div>


<h3 class="wp-block-heading" id="h-yak-core">yak_core</h3>



<ul class="wp-block-list">
<li><code>collections/ansible_collections/yak/core/roles</code>: This is the directory were you will find all the tasks to manage the infrastructures and the servers storage.<br>In this directory you will find the <code>infrastructures</code> which is a template for a new infrastructures, you can copy it and rename it as the name of your infrastructure (replace white spaces by underscores <code>_</code>) here <code>openshift_virtualization</code></li>



<li><code>collections/ansible_collections/yak/core/roles/openshift_virtualization/defaults/main.yml</code>: Define the variables defaults values:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
state: present
openshift_namespace: default
custom_labels: {}
instance_type: u1.medium
kubeconfig_path: ~/yak/kubeconfig
preference_name: &quot;&quot;

rhel_activation_key: &quot;{{ lookup(&#039;env&#039;,&#039;RHEL_ACTIVATION_KEY&#039;) }}&quot;
rhel_org_id: &quot;{{ lookup(&#039;env&#039;,&#039;RHEL_ORG_ID&#039;) }}&quot;
</pre></div>


<ul class="wp-block-list">
<li><code>collections/ansible_collections/yak/core/roles/openshift_virtualization/tasks</code>: the tasks files for your infrastructure. There is the minimum files:</li>
</ul>



<ol class="wp-block-list">
<li><code>main.yml</code>: the default task file, it will redirect to the tasks depending of the state. Here is the content:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
- include_tasks: check_credential.yml
- include_tasks: &quot;{{ state }}.yml&quot;

</pre></div>


<ol start="2" class="wp-block-list">
<li><code>check_credentials.yml</code>: Step to valid that the provided credentials are valid</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
- block:
  - name: List all VMs - Verifying credentials are valid
    delegate_to: localhost
    kubevirt.core.kubevirt_vm_info:
      namespace: &quot;{{ openshift_namespace }}&quot;
    retries: 3
    delay: 5
  rescue:
  - fail:
      msg: &#039;Please ensure your OpenShift credentials are valid.&#039;

</pre></div>


<ol start="3" class="wp-block-list">
<li><code>present.yml</code>: Steps to create the server&#8217;s VM on your infrastructure. If there is some differences to create a linux or windows server, you can include sub-tasks files (here we developed <code>create_linux.yml</code> and <code>create_windows.yml</code>)</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
# Copyright: (c) 2025, dbi services, distributed without any warranty under the terms of the GNU General Public License v3
- ansible.builtin.include_tasks: 
    file: get_vm_state.yml

- delegate_to: localhost
  set_fact:
    number_of_vms: &quot;{{ r_get_vm_state.resources | length }}&quot;

- block:
  - include_tasks: &quot;create_{{ os_type }}.yml&quot;
  - include_tasks: post_config.yml
  when: number_of_vms | int == 0

- when: number_of_vms | int &gt; 0
  block:
    - fail:
        msg: &quot;Cannot Deploy as the VirtualMachine already exists.&quot;
</pre></div>


<ol start="4" class="wp-block-list">
<li><code>started.yml</code>: Steps to start the server&#8217;s VM</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
- name: Power On
  delegate_to: localhost
  ansible.builtin.shell: &quot;virtctl --kubeconfig {{ openshift_virtualization_kubeconfig }} --namespace {{ openshift_namespace }} start {{ machine_name }}&quot;
  register: r_openshift_virtualization_vm_started

- include_tasks: &quot;post_config.yml&quot;

</pre></div>


<ol start="5" class="wp-block-list">
<li><code>stopped.yml</code>: Steps to power off your server</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
- name: Power Off
  delegate_to: localhost
  ansible.builtin.shell: &quot;virtctl --kubeconfig {{ openshift_virtualization_kubeconfig }} --namespace {{ openshift_namespace }} stop {{ machine_name }}&quot;
  register: r_openshift_virtualization_vm_stopped

</pre></div>


<ol start="6" class="wp-block-list">
<li><code>absent.yml</code>: Steps to destroy the server</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
- name: Delete the VirtualMachine
  delegate_to: localhost
  kubevirt.core.kubevirt_vm:
    namespace: &quot;{{ openshift_namespace }}&quot;
    state: absent
    name: &quot;{{ machine_name }}&quot;
  register: r_openshift_virtualization_vm_absent

</pre></div>


<h3 class="wp-block-heading" id="h-yak-runner">yak_runner</h3>



<ul class="wp-block-list">
<li><code>sql/upgrade/2.2.0/02-infrastructures.sql</code>: Add in the infrastructures jsonb specification schema, the new provider with its specific parameters</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
UPDATE jsonb_specifications
SET schema = 
&#039;{
  &quot;variableName&quot;: &quot;variables&quot;,
  &quot;dataType&quot;: &quot;object&quot;,
  &quot;niceName&quot;: &quot;Variables&quot;,
  &quot;isSelectable&quot;: true,
  &quot;selectorType&quot;: &quot;providerName&quot;,
  &quot;selectorOption&quot;: &#x5B;
    &quot;aws&quot;,
    &quot;azure&quot;,
    &quot;oci&quot;,
    &quot;openshift_virtualization&quot;
  ],
  &quot;aws&quot;: &#x5B;
    ...
  ],
  &quot;azure&quot;: &#x5B;
    ...
  ],
  &quot;oci&quot;: &#x5B;
    ...
  ],
  &quot;openshift_virtualization&quot;: &#x5B;
    {
      &quot;dataType&quot;: &quot;string&quot;,
      &quot;defaultValue&quot;: &quot;default&quot;,
      &quot;isOneOffSetting&quot;: false,
      &quot;maxLength&quot;: 100,
      &quot;mandatory&quot;: true,
      &quot;variableName&quot;: &quot;network_name&quot;,
      &quot;usage&quot;: &quot;Network name to connect&quot;,
      &quot;regex&quot;: null,
      &quot;niceName&quot;: &quot;Network Name&quot;,
      &quot;minLength&quot;: 1
    },
    {
      &quot;dataType&quot;: &quot;string&quot;,
      &quot;defaultValue&quot;: &quot;default&quot;,
      &quot;isOneOffSetting&quot;: false,
      &quot;maxLength&quot;: 100,
      &quot;mandatory&quot;: true,
      &quot;variableName&quot;: &quot;domain_device_interface_name&quot;,
      &quot;usage&quot;: &quot;Domain device interface name&quot;,
      &quot;regex&quot;: null,
      &quot;niceName&quot;: &quot;Domain Device Interface Name&quot;,
      &quot;minLength&quot;: 1
    },
    { &quot;variableName&quot;: &quot;custom_labels&quot;, &quot;niceName&quot;: &quot;Infrastructure labels&quot;, &quot;dataType&quot;: &quot;dictionary&quot;, &quot;mandatory&quot;: false }
  ]
}
&#039;::jsonb
WHERE name = &#039;infrastructureVariables&#039;;
</pre></div>


<ul class="wp-block-list">
<li><code>sql/upgrade/2.2.0/05-server_secret_type_parameters.sql</code>: Add in the according tables the new provider and if needed, new secret type with its parameters:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
insert into providers values
(5,	&#039;openshift_virtualization&#039;, true, &#039;{}&#039;, &#039;OpenShift Virtualization&#039;);

insert into secret_types values
(7,	&#039;kubeconfig&#039;,true,true,false,5);

-- Data: secret_type_parameters
insert into secret_type_parameters (secret_type_id, variable_name, nice_name, data_type_id, mandatory, options, min_length, max_length) values
-- Kubeconfig
(7, &#039;K8S_AUTH_KUBECONFIG&#039;, &#039;OpenShift Kubeconfig&#039;, 1, true, null, 1, 5120);
</pre></div>


<ul class="wp-block-list">
<li><code>sql/upgrade/2.2.0/06-provider_images.sql</code>: Add new images for your new provider and allow admin to manage them:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
insert into provider_images (name, provider_id, operating_system_type_id, ansible_user, variables, user_id) values
-- OpenShift Virtualization linux
(&#039;datasource_centos-stream9&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;centos-stream9&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_centos-stream10&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;centos-stream10&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_fedora&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;fedora&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_rhel8&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;rhel8&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_rhel9&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;rhel9&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_ubuntu24-04&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;ubuntu24-04&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_win2k22&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win2k22&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_win2k25&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win2k25&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_win10&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win10&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),
(&#039;datasource_win11&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win11&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1);

insert into projects_provider_images (project_id, image_id, user_id) 
    select 1, id, 1 from provider_images where provider_id=5;
</pre></div>


<ul class="wp-block-list">
<li><code>sql/upgrade/2.2.0/07-servers.sql</code>: Adding server parameters for the new provider :</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
UPDATE jsonb_specifications
SET schema = 
&#039;{
  &quot;variableName&quot;: &quot;variables&quot;,
  &quot;niceName&quot;: &quot;Variables&quot;,
  &quot;dataType&quot;: &quot;object&quot;,
  &quot;isSelectable&quot;: true,
  &quot;selectorType&quot;: &quot;providerName&quot;,
  &quot;selectorOption&quot;: &#x5B;&quot;aws&quot;, &quot;azure&quot;, &quot;oci&quot;, &quot;openshift_virtualization&quot;, &quot;on_premises&quot;],
  &quot;aws&quot;: &#x5B;
    ...
  ],
  &quot;azure&quot;: &#x5B;
    ...
  ],
  &quot;oci&quot;: &#x5B;
    ...
  ],
   &quot;on_premises&quot;: &#x5B;
    ...
  ],
  &quot;openshift_virtualization&quot;: &#x5B;
    {
      &quot;variableName&quot;: &quot;providerImageId&quot;,
      &quot;niceName&quot;: &quot;Provider Image ID&quot;,
      &quot;dataType&quot;: &quot;integer&quot;,
      &quot;hidden&quot;: true,
      &quot;mandatory&quot;: false,
      &quot;isOneOffSetting&quot;: false
    },
    {
      &quot;dataType&quot;: &quot;string&quot;,
      &quot;defaultValue&quot;: null,
      &quot;isOneOffSetting&quot;: true,
      &quot;maxLength&quot;: 100,
      &quot;mandatory&quot;: true,
      &quot;variableName&quot;: &quot;providerImageName&quot;,
      &quot;usage&quot;: &quot;See documentation&quot;,
      &quot;regex&quot;: null,
      &quot;options&quot;: &quot;values.vProviderImages&quot;,
      &quot;niceName&quot;: &quot;Provider Image Name&quot;,
      &quot;minLength&quot;: 1
    },
    {
      &quot;variableName&quot;: &quot;providerShapeId&quot;,
      &quot;niceName&quot;: &quot;Provider Shape ID&quot;,
      &quot;dataType&quot;: &quot;integer&quot;,
      &quot;hidden&quot;: true,
      &quot;mandatory&quot;: false,
      &quot;isOneOffSetting&quot;: false
    },
    {
      &quot;dataType&quot;: &quot;string&quot;,
      &quot;defaultValue&quot;: null,
      &quot;isOneOffSetting&quot;: true,
      &quot;maxLength&quot;: 100,
      &quot;mandatory&quot;: true,
      &quot;variableName&quot;: &quot;providerShapeName&quot;,
      &quot;usage&quot;: &quot;See documentation&quot;,
      &quot;regex&quot;: null,
      &quot;options&quot;: &quot;values.vProviderShapes&quot;,
      &quot;niceName&quot;: &quot;Provider Shape Name&quot;,
      &quot;minLength&quot;: 1
    },
    { 
      &quot;variableName&quot;: &quot;openshift_namespace&quot;,
      &quot;niceName&quot;: &quot;Namespace&quot;,
      &quot;defaultValue&quot;: &quot;default&quot;,
      &quot;dataType&quot;: &quot;string&quot;,
      &quot;mandatory&quot;: true
    },
    { 
      &quot;variableName&quot;: &quot;preference_name&quot;,
      &quot;niceName&quot;: &quot;Preference Name&quot;,
      &quot;defaultValue&quot;: &quot;&quot;,
      &quot;dataType&quot;: &quot;string&quot;,
      &quot;mandatory&quot;: true
    },
    { &quot;variableName&quot;: &quot;custom_labels&quot;, &quot;niceName&quot;: &quot;Server labels&quot;, &quot;dataType&quot;: &quot;dictionary&quot;, &quot;mandatory&quot;: false }

  ]
}&#039; :: jsonb
WHERE name = &#039;serverVariables&#039;;

</pre></div>


<ul class="wp-block-list">
<li><code>sql/upgrade/2.2.0/11-components-storage-jsonb.sql</code>: Adding component disks parameters for the provider:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
UPDATE jsonb_specifications
SET schema = 
    &#039;{
      &quot;dataType&quot;: &quot;object&quot;,
      &quot;on_premises&quot;: &#x5B;],
      &quot;isSelectable&quot;: true,
      &quot;selectorType&quot;: &quot;providerName&quot;,
      &quot;variableName&quot;: &quot;storageVariables&quot;,
      &quot;selectorOption&quot;: &#x5B;
        &quot;aws&quot;,
        &quot;azure&quot;,
        &quot;oci&quot;,
        &quot;on_premises&quot;,
        &quot;openshift_virtualization&quot;
      ],
      &quot;aws&quot;: &#x5B;
        ...
       ],
      &quot;azure&quot;: &#x5B;
        ...
      ],
      &quot;oci&quot;: &#x5B;
        ...
      ],
      &quot;on_premises&quot;: &#x5B;
       ...
      ],
      &quot;openshift_virtualization&quot;: &#x5B;
        {
          &quot;dataType&quot;: &quot;array&quot;,
          &quot;isSelectable&quot;: true,
          &quot;selectorType&quot;: &quot;osType&quot;,
          &quot;variableName&quot;: &quot;filesystems&quot;,
          &quot;niceName&quot;: &quot;File systems&quot;,
          &quot;selectorOption&quot;: &#x5B;
            &quot;Linux&quot;,
            &quot;Windows&quot;
          ],
          &quot;Linux&quot;: &#x5B;
            {
                &quot;variableName&quot;: &quot;mount_point&quot;,
                &quot;niceName&quot;: &quot;Mount point, e.g. /app&quot;,
                &quot;dataType&quot;: &quot;string&quot;,
                &quot;defaultValue&quot;: null,
                &quot;isOneOffSetting&quot;: true,
                &quot;maxLength&quot;: 100,
                &quot;mandatory&quot;: true,
                &quot;minLength&quot;: 1
            },
            {
                &quot;variableName&quot;: &quot;filesystem_type&quot;,
                &quot;niceName&quot;: &quot;Filesystem type&quot;,
                &quot;dataType&quot;: &quot;string&quot;,
                &quot;mandatory&quot;: true,
                &quot;isOneOffSetting&quot;: false,
                &quot;defaultValue&quot;: &quot;xfs&quot;
            },
            {
                &quot;variableName&quot;: &quot;size_gb&quot;,
                &quot;niceName&quot;: &quot;Mount point size in GB&quot;,
                &quot;dataType&quot;: &quot;integer&quot;,
                &quot;mandatory&quot;: true,
                &quot;isOneOffSetting&quot;: false,
                &quot;defaultValue&quot;: 20
            },
            {
              &quot;dataType&quot;: &quot;integer&quot;,
              &quot;isOneOffSetting&quot;: true,
              &quot;mandatory&quot;: true,
              &quot;variableName&quot;: &quot;max_size_gb&quot;,
              &quot;niceName&quot;: &quot;Disk size&quot;,
              &quot;min&quot;: 1,
              &quot;defaultValue&quot;: -1,
              &quot;usage&quot;: &quot;Defines the size of the virtual disk at cloud provider end. 5% overhead is automatically added to each disk for metadata storage.&quot;
            },
            {
              &quot;dataType&quot;: &quot;string&quot;,
              &quot;niceName&quot;: &quot;Storage Class Name&quot;,
              &quot;mandatory&quot;: false,
              &quot;maxLength&quot;: 100,
              &quot;minLength&quot;: 0,
              &quot;defaultValue&quot;: &quot;&quot;,
              &quot;variableName&quot;: &quot;volume_storageClassName&quot;,
              &quot;isOneOffSetting&quot;: true
            }
          ],
          &quot;Windows&quot;: &#x5B;
            {
                &quot;variableName&quot;: &quot;drive_letter&quot;,
                &quot;niceName&quot;: &quot;Drive letter, e.g. F&quot;,
                &quot;dataType&quot;: &quot;string&quot;,
                &quot;defaultValue&quot;: null,
                &quot;isOneOffSetting&quot;: true,
                &quot;maxLength&quot;: 100,
                &quot;mandatory&quot;: true,
                &quot;minLength&quot;: 1
            },
            {
                &quot;variableName&quot;: &quot;partition_label&quot;,
                &quot;niceName&quot;: &quot;Partition label&quot;,
                &quot;dataType&quot;: &quot;string&quot;,
                &quot;mandatory&quot;: true,
                &quot;isOneOffSetting&quot;: false,
                &quot;defaultValue&quot;: &quot;data&quot;
            },
            {
                &quot;variableName&quot;: &quot;size_gb&quot;,
                &quot;niceName&quot;: &quot;Mount point size in GB&quot;,
                &quot;dataType&quot;: &quot;integer&quot;,
                &quot;mandatory&quot;: true,
                &quot;isOneOffSetting&quot;: false,
                &quot;defaultValue&quot;: 20
            },
            {
              &quot;dataType&quot;: &quot;string&quot;,
              &quot;niceName&quot;: &quot;Storage Class Name&quot;,
              &quot;mandatory&quot;: false,
              &quot;maxLength&quot;: 100,
              &quot;minLength&quot;: 0,
              &quot;defaultValue&quot;: &quot;&quot;,
              &quot;variableName&quot;: &quot;volume_storageClassName&quot;,
              &quot;isOneOffSetting&quot;: true
            }
          ]
        }
      ]
    }&#039; :: jsonb
  WHERE name = &#039;componentStorageVariables&#039;;

</pre></div>


<ul class="wp-block-list">
<li><code>sql/upgrade/2.2.0/12-provider_disks_parameters_root_jsonb.sql</code>: Adding server disks parameters for the provider:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
UPDATE jsonb_specifications
SET schema = 
    &#039;{
      &quot;dataType&quot;: &quot;object&quot;,
      &quot;on_premises&quot;: &#x5B;],
      &quot;isSelectable&quot;: true,
      &quot;selectorType&quot;: &quot;providerName&quot;,
      &quot;variableName&quot;: &quot;storageVariables&quot;,
      &quot;selectorOption&quot;: &#x5B;
        &quot;aws&quot;,
        &quot;azure&quot;,
        &quot;oci&quot;,
        &quot;on_premises&quot;,
        &quot;openshift_virtualization&quot;
      ],
      &quot;aws&quot;: &#x5B;
        ...
       ],
      &quot;azure&quot;: &#x5B;
        ...
      ],
      &quot;oci&quot;: &#x5B;
        ...
      ],
      &quot;on_premises&quot;: &#x5B;
       ...
      ],
      
  &quot;openshift_virtualization&quot;: &#x5B;
    {
      &quot;Linux&quot;: &#x5B;
        {
          &quot;dataType&quot;: &quot;integer&quot;,
          &quot;niceName&quot;: &quot;Size in GB&quot;,
          &quot;mandatory&quot;: true,
          &quot;defaultValue&quot;: 30,
          &quot;variableName&quot;: &quot;volume_size&quot;,
          &quot;isOneOffSetting&quot;: true
        },
        {
          &quot;dataType&quot;: &quot;string&quot;,
          &quot;niceName&quot;: &quot;Storage Class Name&quot;,
          &quot;mandatory&quot;: false,
          &quot;maxLength&quot;: 100,
          &quot;minLength&quot;: 0,
          &quot;defaultValue&quot;: &quot;&quot;,
          &quot;variableName&quot;: &quot;volume_storageClassName&quot;,
          &quot;isOneOffSetting&quot;: true
        },
        {
          &quot;options&quot;: &#x5B;
            &quot;Block&quot;,
            &quot;Filesystem&quot;
          ],
          &quot;dataType&quot;: &quot;string&quot;,
          &quot;niceName&quot;: &quot;Disk type&quot;,
          &quot;mandatory&quot;: true,
          &quot;maxLength&quot;: 100,
          &quot;minLength&quot;: 1,
          &quot;defaultValue&quot;: &quot;Filesystem&quot;,
          &quot;variableName&quot;: &quot;volume_mode&quot;,
          &quot;isOneOffSetting&quot;: true
        }
      ],
      &quot;Windows&quot;: &#x5B;
        {
          &quot;dataType&quot;: &quot;integer&quot;,
          &quot;niceName&quot;: &quot;Size in GB&quot;,
          &quot;mandatory&quot;: true,
          &quot;defaultValue&quot;: 30,
          &quot;variableName&quot;: &quot;volume_size&quot;,
          &quot;isOneOffSetting&quot;: true
        },
        {
          &quot;dataType&quot;: &quot;string&quot;,
          &quot;niceName&quot;: &quot;Storage Class Name&quot;,
          &quot;mandatory&quot;: false,
          &quot;maxLength&quot;: 100,
          &quot;minLength&quot;: 0,
          &quot;defaultValue&quot;: &quot;&quot;,
          &quot;variableName&quot;: &quot;volume_storageClassName&quot;,
          &quot;isOneOffSetting&quot;: true
        },
        {
          &quot;options&quot;: &#x5B;
            &quot;Block&quot;,
            &quot;Filesystem&quot;
          ],
          &quot;dataType&quot;: &quot;string&quot;,
          &quot;niceName&quot;: &quot;Disk type&quot;,
          &quot;mandatory&quot;: true,
          &quot;maxLength&quot;: 100,
          &quot;minLength&quot;: 1,
          &quot;defaultValue&quot;: &quot;Filesystem&quot;,
          &quot;variableName&quot;: &quot;volume_mode&quot;,
          &quot;isOneOffSetting&quot;: true
        }
      ],
      &quot;dataType&quot;: &quot;object&quot;,
      &quot;isSelectable&quot;: true,
      &quot;selectorType&quot;: &quot;providerImageOsType&quot;,
      &quot;variableName&quot;: &quot;openshift_virtualization_root_disk_parameters&quot;,
      &quot;selectorOption&quot;: &#x5B;
        &quot;Linux&quot;,
        &quot;Windows&quot;
      ]
    },
    {
      &quot;variableName&quot;: &quot;providerImageOsType&quot;,
      &quot;niceName&quot;: &quot;Operating System&quot;,
      &quot;dataType&quot;: &quot;string&quot;,
      &quot;mandatory&quot;: true,
      &quot;isOneOffSetting&quot;: true,
      &quot;options&quot;: &#x5B;&quot;Linux&quot;, &quot;Windows&quot;],
      &quot;readonly&quot;: true
    }
  ]
    }&#039; :: jsonb
  WHERE name = &#039;componentStorageVariables&#039;;

</pre></div>


<ul class="wp-block-list">
<li><code>sql/upgrade/2.2.0/13-provider-shapes.sql</code>: Adding shapes for the provider:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
insert into provider_shapes (name, provider_id, variables, user_id) values
(&#039;openshift-virtualization-u1_medium-shape&#039;,   5, &#039;{&quot;instance_type&quot;: &quot;u1.medium&quot;}&#039;, 1),
(&#039;openshift-virtualization-u1_large-shape&#039;,   5, &#039;{&quot;instance_type&quot;: &quot;u1.large&quot;}&#039;, 1),
(&#039;openshift-virtualization-u1_xlarge-shape&#039;,   5, &#039;{&quot;instance_type&quot;: &quot;u1.xlarge&quot;}&#039;, 1);

insert into projects_provider_shapes (project_id, shape_id, user_id) 
    select 1, id, 1 from provider_shapes where provider_id=5;

</pre></div>


<h3 class="wp-block-heading" id="h-yak-ui">yak_ui</h3>



<ul class="wp-block-list">
<li><code>yak-ui/src/assets/providers/virt-icon.png</code>: Adding the new provider logo in provider logos:</li>



<li><code>yak-ui/src/utils/imageList.ts</code>: Adding the new logo path in the <code>ProviderLogos</code> dict:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
import OnPremiseLogo from &quot;@/assets/providers/2860404-200-min.png&quot;;
import LinuxLogo from &quot;@/assets/linux.png&quot;;
import WindowsLogo from &quot;@/assets/windows.png&quot;;
import OpenShiftVirtualizationLogo from &quot;@/assets/providers/virt-icon.png&quot;;

export const ProviderLogos: HashTable&lt;any&gt; = {
  aws: AwsLogo,
  oci: OciLogo,
  &#039;on_premises&#039;: OnPremiseLogo,
  azure: AzureLogo,
  &#039;openshift_virtualization&#039;: OpenShiftVirtualizationLogo,
};

...
</pre></div>


<ul class="wp-block-list">
<li><code>yak-ui/src/components/YakTabContainer.vue</code>: Adding in <code>containerClass.specialTabs</code> and <code>cardClass.specialTabs</code> lists the new provider :</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
...
const containerClass = computed(() =&gt; {
  const specialTabs = &#x5B;&quot;aws&quot;, &quot;oci&quot;, &quot;azure&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;];
  return specialTabs.includes(tab.value)
    ? &quot;container-grid-custom&quot;
    : &quot;container-custom&quot;;
});

const cardClass = computed(() =&gt; {
  const specialTabs = &#x5B;&quot;aws&quot;, &quot;oci&quot;, &quot;azure&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;];
  return specialTabs.includes(tab.value) ? &quot;card-grid-custom&quot; : &quot;card-custom&quot;;
});
...
</pre></div>


<ul class="wp-block-list">
<li><code>yak-ui/src/components/customs/StorageEditor.vue</code>: Adding in <code><code>providerTypeField</code>.<code>options</code></code> list the new provider :</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
...
const providerTypeField: Field = {
  variableName: &quot;providerName&quot;,
  niceName: &quot;providerName&quot;,
  dataType: &quot;string&quot;,
  mandatory: true,
  isOneOffSetting: true,
  options: &#x5B;&quot;aws&quot;, &quot;azure&quot;, &quot;oci&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;],
};
...
</pre></div>


<ul class="wp-block-list">
<li><code>yak-ui/src/data_structures/vComponents.ts</code>: Adding in <code>children.options</code> list parameter for <code><code><code><code>allGroups.push</code></code></code></code> call the new provider :</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
...
                    allGroups.push({
                      variableName: group.name,
                      niceName: &quot;group &quot; + group.name,
                      mandatory: true,
                      dataType: &quot;object&quot;,
                      isOneOffSetting: false,
                      children: &#x5B;{
                        variableName: &quot;providerName&quot;,
                        niceName: &quot;Provider&quot;,
                        dataType: &quot;string&quot;,
                        mandatory: true,
                        isOneOffSetting: true,
                        options: &#x5B;&quot;aws&quot;, &quot;azure&quot;, &quot;oci&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;],
...
</pre></div>


<ul class="wp-block-list">
<li><code>yak-ui/src/data_structures/vSecrets.ts</code>: Adding in <code><code>vSecretTypeName</code></code> list the new secret type :</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
...
              vSecretTypeName: &#x5B;
                &quot;aws credentials&quot;,
                &quot;azure credentials&quot;,
                &quot;oci credentials&quot;,
                &quot;kubeconfig&quot;,
                &quot;ssh key&quot;,
                &quot;winrm&quot;,
              ],
...
</pre></div>


<h2 class="wp-block-heading" id="h-step-4-test-your-changes">Step 4: Test Your Changes</h2>



<p>Each component has its own set of unit and integration tests. Be sure to:</p>



<ul class="wp-block-list">
<li>Run tests locally with each change.<br>All sub-projects of the YaK have a Dockerfile on root directory. Build them in this order to respect the dependencies:
<ol class="wp-block-list">
<li>yakenv</li>



<li>yak_core</li>



<li>yak_runner</li>



<li>yak_postgres</li>



<li>yak_graphile</li>



<li>yak_ui</li>
</ol>
</li>
</ul>



<p>Once images are built, run them on Docker/Podman on your computer, or on a Container orchestrator (Kubernetes/Openshift/&#8230;)</p>



<ul class="wp-block-list">
<li>Validate that your provider appears correctly in the UI and can be selected.</li>
</ul>



<p>New infrastructure declaration:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="547" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-8-1024x547.png" alt="" class="wp-image-39113" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-8-1024x547.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-8-300x160.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-8-768x410.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-8.png 1377w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>New infrastructure declared:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="403" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-9-1024x403.png" alt="" class="wp-image-39114" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-9-1024x403.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-9-300x118.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-9-768x302.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-9.png 1379w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>New secret declaration:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="733" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-10-1024x733.png" alt="" class="wp-image-39115" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-10-1024x733.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-10-300x215.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-10-768x550.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-10.png 1377w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Provider images appeared well:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="740" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-11-1024x740.png" alt="" class="wp-image-39116" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-11-1024x740.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-11-300x217.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-11-768x555.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-11.png 1360w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Provider shapes appeared well:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="548" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-12-1024x548.png" alt="" class="wp-image-39117" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-12-1024x548.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-12-300x161.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-12-768x411.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-12.png 1378w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>New server declaration:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="958" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-13-1024x958.png" alt="" class="wp-image-39118" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-13-1024x958.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-13-300x281.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-13-768x718.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-13.png 1376w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="517" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-14-1024x517.png" alt="" class="wp-image-39119" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-14-1024x517.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-14-300x151.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-14-768x388.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-14.png 1379w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="325" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-15-1024x325.png" alt="" class="wp-image-39120" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-15-1024x325.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-15-300x95.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-15-768x244.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-15.png 1378w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Test full cluster lifecycle operations (deploy, stop, start, destroy, delete) for OpenShift Virtualization.</li>
</ul>



<p>Deploy server:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="293" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-16-1024x293.png" alt="" class="wp-image-39121" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-16-1024x293.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-16-300x86.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-16-768x219.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-16.png 1379w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="303" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-18-1024x303.png" alt="" class="wp-image-39123" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-18-1024x303.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-18-300x89.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-18-768x227.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-18.png 1378w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="627" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-19-1024x627.png" alt="" class="wp-image-39124" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-19-1024x627.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-19-300x184.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-19-768x470.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-19.png 1361w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="306" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-1024x306.png" alt="" class="wp-image-39125" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-1024x306.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-300x90.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-768x230.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20.png 1377w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Result in Openshift:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="625" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-27-1024x625.png" alt="" class="wp-image-39132" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-27-1024x625.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-27-300x183.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-27-768x469.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-27-1536x938.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-27.png 1553w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Stop server:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="614" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-21-1024x614.png" alt="" class="wp-image-39126" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-21-1024x614.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-21-300x180.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-21-768x460.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-21.png 1380w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="312" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-22-1024x312.png" alt="" class="wp-image-39127" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-22-1024x312.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-22-300x91.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-22-768x234.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-22.png 1378w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Start server:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="616" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-24-1024x616.png" alt="" class="wp-image-39129" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-24-1024x616.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-24-300x181.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-24-768x462.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-24.png 1379w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="306" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-1024x306.png" alt="" class="wp-image-39125" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-1024x306.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-300x90.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20-768x230.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-20.png 1377w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Destroy server:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="618" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-25-1024x618.png" alt="" class="wp-image-39130" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-25-1024x618.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-25-300x181.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-25-768x463.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-25.png 1379w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="302" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-26-1024x302.png" alt="" class="wp-image-39131" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-26-1024x302.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-26-300x88.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-26-768x226.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-26.png 1377w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading" id="h-step-5-contribute-your-changes">Step 5: Contribute Your Changes</h2>



<p>Once development is complete and tested:</p>



<ol class="wp-block-list">
<li>Push your changes to your fork.</li>



<li>Create a Merge Request (MR) from your fork to the main project repository for each affected sub-project:</li>



<li>In your MR description, include:
<ul class="wp-block-list">
<li>A summary of the changes</li>



<li>A test plan and screenshots if applicable</li>



<li>Any known limitations or issues</li>
</ul>
</li>
</ol>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="790" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-29-1024x790.png" alt="" class="wp-image-39134" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-29-1024x790.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-29-300x231.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-29-768x593.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/06/image-29.png 1248w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Follow the <a href="https://gitlab.com/yak4all/yak_core/-/blob/main/docs/contribution.md?ref_type=heads">contribution guidelines of the YaK project</a> for naming conventions, commit messages, and code standards.</p>



<p>You can take my merge requests as an exemple:</p>



<ul class="wp-block-list">
<li>yakenv: <a href="https://gitlab.com/yak4all/yakenv/-/merge_requests/12" target="_blank" rel="noreferrer noopener">https://gitlab.com/yak4all/yakenv/-/merge_requests/12</a></li>



<li>yak_core: <a href="https://gitlab.com/yak4all/yak_core/-/merge_requests/20" target="_blank" rel="noreferrer noopener">https://gitlab.com/yak4all/yak_core/-/merge_requests/20</a></li>



<li>yak_runner: <a href="http://gitlab.com/yak4all/yak_backend/yak_runner/-/merge_requests/42" target="_blank" rel="noreferrer noopener">http://gitlab.com/yak4all/yak_backend/yak_runner/-/merge_requests/42</a></li>



<li>yak_ui: <a href="https://gitlab.com/yak4all/yak_frontend/yak_ui/-/merge_requests/42" target="_blank" rel="noreferrer noopener">https://gitlab.com/yak4all/yak_frontend/yak_ui/-/merge_requests/42</a></li>
</ul>



<h2 class="wp-block-heading" id="h-step-6-collaborate-with-the-community">Step 6: Collaborate with the Community</h2>



<p>After submitting your MR:</p>



<ul class="wp-block-list">
<li>Respond to any feedback or questions from project maintainers.</li>



<li>Be open to revising your code based on review suggestions.</li>



<li>Once approved, your changes will be merged into the main project!</li>
</ul>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p>Adding a new infrastructure provider to YaK, such as OpenShift Virtualization, is a powerful way to contribute to the project and support broader use cases. With a clear architecture and modular codebase, YaK makes it straightforward for developers to extend its capabilities.</p>



<p>YaK can also be integrated with various Red Hat products to enhance your automation workflows &#8211; check out our guide on <a href="https://www.dbi-services.com/blog/integrate-yak-into-red-hat-ansible-automation-platform/">Integrating YaK into Red Hat Ansible Automation Platform</a> to learn more.</p>
<p>L’article <a href="https://www.dbi-services.com/blog/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization/">How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>YaK Core – The Holy Grail for Deploying Ansible Code Everywhere</title>
		<link>https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/</link>
					<comments>https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/#respond</comments>
		
		<dc:creator><![CDATA[Hervé Schweitzer]]></dc:creator>
		<pubDate>Tue, 29 Apr 2025 13:52:46 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Database management]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[OCI]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=38158</guid>

					<description><![CDATA[<p>YaK core Multi-Platform open source Automation Tool simplifies the deployment of Ansible playbooks through a clean UI and API. It offers an intuitive interface where users can upload playbooks, configure parameters, and deploy them seamlessly across various platforms, and all managed through a centralized inventory stored in a PostgreSQL database. With YaK Core, developers can [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/">YaK Core – The Holy Grail for Deploying Ansible Code Everywhere</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="510" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-1024x510.png" alt="" class="wp-image-38228" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-1024x510.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-300x149.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1-768x383.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/yak-core-open-source-multi-platform-1.png 1134w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="has-medium-font-size"><strong>YaK core Multi-Platform open source Automation Tool </strong>simplifies the deployment of Ansible playbooks through a clean UI and API. It offers an intuitive interface where users can upload playbooks, configure parameters, and deploy them seamlessly across various platforms, and all managed through a centralized inventory stored in a PostgreSQL database. With YaK Core, developers can focus on writing application code without worrying about infrastructure setup or management.</p>



<p class="has-medium-font-size"><strong>YaK</strong> consists of two parts: <strong>YaK Core</strong>, which is open source, and <strong>YaK Components</strong>, which can be installed on top. These <strong>YaK Components </strong>are platform-agnostic service packages (e.g., PostgreSQL, Oracle DB, MongoDB, Kubernetes, etc.), written in Ansible by experts. They provide essential operational features such as backup, patching, upgrades, and high availability. If you&#8217;d like to learn more about the available YaK components, feel free to <a href="https://yak4all.io/contact">contact us!</a></p>



<p class="has-medium-font-size">But that’s not all. <strong>YaK Core </strong>also lets you create your own <strong>YaK Components</strong> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" />. Once created, your component becomes immediately available for deployment across all platforms supported by YaK Core.</p>



<p class="has-medium-font-size">In this blog, I’ll show you how easy it is to create your own <strong>YaK Component</strong> using Ansible, upload it to <strong>YaK Core</strong>, and deploy it across any supported platform.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-yak-demo-platform-provisioning">YaK Demo platform provisioning</h2>



<p>To get started with YaK Core Multi-Platform open source solution, visit <a class="" href="https://yak4all.io">https://</a><a href="https://yak4all.io" target="_blank" rel="noreferrer noopener">yak4all</a><a class="" href="https://yak4all.io">.io</a> and provision your own YaK demo environment (take 5 minutes to be ready).</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-yak wp-block-embed-yak"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="iT6gmuzgX5"><a href="https://yak4all.io/demo/">Demo</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;Demo&#8221; &#8212; YaK" src="https://yak4all.io/demo/embed/#?secret=rhIPnL8eSE#?secret=iT6gmuzgX5" data-secret="iT6gmuzgX5" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-build-your-yak-component">Build your YaK Component</h2>



<p class="has-medium-font-size">To build a YaK Component, you need to declare at least the following three files </p>



<p class="has-text-align-left"><strong>     1. playbooks/create_linux_users.yml<br>     2. manifest.yml<br>     3. yak_variables_specifications/basic_variables_specifications.yml</strong></p>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-c7ffa4e866b5c2f8365c6699e09153cd" id="h-1-the-ansible-playbook" style="color:#006fb5">1. The Ansible Playbook </h3>



<p class="has-medium-font-size"><strong>playbooks/create_linux_users.yml</strong><br>This file is simply your Ansible playbook, nothing more. The only requirement is that the code uses variables, which will be exposed in the UI for configuration. The example playbook below will create a user and optionally grant them sudo privileges.</p>



<pre class="wp-block-code"><code>---
- name: Create Linux users
  hosts: linux_hosts
  become: true
  gather_facts: true

  tasks:
    - debug:
        var: user

    - name: Create users
      ansible.builtin.user:
        name: "{{ item.username }}"
        create_home: "{{ item.create_home | default(true) }}"
        state: present
      loop: "{{ user }}"

    - name: Add users to sudoers
      community.general.sudoers:
        name: "yak-sudoer-{{ item.username }}"
        user: "{{ item.username }}"
        commands: ALL
        state: present
      loop: "{{ user }}"
      when: item.is_sudoer
        
  post_tasks:
    - name: Update component state
      delegate_to: localhost
      yak.core.yak_component_state_update:
        component_state_name: 'deployed'
...</code></pre>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-9766ac0c91f53fa89ea1455a27f3848d" id="h-2-manifest-file" style="color:#006fb5">2. Manifest file</h3>



<p class="has-medium-font-size"><strong>manifest.yml</strong><br>This file contains the basic information about your component and specifies which playbooks can be executed.</p>



<pre class="wp-block-code"><code>name: linux_users

version:
  major: 1
  minor: 0
  patch: 0

sub_component_types:
  - display_label: Linux users
    name: create_linux_users
    features:
      - display_label: Create Linux users
        name: create_linux_users
        playbook_name: playbooks/create_linux_users.yml

    inventory_maps:
      - group_name: linux_hosts
        group_nicename: Linux hosts
        group_description: Host on which the users will be created
        group_min_hosts: 1
        group_max_hosts: 100
        type: host
        os_type: Linux</code></pre>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-4433a9419864971a558f59cbb6ad037e" id="h-3-variable-specification-file" style="color:#006fb5">3. Variable specification file</h3>



<p class="has-medium-font-size"><strong>yak_variables_specifications/basic_variables_specifications.yml</strong><br>Now you can define and provide all the specifications for the variables you want to make configurable, with all the required settings <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>



<pre class="wp-block-code"><code>- variableName: user
  niceName: Users to create
  dataType: array
  children:
    - variableName: username
      niceName: Username
      dataType: string
      mandatory: true
      defaultValue: yak
      isOneOffSetting: false
      usage: Name of the user to create

    - variableName: create_home
      niceName: Create Home directory
      dataType: boolean
      mandatory: true
      defaultValue: true
      isOneOffSetting: false
      usage: Tick the box if you want to create a Home directory for the user (/home/&lt;username&gt;)

    - variableName: is_sudoer
      niceName: Grant sudo privileges
      dataType: boolean
      mandatory: true
      defaultValue: true
      isOneOffSetting: false
      usage: Tick the box if you want to grant "ALL" privileges escalation to the user</code></pre>



<p class="has-medium-font-size">That&#8217;s it! You now have all the necessary files for your first YaK Component. Next, create a ZIP package and upload it to your deployed YaK Demo environment.</p>



<p class="has-medium-font-size">To make things easier, I&#8217;ve created a ZIP file that you can upload directly. : <a href="https://www.swisstransfer.com/d/6db7e854-c74a-4616-be89-bc4375059161">create_linux_user.zip</a> </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1016" height="566" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48.png" alt="" class="wp-image-38208" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48.png 1016w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48-300x167.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.10.48-768x428.png 768w" sizes="auto, (max-width: 1016px) 100vw, 1016px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-setup-a-server">Setup a Server</h2>



<p class="has-medium-font-size">For this task, simply follow the documentation below up to Step 4: <em>Deploy your server</em> <a href="https://dbi-services.gitbook.io/yak-user-doc/introduction/yak-demo">https://dbi-services.gitbook.io/yak-user-doc/introduction/yak-demo</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-declare-and-deploy-your-component">Declare and deploy your Component </h2>



<p class="has-medium-font-size">You’re now ready to declare and deploy your component!</p>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-aec523cc5c9123a8748ed34598dfbbd4" id="h-1-declare" style="color:#006fb5">1. Declare </h3>



<p class="has-medium-font-size"><strong>YaK UI -&gt; Components -&gt; Declare -&gt; Component_type : linux_users -&gt; Save</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="994" height="872" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47.png" alt="" class="wp-image-38209" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47.png 994w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47-300x263.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.21.47-768x674.png 768w" sizes="auto, (max-width: 994px) 100vw, 994px" /></figure>



<h3 class="wp-block-heading has-text-color has-link-color wp-elements-a421b9f745833b9dda3d46b9d7e21629" id="h-2-deploy" style="color:#006fb5">2 Deploy </h3>



<p class="has-medium-font-size"><strong>YaK UI -&gt; Components -&gt; Select LinuxUser -&gt; Action -&gt; Create Linux User -&gt; Confirm</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="990" height="326" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48.png" alt="" class="wp-image-38212" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48.png 990w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48-300x99.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/Screenshot-2025-04-28-at-15.23.48-768x253.png 768w" sizes="auto, (max-width: 990px) 100vw, 990px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading has-text-align-center" id="h-conclusion">Conclusion</h2>



<p class="has-medium-font-size">This component can now be deployed on any cloud platform or integrated on On-Premises environment using the YaK UI, and can also be deployed in parallel on up to 100 servers, as specified in your Manifest file.</p>



<p class="has-medium-font-size">With this solution, you can provide your colleagues with an intuitive and efficient way to work with Ansible playbooks, enhancing their overall experience <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>



<p class="has-medium-font-size">For more Information about YaK see the blogs available here : <a href="https://www.dbi-services.com/blog/yak">https://www.dbi-services.com/blog/yak</a></p>



<p></p>
<p>L’article <a href="https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/">YaK Core – The Holy Grail for Deploying Ansible Code Everywhere</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/yak-core-the-holy-grail-for-deploying-ansible-code-everywhere/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Integrate YaK into Red Hat Ansible Automation Platform</title>
		<link>https://www.dbi-services.com/blog/integrate-yak-into-red-hat-ansible-automation-platform/</link>
					<comments>https://www.dbi-services.com/blog/integrate-yak-into-red-hat-ansible-automation-platform/#respond</comments>
		
		<dc:creator><![CDATA[Donovan Winter]]></dc:creator>
		<pubDate>Tue, 22 Apr 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[YaK]]></category>
		<category><![CDATA[Ansible]]></category>
		<category><![CDATA[Ansible Automation Platform]]></category>
		<category><![CDATA[awx]]></category>
		<category><![CDATA[Red Hat]]></category>
		<category><![CDATA[Red Hat Ansible Automation Platform]]></category>
		<category><![CDATA[yak]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=37959</guid>

					<description><![CDATA[<p>Introduction to YaK YaK is an open-source automation project developed by dbi services. Built on Ansible playbooks, YaK streamlines the deployment process for various components across any platform. It ensures adherence to best practices, maintains deployment quality, and significantly reduces time-to-deploy. Initially created in response to the growing demand from dbi services&#8217; consultants and clients, [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/integrate-yak-into-red-hat-ansible-automation-platform/">Integrate YaK into Red Hat Ansible Automation Platform</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="974" height="401" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-33.png" alt="" class="wp-image-38046" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-33.png 974w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-33-300x124.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-33-768x316.png 768w" sizes="auto, (max-width: 974px) 100vw, 974px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-introduction-to-yak">Introduction to YaK</h2>



<p>YaK is an open-source automation project developed by dbi services. Built on Ansible playbooks, YaK streamlines the deployment process for various components across any platform. It ensures adherence to best practices, maintains deployment quality, and significantly reduces time-to-deploy.</p>



<p>Initially created in response to the growing demand from dbi services&#8217; consultants and clients, YaK simplifies and accelerates deployments across multi-technology infrastructures. Whether targeting cloud environments or on-premises systems, YaK drastically cuts down deployment effort, optimizing the overall time-to-market.</p>



<p>Find more informations on the <a href="https://yak4all.io/" target="_blank" rel="noreferrer noopener">YaK website</a></p>



<h2 class="wp-block-heading">Why Integrate YaK into Red Hat Ansible Automation Platform (AAP)?</h2>



<h3 class="wp-block-heading">YaK Advantages:</h3>



<ul class="wp-block-list">
<li><strong>User-Friendly Interface</strong>: YaK simplifies configuration and deployment through an intuitive user interface, allowing teams to quickly manage servers and applications deployments.</li>



<li><strong>Centralized Metadata Database</strong>: It replaces traditional YAML configuration files with a centralized database to store deployment metadata, ensuring improved manageability and consistency.</li>



<li><strong>Comprehensive Reporting</strong>: YaK provides capabilities for generating detailed reports on all deployments, offering insights for continuous improvement.</li>



<li><strong>dbi services components</strong>: dbi services offering a range of subscriptions components readily deployable on any platform, further easing the accessibility, management of deployments. These components integrates all the expertise of dbi services&#8217; expertise.</li>



<li><strong>Custom Application Integration</strong>: YaK supports creating custom components for your specific applications. Developers can easily add Ansible playbooks to deploy the application into the component template.</li>
</ul>



<h3 class="wp-block-heading" id="h-why-red-hat-ansible-automation-platform-aap-with-yak">Why Red Hat Ansible Automation Platform (AAP) with YaK:</h3>



<ul class="wp-block-list">
<li><strong>Expert-Crafted Packages</strong>: YaK provides expertly maintained Ansible packages, ensuring reliability and built-in support for a wide range of scenarios, fully compatible with AAP.</li>



<li><strong>Unified Dynamic Inventory</strong>: A single dynamic Ansible inventory for all your infrastructures, supporting multi-platform environments.</li>



<li><strong>Platform-Agnostic Deployments</strong>: Seamless deployment across various platforms, enabling true platform independence.</li>



<li><strong>Deep Integration with AAP Features</strong>: Full integration with AAP’s scheduler, workflows, and other advanced features, simplifying automation of servers, components&nbsp;(databases, applications, etc..), and complex multi-component infrastructures. of servers/component and/or multi-component infrastructure automation.</li>
</ul>



<h2 class="wp-block-heading">Integration Steps</h2>



<h3 class="wp-block-heading">Generate a YaK API Token</h3>



<p>To start integration, generate an API token from the YaK database pod. So you need:</p>



<ol class="wp-block-list">
<li>To have access to the Kubernetes cluster (rke2 for exemple) on which is deployed your YaK instance, with the kubectl command</li>



<li>Know the namespace on which is deployed your YaK instance</li>
</ol>



<p>Once you have access, you only have to type this command (replace &lt;yak-namespace&gt; by the namespace on which is deployed your YaK instance) :</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
$ kubectl -n &lt;yak-namespace&gt; exec -it deploy/yak-postgres -- psql -U postgres -d agoston -c &#039;select set_user_token(agoston_api.add_user()) as &quot;token&quot;;&#039;
                               token                               
-------------------------------------------------------------------
 &lt;generated_token&gt;
(1 row)
</pre></div>


<p>You can store the YaK API generated token for next steps.</p>



<h3 class="wp-block-heading">AAP Resources Configuration</h3>



<p>Access to Ansible Automation Platform with an administrator rôle.</p>



<ul class="wp-block-list">
<li><strong>Execution Environment</strong>: Define a customized execution environment in AAP that includes YaK-specific dependencies and tools.<br>In the left menu, go to Automation Execution ⟶ Infrastructure ⟶ Execution Environments, then click on <code>Create execution environment</code> button<br>Fill the form like this:<br>&#8211; <strong>Name</strong>: YaK EE<br>&#8211; <strong>Image</strong>: registry.gitlab.com/yak4all/yak_core:ee-stable<br>&#8211; <strong>Pull</strong>: Only pull the image if not present before running<br>&#8211; <strong>Registry credential</strong>: &lt;empty&gt; (YaK images are publicly available on GitLab repository)<br>&#8211; <strong>Description</strong>: Execution environment for YaK related jobs<br>&#8211; <strong>Organization</strong>: Default (or any other if you have a specific policy)</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-8-1024x494.png" alt="" class="wp-image-38016" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-8-1024x494.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-8-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-8-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-8-1536x741.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-8.png 1919w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Job Settings</strong>: Update parameters to add persistency for YaK jobs.<br>In the left menu, go to Settings ⟶ Job then click on <code>Edit</code> button<br>update the parameter <code>Paths to expose to isolated jobs</code>, and add these lines at the end:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
- /data/yak/component_types:/workspace/yak/component_types
- /data/yak/tmp:/tmp
- /data/yak/uploads:/uploads
</pre></div>

<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-24-1024x494.png" alt="" class="wp-image-38036" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-24-1024x494.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-24-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-24-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-24-1536x742.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-24.png 1918w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Credential Types</strong>: Create customs credential types to securely handle YaK specific credentials.<br>In the left menu, go to Automation Execution ⟶ Infrastructure ⟶ Credential Types, then click on <code>Create credential type</code> button</li>
</ul>



<ol class="wp-block-list">
<li>YaK API:<br>&#8211; <strong>Name</strong>: YaK API<br>&#8211; <strong>Input configuration</strong>:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
fields:
  - id: yak_ansible_transport_url
    type: string
    label: YaK API URL
  - id: yak_ansible_http_token
    type: string
    label: YaK API HTTP Token
    secret: true
  - id: yak_ansible_ssl_verify_certificate
    type: string
    label: Verify SSL certificate
    choices:
      - &#039;true&#039;
      - &#039;false&#039;
required:
  - yak_ansible_transport_url
  - yak_ansible_http_token
  - yak_ansible_ssl_verify_certificate
</pre></div>


<p>⠀⠀⠀⠀‎‎‎‎- <strong>Injector configuration</strong>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
env:
  YAK_ANSIBLE_DEBUG: &#039;false&#039;
  YAK_ANSIBLE_HTTP_TOKEN: &#039;{{ yak_ansible_http_token }}&#039;
  YAK_ANSIBLE_TRANSPORT_URL: &#039;{{ yak_ansible_transport_url }}&#039;
  YAK_ANSIBLE_SSL_VERIFY_CERTIFICATE: &#039;{{ yak_ansible_ssl_verify_certificate }}&#039;
</pre></div>

<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-9-1024x493.png" alt="" class="wp-image-38017" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-9-1024x493.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-9-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-9-768x370.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-9-1536x740.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-9.png 1919w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ol start="2" class="wp-block-list">
<li>YaK API With Component:<br>&#8211; <strong>Name</strong>: YaK API With Component<br>&#8211; <strong>Input configuration</strong>:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
fields:
  - id: yak_ansible_transport_url
    type: string
    label: YaK API URL
  - id: yak_ansible_http_token
    type: string
    label: YaK API HTTP Token
    secret: true
  - id: yak_ansible_ssl_verify_certificate
    type: string
    label: Verify SSL certificate
    choices:
      - &#039;true&#039;
      - &#039;false&#039;
  - id: yak_core_component
    type: string
    label: YaK Core Component (used for component deployment)
required:
  - yak_ansible_transport_url
  - yak_ansible_http_token
  - yak_ansible_ssl_verify_certificate
</pre></div>


<p>⠀⠀⠀⠀- <strong>Injector configuration</strong>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
env:
  YAK_ANSIBLE_DEBUG: &#039;true&#039;
  YAK_CORE_COMPONENT: &#039;{{ yak_core_component }}&#039;
  YAK_ANSIBLE_HTTP_TOKEN: &#039;{{ yak_ansible_http_token }}&#039;
  YAK_ANSIBLE_TRANSPORT_URL: &#039;{{ yak_ansible_transport_url }}&#039;
  YAK_ANSIBLE_SSL_VERIFY_CERTIFICATE: &#039;{{ yak_ansible_ssl_verify_certificate }}&#039;
</pre></div>

<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-10-1024x494.png" alt="" class="wp-image-38018" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-10-1024x494.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-10-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-10-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-10-1536x742.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-10.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Credentials</strong>: Set up credentials in AAP using the custom credential type to securely store and manage YaK API tokens.<br>In the left menu, go to Automation Execution ⟶ Infrastructure ⟶ Credential, then click on <code>Create credential</code> button</li>
</ul>



<ol class="wp-block-list">
<li>YaK API Core:<br>&#8211; <strong>Name</strong>: YaK API Core<br>&#8211; <strong><strong>Credential type</strong></strong>: YaK API<br>&#8211; <strong>YaK API URL</strong>: &lt;url to your yak instance&gt;/data/graphql<br>&#8211; <strong>YaK API HTTP Token</strong>: &lt;YaK API token generated previously&gt;<br>&#8211; <strong>Verify SSL certificate</strong>: <em>depending if your YaK url have a valid SSL certificate (select <strong>true</strong>) or not (select <strong>false</strong>)</em></li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-12-1024x493.png" alt="" class="wp-image-38021" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-12-1024x493.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-12-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-12-768x370.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-12-1536x740.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-12.png 1919w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ol start="2" class="wp-block-list">
<li>YaK API Component:<br>&#8211; <strong>Name</strong>: YaK API Component &#8211; &lt;component name set in YaK&gt;<br>&#8211; <strong><strong>Credential type</strong></strong>: YaK API Withe Component<br>&#8211; <strong>YaK API URL</strong>: &lt;url to your yak instance&gt;/data/graphql<br>&#8211; <strong>YaK API HTTP Token</strong>: &lt;YaK API token generated previously&gt;<br>&#8211; <strong>YaK Core Component (used for component deployment)</strong>: &lt;component name set in YaK&gt;<br>&#8211; <strong>Verify SSL certificate</strong>: <em>depending if your YaK url have a valid SSL certificate (select <strong>true</strong>) or not (select <strong>false</strong>)</em></li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-13-1024x493.png" alt="" class="wp-image-38022" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-13-1024x493.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-13-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-13-768x369.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-13-1536x739.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-13.png 1919w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Project</strong>: Create an AAP project pointing to your YaK repository containing playbooks.<br>In the left menu, go to Automation Execution ⟶ Project, then click on <code>Create project</code> button</li>
</ul>



<ol class="wp-block-list">
<li>YaK Core:<br>&#8211; <strong>Name</strong>: YaK Core<br>&#8211; <strong><strong><strong>Execution environment</strong></strong></strong>: YaK EE<br>&#8211; <strong><strong>Source control type</strong></strong>: Git<br>&#8211; <strong><strong>Source control URL</strong></strong>: https://gitlab.com/yak4all/yak_core.git<br>&#8211; <strong><strong>Source control branch/tag/commit</strong></strong>: &lt;select the same release version than your YaK deployed&gt;<br>   You can find the YaK release version at the bottom of the YaK left menu:</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="273" height="495" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-15.png" alt="" class="wp-image-38024" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-15.png 273w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-15-165x300.png 165w" sizes="auto, (max-width: 273px) 100vw, 273px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-16-1024x494.png" alt="" class="wp-image-38025" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-16-1024x494.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-16-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-16-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-16-1536x741.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-16.png 1917w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ol start="2" class="wp-block-list">
<li>YaK Component:<br>&#8211; <strong>Name</strong>: YaK &lt;component type&gt; Component<br>&#8211; <strong><strong><strong>Execution environment</strong></strong></strong>: YaK EE<br>&#8211; <strong><strong>Source control type</strong></strong>: Git<br>&#8211; <strong><strong>Source control URL</strong></strong>: &lt;private git repository url to your component&gt;<br>&#8211; <strong><strong>Source control branch/tag/commit</strong></strong>: main<br>&#8211; <strong>Source control credential</strong>: &lt;your credential where stored your authentications to the git repository&gt;</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-17-1024x493.png" alt="" class="wp-image-38026" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-17-1024x493.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-17-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-17-768x370.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-17-1536x740.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-17.png 1917w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Inventory</strong>: Configure the inventory, aligning it with YaK&#8217;s managed targets and deployment definitions.<br>In the left menu, go to Automation Execution ⟶ Infrastructure ⟶ Inventories, then click on <code>Create inventory</code> button</li>
</ul>



<ol class="wp-block-list">
<li>YaK Inventory:<br>&#8211; <strong>Name</strong>: YaK Inventory</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="495" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-18-1024x495.png" alt="" class="wp-image-38030" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-18-1024x495.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-18-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-18-768x372.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-18-1536x743.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-18.png 1916w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>⠀⠀From the YaK Inventory, go to <code>Sources</code> tab, then click on <code>Create source</code> button<br>⠀⠀- <strong>Name</strong>: YaK Core<br>⠀⠀- <strong>Execution environment</strong>: YaK EE<br>⠀⠀- <strong>Source</strong>: Sourced from a Project<br>⠀⠀- <strong>Credential</strong>: YaK API Core<br>⠀⠀- <strong>Project</strong>: YaK Core<br>⠀⠀- <strong>Inventory file</strong>: inventory/yak.core.db.yml<br>⠀⠀- <strong>Verbosity</strong>: 0<br>⠀⠀- <strong>Options</strong>: Overwrite, Overwrite variables, Update on launch</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-19-1024x493.png" alt="" class="wp-image-38031" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-19-1024x493.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-19-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-19-768x370.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-19-1536x739.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-19.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ol start="2" class="wp-block-list">
<li>YaK Inventory for component (you will need to create one inventory by component you want to manage from AAP):<br>&#8211; <strong>Name</strong>: YaK Inventory &#8211; &lt;component name&gt;</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="496" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-20-1024x496.png" alt="" class="wp-image-38032" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-20-1024x496.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-20-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-20-768x372.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-20-1536x744.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-20.png 1919w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>⠀⠀From the YaK Inventory &#8211; &lt;component name&gt;, go to <code>Sources</code> tab, then click on <code>Create source</code> button<br>⠀⠀- <strong>Name</strong>: YaK &lt;component type&gt;<br>⠀⠀- <strong>Execution environment</strong>: YaK EE<br>⠀⠀- <strong>Source</strong>: Sourced from a Project<br>⠀⠀- <strong>Credential</strong>: YaK API Component &#8211; &lt;component name&gt;<br>⠀⠀- <strong>Project</strong>: YaK &lt;component type&gt; Component<br>⠀⠀- <strong>Inventory file</strong>: inventory/yak.core.db.yml<br>⠀⠀- <strong>Verbosity</strong>: 0<br>⠀⠀- <strong>Options</strong>: Overwrite, Overwrite variables, Update on launch</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="495" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-21-1024x495.png" alt="" class="wp-image-38033" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-21-1024x495.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-21-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-21-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-21-1536x742.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-21.png 1918w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Template</strong>: Develop AAP templates leveraging YaK playbooks and workflows, enabling repeatable and consistent deployments.<br>In the left menu, go to Automation Execution ⟶ Templates, then click on <code>Create template</code> button and select <code>Create job template</code></li>
</ul>



<ol class="wp-block-list">
<li>Server &#8211; Deploy:<br>&#8211; <strong>Name</strong>: Server &#8211; Deploy<br>&#8211; <strong>Job type</strong>: Run<br>&#8211; <strong>Inventory</strong>: YaK Inventory<br>&#8211; <strong>Project</strong>: YaK Core<br>&#8211; <strong>Playbook</strong>: servers/deploy.yml<br>&#8211; <strong>Execution environment</strong>: YaK EE<br>&#8211; <strong>Credentials</strong>: YaK API Core<br>&#8211; <strong>Extra variables</strong>: target: &#8221;<br> Select the checkbox <code>Prompt on launch</code> for the Extra variables section. It will permit to set the server you want to deploy when you will run the job.</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-22-1024x494.png" alt="" class="wp-image-38034" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-22-1024x494.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-22-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-22-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-22-1536x741.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-22.png 1921w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ol start="2" class="wp-block-list">
<li>Your component &#8211; Deploy:<br>&#8211; <strong>Name</strong>: &lt;component name&gt; &#8211; Deploy<br>&#8211; <strong>Job type</strong>: Run<br>&#8211; <strong>Inventory</strong>: YaK Inventory &#8211; &lt;component name&gt;<br>&#8211; <strong>Project</strong>: YaK &lt;component type&gt; Component<br>&#8211; <strong>Playbook</strong>: &lt;path to your component deployment playbook&gt;<br>&#8211; <strong>Execution environment</strong>: YaK EE<br>&#8211; <strong>Credentials</strong>: YaK API Component &#8211; &lt;component name&gt;</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-23-1024x494.png" alt="" class="wp-image-38035" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-23-1024x494.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-23-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-23-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-23-1536x741.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-23.png 1919w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h2 class="wp-block-heading">Creating an AAP Workflow for Full-Stack Deployment</h2>



<p>Leveraging AAP workflows enables structured, automated deployments. In this chapter we will deploy a server named redhat-demo and the attached PostgreSQL component named pg-demo. These resources have already been created in the YaK, using the UI.</p>



<ul class="wp-block-list">
<li>In AAP, create a new workflow:<br>In the left menu, go to Automation Execution ⟶ Templates, then click on <code>Create template</code> button and select <code>Create workflow job template</code>:<br>&#8211; <strong>Name</strong>: Deploy Server and PG using YaK</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="495" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-25-1024x495.png" alt="" class="wp-image-38037" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-25-1024x495.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-25-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-25-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-25-1536x742.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-25.png 1918w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ul class="wp-block-list">
<li>Add and connect job templates corresponding to each deployment stage using YaK inventories and playbooks, here the complete workflow to create:</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="493" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-26-1024x493.png" alt="" class="wp-image-38038" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-26-1024x493.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-26-300x144.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-26-768x370.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-26-1536x739.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-26.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<ol class="wp-block-list">
<li>YaK Core:<br>After the <code>Start</code>, add a new step with the following infos:<br>&#8211; <strong><strong>Node type</strong></strong>: Inventory Source Sync<br>&#8211; <strong><strong>Inventory source</strong></strong>: YaK Core<br>&#8211; <strong><strong>Convergence</strong></strong>: Any</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img loading="lazy" decoding="async" width="300" height="269" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-27-300x269.png" alt="" class="wp-image-38039" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-27-300x269.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-27-768x690.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-27.png 813w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<ol start="2" class="wp-block-list">
<li>Deploy redhat-demo server:<br>After the <code>YaK Core</code>, add a new step with the following infos:<br>&#8211; <strong><strong>Node type</strong></strong>: Job Template<br>&#8211; <strong><strong><strong>Job template</strong></strong></strong>: Server &#8211; Deploy<br>&#8211; <strong>Status</strong>: Run on success<br>&#8211; <strong><strong>Convergence</strong></strong>: Any<br>&#8211; <strong>Node alias</strong>: Deploy redhat-demo</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img loading="lazy" decoding="async" width="300" height="271" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-28-300x271.png" alt="" class="wp-image-38040" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-28-300x271.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-28-768x693.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-28.png 802w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<p>⠀⠀⠀⠀After clicking on <code>Next</code> button, you will have to set the playbook extra variables:<br>⠀⠀⠀⠀- <strong>Variables</strong>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
target: redhat-demo
</pre></div>

<div class="wp-block-image">
<figure class="aligncenter size-medium"><img loading="lazy" decoding="async" width="300" height="271" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-29-300x271.png" alt="" class="wp-image-38041" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-29-300x271.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-29-768x693.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-29.png 804w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<ol start="3" class="wp-block-list">
<li>YaK Component inventory:<br>After the <code>Deploy redhat-demo</code>, add a new step with the following infos:<br>&#8211; <strong><strong>Node type</strong></strong>: Inventory Source Sync<br>&#8211; <strong><strong>Inventory source</strong></strong>: YaK PostgreSQL<br>&#8211; <strong>Status</strong>: Run on success<br>&#8211; <strong><strong>Convergence</strong></strong>: Any</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img loading="lazy" decoding="async" width="300" height="267" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-30-300x267.png" alt="" class="wp-image-38042" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-30-300x267.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-30-768x684.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-30.png 815w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<ol start="4" class="wp-block-list">
<li>Deploy redhat-demo server:<br>After the <code>YaK PostgreSQL</code>, add a new step with the following infos:<br>&#8211; <strong><strong>Node type</strong></strong>: Job Template<br>&#8211; <strong><strong><strong>Job template</strong></strong></strong>: PostgreSQL &#8211; Deploy PG demo<br>&#8211; <strong>Status</strong>: Run on success<br>&#8211; <strong><strong>Convergence</strong></strong>: Any<br>&#8211; <strong>Node alias</strong>: Deploy pg-demo</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img loading="lazy" decoding="async" width="300" height="270" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-31-300x270.png" alt="" class="wp-image-38043" style="object-fit:cover" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-31-300x270.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-31-768x692.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-31.png 807w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<ul class="wp-block-list">
<li>You can save your workflow template.</li>



<li>Initiate the workflow manually or configure scheduled runs for fully automated deployments.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-32-1024x494.png" alt="" class="wp-image-38044" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-32-1024x494.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-32-300x145.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-32-768x371.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-32-1536x742.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2025/04/image-32.png 1918w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>By integrating YaK into AAP workflows, teams can automate entire stack deployments efficiently, achieving unprecedented consistency and speed.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Integrating YaK with Red Hat Ansible Automation Platform combines YaK&#8217;s ease-of-use and powerful features with AAP’s comprehensive automation capabilities. This synergy ensures that deployment processes are more structured, faster, and consistently aligned with best practices, thus significantly enhancing overall efficiency and reducing time-to-market for businesses.</p>



<p></p>
<p>L’article <a href="https://www.dbi-services.com/blog/integrate-yak-into-red-hat-ansible-automation-platform/">Integrate YaK into Red Hat Ansible Automation Platform</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/integrate-yak-into-red-hat-ansible-automation-platform/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Introducing YaK 2.0: The future of effortless PaaS deployments across Clouds and On-Premises</title>
		<link>https://www.dbi-services.com/blog/introducing-yak-automated-multi-cloud-deployment/</link>
					<comments>https://www.dbi-services.com/blog/introducing-yak-automated-multi-cloud-deployment/#respond</comments>
		
		<dc:creator><![CDATA[Rémy Gaudey]]></dc:creator>
		<pubDate>Wed, 15 Jan 2025 07:13:37 +0000</pubDate>
				<category><![CDATA[YaK]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=35489</guid>

					<description><![CDATA[<p>Hello, dear tech enthusiasts and cloud aficionados! We’ve got some news that’s about to make your life —or your deployments, at least— a whole lot easier. Meet YaK 2.0, the latest game-changer in the world of automated multi-cloud PaaS deployment. After months of development, testing, troubleshooting, a fair share of meetings and way too much [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/introducing-yak-automated-multi-cloud-deployment/">Introducing YaK 2.0: The future of effortless PaaS deployments across Clouds and On-Premises</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="278" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YAK-logotype-CMJN-2022-1-1024x278.png" alt="YaK 2.0 Automated multi-cloud PaaS deployment" class="wp-image-35562" style="width:442px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YAK-logotype-CMJN-2022-1-1024x278.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YAK-logotype-CMJN-2022-1-300x81.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YAK-logotype-CMJN-2022-1-768x208.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YAK-logotype-CMJN-2022-1-1536x417.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YAK-logotype-CMJN-2022-1-2048x555.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Hello, dear tech enthusiasts and cloud aficionados!</p>



<p>We’ve got some news that’s about to make your life —or your deployments, at least— a whole lot easier. Meet YaK 2.0, the latest game-changer in the world of automated multi-cloud PaaS deployment. After months of development, testing, troubleshooting, a fair share of meetings and way too much coffee, YaK is officially launching today.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1200" height="1500" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/YaK-Launch1.jpg" alt="" class="wp-image-35633" style="width:442px;height:auto" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/YaK-Launch1.jpg 1200w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/YaK-Launch1-240x300.jpg 240w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/YaK-Launch1-819x1024.jpg 819w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/YaK-Launch1-768x960.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>
</div>


<p></p>



<h2 class="wp-block-heading" id="h-automated-multi-cloud-paas-deployment-what-s-the-deal-with-yak-2-0">Automated multi-cloud PaaS deployment. What’s the deal with YaK 2.0?</h2>



<p>Because we believe IT professionals should spend time on complex, value-added tasks, but not on repetitive setups, we have decided to develop the YaK.<br>YaK is a framework that allows anyone to deploy any type of component on any platform, while ensuring quality, cost efficiency and reducing deployment time.</p>



<p>YaK 2.0 is your new best friend when it comes to deploying infrastructure that’s not just efficient but also identical across every platform you’re working with &#8211; be it multi-cloud or on-premises. Originating from the need to deploy multi-technology infrastructures quickly and effortlessly, YaK ensures your setup is consistent, whether you&#8217;re working with AWS, Azure, Oracle Cloud, or your own on-prem servers.</p>



<p>In simpler terms, YaK makes sure your deployment process is consistent and reliable, no matter where. Whether you’re scaling in the cloud or handling things in-house, YaK’s got your back.</p>



<h2 class="wp-block-heading" id="h-why-you-should-have-a-look-at-yak-2-0">Why you should have a look at YaK 2.0?</h2>



<p>Here’s why we think YaK is going to become your favorite pet:</p>



<ul class="wp-block-list">
<li><strong>Flexibility:</strong> Deploy across AWS, Azure, OCI, or your own servers—YaK adapts to your infrastructure, making every platform feel like home.</li>



<li><strong>Automation:</strong> Eliminate repetitive setups with automated deployments, saving you time and headaches.</li>



<li><strong>Cost efficiency &amp; speed:</strong> YaK cuts time-to-market, streamlining deployments for fast, standardized rollouts that are both cost-effective and secure.</li>



<li><strong>Freedom from vendor lock-In:</strong> YaK is vendor-neutral, letting you deploy on your terms, across any environment.</li>



<li><strong>Swiss software </strong>backed up by a consulting company (<a href="https://www.dbi-services.com/">dbi services</a>) with extensive expertise in deployments.</li>
</ul>



<p>With this release, we’re excited to announce a major upgrade:</p>



<ul class="wp-block-list">
<li><strong>Sleek new user interface:</strong> YaK 2.0 now comes with a user-friendly interface, making it easier than ever to manage your deployments. Say hello to intuitive navigation.</li>
</ul>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="621" data-id="35560" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK-UI_main_screen-1024x621.png" alt="YaK 2.0 Automated multi-cloud PaaS deployment" class="wp-image-35560" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK-UI_main_screen-1024x621.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK-UI_main_screen-300x182.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK-UI_main_screen-768x466.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK-UI_main_screen-1536x931.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK-UI_main_screen-2048x1242.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<ul class="wp-block-list">
<li><strong>Components: </strong>We’ve got components on our roadmap (available with an annual subscription), and we’ll be announcing them shortly&nbsp;: <strong>Oracle Database, PostgreSQL, MongoDB, </strong>and<strong> Kubernetes </strong>are already on the list and will be released soon.</li>
</ul>



<p>Many more will follow&#8230; Stay tuned!<strong></strong></p>



<h2 class="wp-block-heading" id="h-how-does-it-work">How does it work?</h2>



<p><strong>YaK Core</strong> is the open-source part and is the heart of our product, featuring Ansible playbooks and a custom plugin that provides a single inventory for all platforms, making your server deployments seamless across clouds like AWS, Azure, and OCI.<br>If you want to see for yourself, our GitLab project is <a href="https://gitlab.com/yak4all/yak_core/-/blob/main/README.md" target="_blank" rel="noreferrer noopener">available here!</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="645" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK_core-1024x645.png" alt="YaK 2.0 Automated multi-cloud PaaS deployment" class="wp-image-35559" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK_core-1024x645.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK_core-300x189.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK_core-768x484.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK_core-1536x967.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/10/YaK_core-2048x1290.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>YaK Components</strong> are the value-added part of the product and bring you expert-designed modules for deploying databases and application servers, with an annual subscription to dbi services.</p>



<h2 class="wp-block-heading" id="h-join-the-yak-pack">Join the YaK pack</h2>



<p>Explore the power of automated multi-cloud PaaS deployment with YaK 2.0 and experience a new level of efficiency and flexibility. We can’t wait for you to try it out and see just how much it can streamline your deployment process. Whether you’re a startup with big dreams or an established enterprise looking to optimize, YaK is here to make your life easier.</p>



<p>Our YaK deserved its own web page, check it out for more information, to contact us or to try it out (free demo environments will be available soon): <a href="https://yak4all.io/">yak4all.io</a></p>



<p>Wanna ride the YaK? Check out our <a href="https://dbi-services.gitbook.io/yak-user-doc/" target="_blank" rel="noreferrer noopener">user documentation</a> to get started!<br>We promise it’ll be the smoothest ride you’ve had in a while.</p>



<p>We’re not just launching a product; we’re building a community. We’d love for you to chime in, share your experiences, and help us make YaK even better. Follow us on LinkedIn, <a href="https://gitlab.com/yak4all">join our community on GitLab</a>, and let’s create something amazing together.</p>



<p>Feel free to reach out to us for more details or for a live presentation: <a href="mailto:info@dbi-services.com" target="_blank" rel="noreferrer noopener">info@dbi-services.com</a></p>



<p>Thanks for being part of this exciting journey. We can’t wait to see what you build with YaK.</p>



<p>The YaK Team</p>



<p>&#8212;</p>



<p><em>P.S. If you’re wondering about the name, well, yaks are known for being hardy, reliable, and able to thrive in any environment. </em><em>Plus, they look pretty cool, don’t you think?</em></p>
<p>L’article <a href="https://www.dbi-services.com/blog/introducing-yak-automated-multi-cloud-deployment/">Introducing YaK 2.0: The future of effortless PaaS deployments across Clouds and On-Premises</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/introducing-yak-automated-multi-cloud-deployment/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Building multi-architecture images with GitLab CI/CD</title>
		<link>https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/</link>
					<comments>https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/#respond</comments>
		
		<dc:creator><![CDATA[Nicolas Meunier]]></dc:creator>
		<pubDate>Fri, 06 Dec 2024 09:06:15 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[GitlabCI/CD]]></category>
		<category><![CDATA[Image buid]]></category>
		<category><![CDATA[multi-architecture]]></category>
		<category><![CDATA[x86]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=35955</guid>

					<description><![CDATA[<p>Building multi-architecture images become more and more useful. Indeed, many recent computers use ARM processors architecture. Examples include MacBooks using M(x) processors, and Amazon EC2 instances using AWS Graviton processors. However, the diversification of processor architectures adds a new level of complexity to the creation of container images. Indeed, the construction has to cope with [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/">Building multi-architecture images with GitLab CI/CD</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Building multi-architecture images become more and more useful. Indeed, many recent computers use ARM processors architecture. Examples include MacBooks using M(x) processors, and Amazon EC2 instances using <a href="https://aws.amazon.com/fr/ec2/graviton/">AWS Graviton</a> processors.</p>



<p>However, the diversification of processor architectures adds a new level of complexity to the creation of container images. Indeed, the construction has to cope with different instruction sets.</p>



<h2 class="wp-block-heading" id="h-docker-buildx-the-solution-for-building-multi-architecture-images">Docker buildx, the solution for building multi-architecture images</h2>



<p>For the <a href="https://gitlab.com/yak4all/yak_core">YaK</a> project, we want to make amd64 (x86) and arm64 images available using GitLab CI/CD.</p>



<p>In order to create a build compatible with several architectures, I had to use “docker buildx” in my .gitlab-ci.yml file:</p>



<pre class="wp-block-code"><code>build:
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    - docker buildx create --name yakbuilder --use
  script:
    - docker buildx build --pull --builder=yakbuilder --platform linux/amd64,linux/arm64 -t &#091;IMG]:&#091;TAG] --push .
</code></pre>



<h3 class="wp-block-heading" id="h-how-it-works">How it works:</h3>



<ul class="wp-block-list">
<li>In the <code>"before_script"</code> section , I initialize a QEMU container to emulate ARM architecture and to create a buildx context using the QEMU container</li>



<li>In the <code>"script"</code> section itself, instead of a simple &#8220;docker build&#8221;, I use the <code>"docker <strong>buildx</strong> build"</code> command</li>



<li>I also pass the buildx context created in the <code>"before_script"</code> with the <code>--builder</code> flag</li>



<li>Finally, I add the list of architectures required for the build with the <code>--platform</code> flag</li>
</ul>



<h2 class="wp-block-heading" id="h-build-result">Build Result</h2>



<p>With this method, the build is slower. That&#8217;s normal as several images are created (one per architecture) instead of just one.</p>



<p>The result can be seen in the GitLab container registry:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="428" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-1024x428.png" alt="container registry details" class="wp-image-35958" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-1024x428.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-300x125.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry-768x321.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/11/Container-registry.png 1070w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Now, below the image tag, a small “index” label is shown. This refers to the fact that several images are available for this tag. During the image pull, the container engine will choose the image version corresponding to its architecture.</p>



<h2 class="wp-block-heading" id="h-conclusion">Conclusion</h2>



<p>With <strong>buildx</strong> and QEMU in GitLab CI/CD, building multi-architecture images is easy. You can manage different processor architectures and meet the needs of a wide range of users and ensure the compatibility of your container images.</p>



<p></p>
<p>L’article <a href="https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/">Building multi-architecture images with GitLab CI/CD</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/building-multi-architecture-images-with-gitlab-ci-cd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Faster Ansible</title>
		<link>https://www.dbi-services.com/blog/faster-ansible/</link>
					<comments>https://www.dbi-services.com/blog/faster-ansible/#respond</comments>
		
		<dc:creator><![CDATA[Middleware Team]]></dc:creator>
		<pubDate>Mon, 08 Apr 2024 15:03:21 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[Performance Tuning]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[yak]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=32335</guid>

					<description><![CDATA[<p>Even if Ansible is powerful and flexible, it can be considered &#8220;slow&#8221;. It will be anyway faster, and more consistent, than doing the same steps manually. Nevertheless, we will experiment to make it even faster. I found few of them on the Internet, but rarely with figures of what to expect. In this blog post, [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/faster-ansible/">Faster Ansible</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Even if Ansible is powerful and flexible, it can be considered &#8220;slow&#8221;. It will be anyway faster, and more consistent, than doing the same steps manually. Nevertheless, we will experiment to make it even faster. I found few of them on the Internet, but rarely with figures of what to expect.</p>



<p>In this blog post, I will cover one of them and run different scenarios. We will also dig inside some internal mechanism used by Ansible.</p>



<h2 class="wp-block-heading" id="h-ssh-connections">SSH Connections</h2>



<p>Ansible is connection intensive as it opens, and closes, many ssh connections to the targeted hosts.</p>



<p>I found two possible ways to count the amount of connections from control to agents nodes:</p>



<ul class="wp-block-list">
<li>Add <code>-vvv</code> option to the ansible-playbook command.</li>



<li>grep audit.log file:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
tail -f /var/log/audit/audit | grep USER_LOGIN
</pre></div>


<p>First option is really too much verbose, but I used it with the first playbook below to confirm the second option give the same count.</p>



<h2 class="wp-block-heading" id="h-simple-playbook">Simple Playbook</h2>



<p>To demonstrate that, let&#8217;s start with a very minimal playbook <span style="text-decoration: underline">without</span> fact gathering:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
---
- name: Test playbook
  hosts: all
  gather_facts: false
  pre_tasks:
    - name: &quot;ping&quot;
      ansible.builtin.ping:
...
</pre></div>


<p>This playbook triggered <strong>8</strong> ssh connections to the target host. If I enable facts gathering, count goes to <strong>14</strong> connections. Again, this is quiet a lot knowing that playbook does not do much beside check target is alive.</p>



<p>To summarize:</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td><strong>gather_facts</strong></td><td><strong>connections</strong></td><td><strong>timing (s)</strong></td></tr><tr><td>false</td><td>8</td><td>1,277</td></tr><tr><td>true</td><td>14</td><td>1,991</td></tr></tbody></table><figcaption class="wp-element-caption">ping playbook results</figcaption></figure>



<h2 class="wp-block-heading" id="h-what-are-all-these-connection-for">What are All These Connection For?</h2>



<p>To determine what are these connections doing, we can analyze verbose (really verbose!!) output of Ansible playbook without fact gathering.</p>



<h3 class="wp-block-heading" id="h-first-connection">First Connection</h3>



<p>First command of first connection is <code>echo ~opc &amp;&amp; sleep 0</code> which will return the home directory of ansible user.</p>



<h3 class="wp-block-heading" id="h-second">Second</h3>



<p>Second command is already scary:</p>



<pre class="wp-block-code"><code>( umask 77 &amp;&amp; mkdir -p "` echo /home/opc/.ansible/tmp `"&amp;&amp; mkdir "` echo /home/opc/.ansible/tmp/ansible-tmp-1712570792.3350322-23674-205520350912482 `" &amp;&amp; echo ansible-tmp-1712570792.3350322-23674-205520350912482="` echo /home/opc/.ansible/tmp/ansible-tmp-1712570792.3350322-23674-205520350912482 `" ) &amp;&amp; sleep 0</code></pre>



<ol class="wp-block-list">
<li>It set the umask for the commands to follow.</li>



<li>Create tmp directory to store any python script on target</li>



<li>In that directory, create a directory to store the script for this specific task</li>



<li>Makes this ssh command return the temporary variable with full path to the task script directory</li>



<li>sleep 0</li>
</ol>



<p>This one is mainly to ensure directory structure exists on the target.</p>



<h3 class="wp-block-heading" id="h-third">Third</h3>



<p>I will not paste this one here as it is very long and we can easily guess what it does with log just before:</p>



<pre class="wp-block-code"><code>Attempting python interpreter discovery</code></pre>



<p>Roughly, what it does, it tries many <a href="https://github.com/ansible/ansible/blob/61e18572bbee2431b71bcfdb8e5f74dacda98325/lib/ansible/config/base.yml#L1511C1-L1511C28" target="_blank" rel="noreferrer noopener">versions</a> of python.</p>



<h3 class="wp-block-heading" id="h-fourth">Fourth</h3>



<p>Next, it will run a python script with discovered python version to determine Operating System type and release.</p>



<h3 class="wp-block-heading" id="h-fifth">Fifth</h3>



<p>Fifth connection is actually a sftp command to copy module content (AnsiballZ_ping.py). AnsiballZ is a framework to embed module into script itself. This allows to be run modules with a single Python copy.</p>



<h3 class="wp-block-heading" id="h-seventh">Seventh</h3>



<p>This one is simply ensuring execution permission is set on temporary directory (ie. ansible-tmp-1712570792.3350322-23674-205520350912482) as well the python script (ie. AnsiballZ_ping.py).</p>



<h3 class="wp-block-heading" id="h-eighth-and-last-connection">Eighth and Last Connection</h3>



<p>Lastly, the execution of the ping module itself:</p>



<pre class="wp-block-code"><code>/usr/bin/python3.9 /home/opc/.ansible/tmp/ansible-tmp-1712570792.3350322-23674-205520350912482/AnsiballZ_ping.py &amp;&amp; sleep 0</code></pre>



<h2 class="wp-block-heading" id="h-optimization">Optimization</h2>



<p>To reduce the amount of connection, there is one possible option: Pipelining</p>



<p>To enable that, I simply need to add following line in ansible.cfg:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
pipelining = true
</pre></div>


<p>Or set <code>ANSIBLE_PIPELINING</code> environment variable to <mark class="has-inline-color has-luminous-vivid-orange-color">true</mark>.</p>



<p>How does it improve our playbook execution time:</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td><strong>gather_facts</strong></td><td><strong>connections</strong></td><td><strong>timing (s)</strong></td></tr><tr><td>false</td><td>3 (-62%)</td><td>0,473 (-63%)</td></tr><tr><td>true</td><td>4 (-71%)</td><td>1,275 (-36%)</td></tr></tbody></table><figcaption class="wp-element-caption">ping playbook results with pipelining</figcaption></figure>



<p>As we can see there is a significant reduction on the amount of ssh connections as well as a reduction of the playbook duration.</p>



<p>In this configuration, only 3 connections are made:</p>



<ul class="wp-block-list">
<li>python interpreter discovery (connection #3)</li>



<li>OS type discovery (connection #4)</li>



<li>python module execution (connection #8). AnsiballZ data is piped to that process.</li>
</ul>



<p>With the pipelining option, I also noticed that the Ansible temporary directory is not created.</p>



<p>Of course, we can&#8217;t expect such big speed-up on a real life playbook. So, we should do it now.</p>



<h2 class="wp-block-heading" id="h-deploy-weblogic-server-playbook">Deploy WebLogic Server Playbook</h2>



<p>Let&#8217;s use the WebLogic <a href="https://www.dbi-services.com/products/yak/">YaK</a> component to deploy a single WebLogic instance. It includes dbi service best practices, latest CPU patches and SSL configuration. The &#8220;normal&#8221; run takes 13 minutes 30 seconds when the pipelined run takes 12 minutes 13 seconds. This is <mark class="has-inline-color has-luminous-vivid-orange-color">10% faster</mark>.</p>



<p>This is nice, but not as good as previous playbook. Why is that? Because most of the time is not spent in ssh connections, but with actual work (running WebLogic installer, starting services, patching with OPatch, etc).</p>



<h2 class="wp-block-heading" id="h-what-next">What Next?</h2>



<p>With such results, you might wonder why isn&#8217;t it enabled by default? As per documentation, there is a limitation:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>This can conflict with privilege escalation (become). For example, when using sudo operations you must first disable ‘requiretty’ in the sudoers file for the target hosts, which is why this feature is disabled by default.</p>
<cite><a href="https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-pipelining">Ansible documentation</a></cite></blockquote>



<p>Until now, with all tests I have made, I never encountered that limitation. <strong>Did you?</strong></p>
<p>L’article <a href="https://www.dbi-services.com/blog/faster-ansible/">Faster Ansible</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/faster-ansible/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OCI &#8211; Recover lost SSH access to an Ubuntu instance</title>
		<link>https://www.dbi-services.com/blog/oci-recover-lost-ssh-access-to-an-ubuntu-instance/</link>
					<comments>https://www.dbi-services.com/blog/oci-recover-lost-ssh-access-to-an-ubuntu-instance/#respond</comments>
		
		<dc:creator><![CDATA[Morgan Patou]]></dc:creator>
		<pubDate>Mon, 29 Jan 2024 19:28:00 +0000</pubDate>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[OCI]]></category>
		<category><![CDATA[YaK]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[yak]]></category>
		<guid isPermaLink="false">https://www.dbi-services.com/blog/?p=30564</guid>

					<description><![CDATA[<p>Getting started in the cloud is pretty easy but things can get a little messy pretty quickly. A few weeks ago, I faced a case where I suddenly lost the SSH access to an Ubuntu OCI instance used internally for Alfresco in the scope of our YaK testing. was suddenly not accessible anymore, neither through [&#8230;]</p>
<p>L’article <a href="https://www.dbi-services.com/blog/oci-recover-lost-ssh-access-to-an-ubuntu-instance/">OCI &#8211; Recover lost SSH access to an Ubuntu instance</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Getting started in the cloud is pretty easy but things can get a little messy pretty quickly. A few weeks ago, I faced a case where I suddenly lost the SSH access to an Ubuntu OCI instance used internally for Alfresco in the scope of our <a href="https://www.dbi-services.com/fr/produits/yak/" target="_blank" rel="noreferrer noopener">YaK</a> testing. was suddenly not accessible anymore, neither through the browser nor SSH. This was just a quick testing environment, whose purpose is to get created and destroyed frequently. Therefore, it doesn&#8217;t include any backups or other recovery options. However, I found this case interesting and instead of just scratching the instance to have it back, I thought it could be good to investigate what happened and what can be done on OCI to get your instance back &#8220;online&#8221;.</p>



<h2 class="wp-block-heading" id="h-1-using-the-oci-local-connection-feature">1. Using the OCI local connection feature</h2>



<p>I started looking into the <a href="https://docs.oracle.com/en-us/iaas/Content/Compute/References/serialconsole.htm" target="_blank" rel="noreferrer noopener">documentation of OCI</a>. I didn&#8217;t have the necessary permissions to use the &#8220;Console Connection&#8221;, so I asked a colleague to grant me the <a href="https://docs.oracle.com/en-us/iaas/Content/Compute/References/serialconsole.htm#serialconsole_topic_required_iam_policies" target="_blank" rel="noreferrer noopener">needed IAM Policies</a> in the correct compartment:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
Allow group &lt;group_name&gt; to manage instance-console-connection in tenancy
Allow group &lt;group_name&gt; to read instance in tenancy
</pre></div>


<p>Once that was done, I was able to <a href="https://docs.oracle.com/en-us/iaas/Content/Compute/References/serialconsole.htm#Connecti2__maclinux" target="_blank" rel="noreferrer noopener">create a new &#8220;local connection&#8221; SSH access</a> for my Mac. Once the connection was created (simply click on &#8220;Create local connection&#8221;; generate or paste your public key and finally click on &#8220;Create console connection&#8221;), I was able to copy the SSH command to connect to my unavailable instance:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db2249c0&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db2249c0" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="409" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_1-1024x409.png" alt="Create an OCI instance console connection" class="wp-image-30565" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_1-1024x409.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_1-300x120.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_1-768x307.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_1-1536x613.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_1-2048x818.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>This is the SSH command generated by OCI to be able to connect to the system (where XXX is a random ID for the console connection host and YYY is the random ID of your instance OCID):</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
ssh -o ProxyCommand=&#039;ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.eu-zurich-1.XXX@instance-console.eu-zurich-1.oci.oraclecloud.com&#039; ocid1.instance.oc1.eu-zurich-1.YYY
</pre></div>


<p>As described in the documentation, since I&#8217;m not using the default SSH key or ssh-agent, then I needed to update that command with my custom private key, to be able to connect. Therefore, the previous command became (add 2 times the &#8220;<em>-i /path/to/private/key</em>&#8220;):</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
ssh -i ~/.ssh/ocilocalshell -o ProxyCommand=&#039;ssh -i ~/.ssh/ocilocalshell -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.eu-zurich-1.XXX@instance-console.eu-zurich-1.oci.oraclecloud.com&#039; ocid1.instance.oc1.eu-zurich-1.YYY
</pre></div>


<h2 class="wp-block-heading" id="h-2-using-the-local-connection-to-connect-to-the-instance">2. Using the local connection to connect to the instance?</h2>



<p>At this point, you should see a login prompt, asking you to enter a username. I did have a public/private key used to connect to the default Ubuntu account of this server but no username/password. So, when I saw the login prompt, I thought I had a problem with the public/private key used by the local connection and I tried to change it to use the exact same used by my &#8220;ubuntu&#8221; OS account for this server, hoping for a seamless login. But of course, that didn&#8217;t work. I tried to alter the SSH command in a few ways to understand how this is supposed to work but no luck. The documentation contains this statement:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p></p>
<cite>In the Oracle Cloud Infrastructure Console, reboot the instance. You do not need to enter a username or password. If the instance is functional and the connection is active, the serial output appears in your console. If serial output does not appear in the console, the instance operating system is not booting.</cite></blockquote>



<p>Therefore, even if this note only talk about displaying the serial output in the console, I still tried to reboot the instance and see how it behaved. Of course, since the SSH connection to the instance was impossible, the reboot command took some time. OCI will wait up to 15 minutes to perform the power-off. The accumulation of all timeouts I assume. In any cases, once the instance reboots, you will see the shutdown and then the startup information. And that&#8217;s all that is indicated in the documentation… Because yes, it&#8217;s a documentation to have this output displayed on the prompt, not to recover the access to the system!</p>



<p>So, what to do then? Well, we are one step further, since we can see the startup, that means that we might be able to enter the Boot Menu (GRUB), and indeed, there seemed to be a lot of blogs/videos talking about that on google. I tried that, but without success, multiple times… After some time, I looked at google again and found the <em>Oracle Doc ID 2987985.1</em> and other notes/comments that appear to mention that it&#8217;s not possible for Ubuntu by default (might be dependent on some versions or something). In conclusion, we need to be able to login to the instance to change the GRUB settings to be able to open the GRUB to fix the issue to be able to login to the instance, nice infinite loop!</p>



<p>That&#8217;s not a viable solution. At that point, I had already spent an hour on this issue and still couldn&#8217;t see any utilities/features provided by OCI to easily get a local connection to the instance, for ubuntu.</p>



<h2 class="wp-block-heading" id="h-3-no-possible-ootb-let-s-do-it-the-old-way-then">3. No possible OOTB? Let&#8217;s do it the old way then</h2>



<p>Since all ports were suddenly closed on this instance, I strongly suspected a human error while trying to update the firewall rules. On OCI, Ubuntu instances comes with iptables by default, but you can add/enable ufw as well. However, it would still use iptables in the background… It can happen that, if someone flushes the iptables rules, all ports would then be closed (assuming ufw was configured to defaults to the DROP policy). Please note that unless you save the iptables rules, a simple reboot would allow you to revert to the old set of rules and therefore, have your system back online. To verify if that was indeed the root cause, I only had one solution left: attach the root partition of my faulty instance to another running instance so I can check what&#8217;s going on inside the configuration files.</p>



<p>Let&#8217;s start with this plan.</p>



<h3 class="wp-block-heading" id="h-3-1-shutdown-the-current-oci-instance-1">3.1. Shutdown the current OCI instance #1</h3>



<p>Just trigger a shutdown of the faulty OCI instance #1 and let it do its thing. As mentioned, it can take several minutes (up to 15 minutes) if it is waiting for some OS commands, like un-mounting disks. In this example, I will use an instance named &#8220;sbx-alf-ce&#8221; as #1:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db2253f6&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db2253f6" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="420" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_2-1024x420.png" alt="Stop an OCI instance" class="wp-image-30566" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_2-1024x420.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_2-300x123.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_2-768x315.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_2-1536x629.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_2-2048x839.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading" id="h-3-2-detach-the-root-partition-from-oci-instance-1">3.2. Detach the root partition from OCI instance #1</h3>



<p>On the faulty Instance details page, scroll down to the bottom and on the left side, select &#8220;Boot volume&#8221; (Compute &gt; Instances &gt; Instance details &gt; Boot volume). Then copy the &#8220;resource OCID&#8221;, which is the ID of the Boot volume. Mine looked like that: &#8220;ocid1.bootvolume.oc1.eu-zurich-1.ab5heljrrmrkc5e34behkrde5ce3k2flezhh3lsl2trkrs55svtmcos3ymya&#8221;</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db2259e9&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db2259e9" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="337" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_3-1024x337.png" alt="Detach the boot volume of an instance" class="wp-image-30571" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_3-1024x337.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_3-300x99.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_3-768x253.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_3-1536x505.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_3-2048x674.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>A few seconds after clicking on &#8220;Detach boot volume&#8221;, the State should switch to &#8220;Detached&#8221;.</p>



<h3 class="wp-block-heading" id="h-3-3-create-a-new-empty-oci-instance-2">3.3. Create a new/empty OCI instance #2</h3>



<p>For this example, I created a new instance &#8220;sbx2-alf-ce&#8221; as #2, still using our YaK. Once done, you can look at its details and make sure you can connect to it properly.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db225ff1&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db225ff1" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="450" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_4-1024x450.png" alt="View an instance details" class="wp-image-30572" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_4-1024x450.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_4-300x132.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_4-768x337.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_4-1536x675.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_4-2048x899.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading" id="h-3-4-attach-the-faulty-root-partition-as-a-simple-volume-to-the-newly-created-oci-instance-2">3.4. Attach the faulty root partition as a simple volume to the newly created OCI instance #2</h3>



<p>On the newly created Instance details page, scroll down to the bottom and on the left side, select &#8220;Attached block volumes&#8221; (Compute &gt; Instances &gt; Instance details &gt; Attached block volumes). In my case, there is already a 100Gb volume created and setup by the YaK for my Alfresco component, but in this case, I don&#8217;t really care about it since I will not use this OCI instance for anything else than just fixing my first one. Of course, I could have removed this, so it&#8217;s not created to begin with.</p>



<p>On this page, click on &#8220;Attach block volume&#8221;. Then you can either select the volume from the list, if you know which one to choose. Or you can just paste the &#8220;resource OCID&#8221; I asked you to copy in section &#8220;3.2.&#8221; above. Select the &#8220;Attachment type&#8221; as &#8220;Paravirtualized&#8221; and leave the &#8220;Access&#8221; to the default &#8220;Read/write&#8221;, then click on &#8220;Attach&#8221;.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db2265e6&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db2265e6" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="671" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_5-1024x671.png" alt="Attach the boot volume as a block volume of an OCI instance" class="wp-image-30573" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_5-1024x671.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_5-300x197.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_5-768x503.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_5-1536x1006.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_5-2048x1342.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>When it completes, you should then have the #1 Boot Volume attached as Block Volume of #2:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db226b26&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db226b26" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="315" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_6-1024x315.png" alt="List of block volumes of an instance" class="wp-image-30574" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_6-1024x315.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_6-300x92.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_6-768x236.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_6-1536x472.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_6-2048x630.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading" id="h-3-5-mount-the-disk-on-oci-instance-2">3.5. Mount the disk on OCI instance #2</h3>



<p>Now, we can connect through SSH to the OCI instance #2 and mount the #1 Boot Volume so we can access its content (again, here I&#8217;m using the YaK but you can connect to it as you prefer, as long as you have root access in the end):</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [1,8,25,31,32]; title: ; notranslate">
yak@6073e16b8a87:~$ ssh oci/sbx2-alf-ce
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-1038-oracle x86_64)
...
Last login: Mon Jan 29 13:15:41 2024 from xxx.xxx.xxx.xxx
ubuntu@sbx2-alf-ce:~$
ubuntu@sbx2-alf-ce:~$ sudo su -
root@sbx2-alf-ce:~$
root@sbx2-alf-ce:~$ lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                   7:0    0  55.7M  1 loop /snap/core18/2785
loop1                   7:1    0 111.9M  1 loop /snap/lxd/24322
loop2                   7:2    0  63.4M  1 loop /snap/core20/1974
loop3                   7:3    0  38.7M  1 loop /snap/oracle-cloud-agent/58
loop4                   7:4    0  53.3M  1 loop /snap/snapd/19457
sda                     8:0    0  46.6G  0 disk
├─sda1                  8:1    0  46.5G  0 part /
├─sda14                 8:14   0     4M  0 part
└─sda15                 8:15   0   106M  0 part /boot/efi
sdb                     8:16   0   100G  0 disk
├─data-optalfresco    253:0    0    20G  0 lvm  /opt/alfresco
├─data-etcoptalfresco 253:1    0    10G  0 lvm  /etc/opt/alfresco
├─data-varoptalfresco 253:2    0    30G  0 lvm  /var/opt/alfresco
└─data-varlogalfresco 253:3    0    20G  0 lvm  /var/log/alfresco
sdc                     8:32   0  46.6G  0 disk
├─sdc1                  8:33   0  46.5G  0 part
├─sdc14                 8:46   0     4M  0 part
└─sdc15                 8:47   0   106M  0 part
root@sbx2-alf-ce:~$
root@sbx2-alf-ce:~$ ### --&gt; Here it&#039;s sdc1 that needs to be mounted
root@sbx2-alf-ce:~$
root@sbx2-alf-ce:~$ mkdir /faulty_root_1
root@sbx2-alf-ce:~$ mount /dev/sdc1 /faulty_root_1
root@sbx2-alf-ce:~$
</pre></div>


<p>In case you don&#8217;t have an existing disk on your instance #2, then it would most probably be &#8220;sdb1&#8221; instead. To find it, just look at the &#8220;part&#8221; that isn&#8217;t &#8220;/&#8221; and that matches the size of the Boot volume we just attached.</p>



<h3 class="wp-block-heading" id="h-3-6-check-the-iptables-configuration-files-inside-the-mounted-disk-on-oci-instance-2-not-the-os-files">3.6. Check the iptables configuration files inside the mounted disk on OCI instance #2 (not the OS files)</h3>



<p>To check the iptables rules that have been saved, you can simply check for the files &#8220;<em>/etc/iptables/rules.v*</em>&#8220;. For the rules used on the OCI instance #1, the file would then be &#8220;<em>/faulty_root_1/etc/iptables/rules.v4</em>&#8220;:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [6,7,9,10,12]; title: ; notranslate">
root@sbx2-alf-ce:~$ cd /faulty_root_1
root@sbx2-alf-ce:/faulty_root_1$
root@sbx2-alf-ce:/faulty_root_1$ ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var
root@sbx2-alf-ce:/faulty_root_1$
root@sbx2-alf-ce:/faulty_root_1$ cat /faulty_root_1/etc/iptables/rules.v4
# Generated by iptables-save v1.8.7 on Mon Jan 29 07:34:58 2024
*filter
:INPUT DROP &#x5B;2:152]
:FORWARD DROP &#x5B;0:0]
:OUTPUT ACCEPT &#x5B;1:176]
:InstanceServices - &#x5B;0:0]
:ufw-after-forward - &#x5B;0:0]
:ufw-after-input - &#x5B;0:0]
...
...
:ufw-user-logging-output - &#x5B;0:0]
:ufw-user-output - &#x5B;0:0]
COMMIT
# Completed on Mon Jan 29 07:34:58 2024
root@sbx2-alf-ce:/faulty_root_1$
</pre></div>


<h3 class="wp-block-heading" id="h-3-7-if-iptables-was-indeed-the-issue-fix-it">3.7. If iptables was indeed the issue, fix it</h3>



<p>As you can see above, it&#8217;s definitively this issue: the default policy is DROP and there are absolutely no rules present. Therefore, iptables would just reject all incoming requests. A similar issue could happen if your root partition is 100% full, in which case you would need to do some cleanup in this step, like removing old logs for example.</p>



<p>To &#8220;fix&#8221; the iptables, you can just modify the &#8220;<em>rules.v4/6</em>&#8221; files. You can look at the instance #2 file for an example but the minimal thing to add would be to re-enable at least port 22. You should just copy the whole &#8220;<em>InstanceServices</em>&#8221; chain section from the current instance #2 (<em>/etc/iptables/rules.v4</em>) and put it into the instance #1 file (<em>/faulty_root_1/etc/iptables/rules.v4</em>). If you aren&#8217;t sure about what you are doing, you can also switch the default policy from &#8220;<em>DROP</em>&#8221; to &#8220;<em>ACCEPT</em>&#8221; in this file. Here is an example of possible configuration:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [4,5,7,8,9,10,11,12]; title: ; notranslate">
root@sbx2-alf-ce:/faulty_root_1$ cat /faulty_root_1/etc/iptables/rules.v4
# Generated by iptables-save v1.8.7 on Mon Jan 29 07:34:58 2024
*filter
:INPUT ACCEPT &#x5B;0:0]
:FORWARD ACCEPT &#x5B;0:0]
:OUTPUT ACCEPT &#x5B;463:49013]
:InstanceServices - &#x5B;0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp --sport 123 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -d 169.254.0.0/16 -j InstanceServices
-A InstanceServices -d 169.254.0.2/32 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
-A InstanceServices -d 169.254.2.0/24 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule&quot; -j ACCEPT
...
...
-A InstanceServices -d 169.254.0.0/16 -p tcp -m tcp -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule&quot; -j REJECT --reject-with tcp-reset
-A InstanceServices -d 169.254.0.0/16 -p udp -m udp -m comment --comment &quot;See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule&quot; -j REJECT --reject-with icmp-port-unreachable
:ufw-after-forward - &#x5B;0:0]
:ufw-after-input - &#x5B;0:0]
:ufw-after-logging-forward - &#x5B;0:0]
...
...
:ufw-user-logging-input - &#x5B;0:0]
:ufw-user-logging-output - &#x5B;0:0]
:ufw-user-output - &#x5B;0:0]
COMMIT
# Completed on Mon Jan 29 07:34:58 2024
root@sbx2-alf-ce:/faulty_root_1$
</pre></div>


<p>Please note that OCI will add a lot of stuff inside the &#8220;Chain InstanceServices&#8221;, for its internal management (c.f. the &#8220;Oracle-Provided Images&#8221; section of the OCI documentation, <a href="https://docs.oracle.com/en-us/iaas/Content/Compute/References/images.htm#image-firewall-rules" target="_blank" rel="noreferrer noopener">here</a>) and that&#8217;s also why it is recommended to not use UFW on OCI.</p>



<h3 class="wp-block-heading" id="h-3-8-un-mount-the-disk-and-detach-it-from-oci-instance-2">3.8. Un-mount the disk and detach it from OCI instance #2</h3>



<p>Once you are satisfied with the status of the needed files (whether it&#8217;s iptables or logs for disk full cases), then the next step would be to go back into the initial situation. For that, we first unmount it:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
root@sbx2-alf-ce:/faulty_root_1$ cd
root@sbx2-alf-ce:~$
root@sbx2-alf-ce:~$ umount /faulty_root_1
root@sbx2-alf-ce:~$
root@sbx2-alf-ce:~$ rmdir /faulty_root_1
root@sbx2-alf-ce:~$
</pre></div>


<p>And then we can detach it from the OCI instance #2:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db227504&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db227504" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="321" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_7-1024x321.png" alt="Detach a block volume from an instance" class="wp-image-30575" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_7-1024x321.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_7-300x94.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_7-768x241.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_7-1536x481.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_7-2048x641.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading" id="h-3-9-re-attach-the-root-partition-on-oci-instance-1-and-start-again">3.9. Re-attach the root partition on OCI instance #1 and start again</h3>



<p>The last step, if everything went well, is to re-attach the Boot volume to where it belonged at the beginning. So go back to the Instance details page of the OCI instance #1, scroll down to the bottom and on the left side, select &#8220;Boot volume&#8221; (Compute &gt; Instances &gt; Instance details &gt; Boot volume). You should still see in the &#8220;Detached&#8221; State. Just click on &#8220;Attach boot volume&#8221; to get it back in the &#8220;Attached&#8221; State:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69dc8db227a67&quot;}" data-wp-interactive="core/image" data-wp-key="69dc8db227a67" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1024" height="314" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_8-1024x314.png" alt="Re-attach the boot volume to an instance" class="wp-image-30576" srcset="https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_8-1024x314.png 1024w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_8-300x92.png 300w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_8-768x236.png 768w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_8-1536x471.png 1536w, https://www.dbi-services.com/blog/wp-content/uploads/sites/2/2024/01/blog_oci_8-2048x629.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>Once re-attached, you can start your OCI instance #1 again and you should now be able to login as you did before the issue started:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
yak@6073e16b8a87:~$ ssh oci/sbx-alf-ce
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-1038-oracle x86_64)
...
Last login: Mon Jan 29 07:25:22 2024 from xxx.xxx.xxx.xxx
ubuntu@sbx-alf-ce:~$
</pre></div>


<p>If you still have some issues, there was probably some errors done on the configuration files. You can restart the process again (shutdown #1, detach, attach on #2, etc…).</p>



<p>Note that it is also possible to script all that and use the OCI CLI (command line) instead. For that purpose, you will need the Instance #1 and #2 OCIDs as well as the Boot volume OCID. Then you can use commands such as:</p>



<ul class="wp-block-list">
<li>Detach from OCI Instance #1: <em>oci compute boot-volume-attachment detach &#8211;boot-volume-attachment-id ${instance_1_OCID}</em></li>



<li>Attach to OCI Instance #2: <em>oci compute volume-attachment attach &#8211;instance-id ${instance_2_OCID} &#8211;volume-id ${boot_volume_OCID} &#8211;type paravirtualized</em></li>
</ul>



<p></p>
<p>L’article <a href="https://www.dbi-services.com/blog/oci-recover-lost-ssh-access-to-an-ubuntu-instance/">OCI &#8211; Recover lost SSH access to an Ubuntu instance</a> est apparu en premier sur <a href="https://www.dbi-services.com/blog">dbi Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.dbi-services.com/blog/oci-recover-lost-ssh-access-to-an-ubuntu-instance/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)

Served from: www.dbi-services.com @ 2026-04-13 08:31:14 by W3 Total Cache
-->