<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DevOps Pass AI</title>
    <description>The latest articles on DEV Community by DevOps Pass AI (@devopspass).</description>
    <link>https://dev.to/devopspass</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1377355%2F1579749d-5794-4bc1-ae39-f8a80915b108.png</url>
      <title>DEV Community: DevOps Pass AI</title>
      <link>https://dev.to/devopspass</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devopspass"/>
    <language>en</language>
    <item>
      <title>Making UI for Helm in ~100 lines of code</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Tue, 30 Jul 2024 14:55:19 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/making-ui-for-helm-in-100-lines-of-code-2nd4</link>
      <guid>https://dev.to/devopspass-ai/making-ui-for-helm-in-100-lines-of-code-2nd4</guid>
      <description>&lt;p&gt;Hey folks, pretty often I can hear from colleagues "We're using custom solution/API/tool for ..." Which usually means someone create some tool, but usually forgot to add any convenient interface except shell :D&lt;/p&gt;

&lt;p&gt;Let's try on example of Helm use DevOps Pass plugins feature and create UI for it.&lt;br&gt;
In the same way you can create UI for any API/CLI tool you have in your stack.&lt;/p&gt;
&lt;h2&gt;
  
  
  📝 Requirements
&lt;/h2&gt;

&lt;p&gt;What we want to achieve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List installed Helm releases in current Kubernetes context&lt;/li&gt;
&lt;li&gt;List and manage Helm repos&lt;/li&gt;
&lt;li&gt;List and install Helm chart from list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ok, so we need three doc's to list entities and few more actions for that docs. &lt;/p&gt;

&lt;p&gt;Lets go!&lt;/p&gt;
&lt;h2&gt;
  
  
  ⛑️ Add Helm App
&lt;/h2&gt;

&lt;p&gt;First of all let's add Helm into the list of DOP applications.&lt;/p&gt;

&lt;p&gt;Go to "DevOps Pass AI" application (add if not added from apps list) and click "Add App" action.&lt;/p&gt;

&lt;p&gt;Fill necessary fields. Dont forget about github repo name - &lt;code&gt;helm/helm&lt;/code&gt; - &lt;a href="https://github.com/helm/helm" rel="noopener noreferrer"&gt;https://github.com/helm/helm&lt;/a&gt;, this field will help to generate "Install Helm" action&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrgygrcghvv7fd4gx68i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrgygrcghvv7fd4gx68i.png" alt="Helm app" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click create and reload plugins (click on your avatar at the right top). After that you will be able to add it from applications list.&lt;/p&gt;
&lt;h2&gt;
  
  
  📦 Helm repos
&lt;/h2&gt;

&lt;p&gt;Now lets create doc types for Helm releases, Helm repos and Helm charts, use "Add document type" action from DOP app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwx8625t1xhp5e6sfoip5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwx8625t1xhp5e6sfoip5.png" alt="Doc type create" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will generate for you Python files list this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;yaml&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cdx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/general/error.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;```

&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;

```&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Run the command and capture the output
&lt;/span&gt;    &lt;span class="c1"&gt;#
&lt;/span&gt;    &lt;span class="c1"&gt;# output = subprocess.run(['docker', 'compose', 'ls', '--format', 'json'], text=True, check=True, capture_output=True)
&lt;/span&gt;    &lt;span class="c1"&gt;# # Parse the output to extract environment information
&lt;/span&gt;    &lt;span class="c1"&gt;# repos = json.loads(output.stdout)
&lt;/span&gt;
    &lt;span class="c1"&gt;# Kick API and return result
&lt;/span&gt;    &lt;span class="c1"&gt;#
&lt;/span&gt;    &lt;span class="c1"&gt;# url = f'https://some.url.com/'
&lt;/span&gt;    &lt;span class="c1"&gt;# token = cdx.settings.get('github.token')
&lt;/span&gt;    &lt;span class="c1"&gt;# headers = {
&lt;/span&gt;    &lt;span class="c1"&gt;#     'Authorization': f"Bearer {token}",
&lt;/span&gt;    &lt;span class="c1"&gt;# }
&lt;/span&gt;    &lt;span class="c1"&gt;# resp = requests.get(url, headers=headers)
&lt;/span&gt;    &lt;span class="c1"&gt;# if resp.status_code == 200:
&lt;/span&gt;    &lt;span class="c1"&gt;#     return resp.json()
&lt;/span&gt;    &lt;span class="c1"&gt;# else:
&lt;/span&gt;    &lt;span class="c1"&gt;#     return error(f"Something went wrong: {resp.content}")
&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not implemented!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is an example for HTTP API call or shell command run.&lt;/p&gt;

&lt;p&gt;First of all Helm has wonderful feature - output in JSON format, so we can use it to receive currently installed repos, releases and existing charts.&lt;/p&gt;

&lt;p&gt;Repos, simple-stupid, just return as-is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cdx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Run the command and capture the output
&lt;/span&gt;        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;helm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;list&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-o&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CalledProcessError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/general/error.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;FileNotFoundError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/general/error.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Can&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t find &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;helm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; in PATH, looks like its not installed, please install first&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Helm releases. Icon mappings used to make output a bit prettier and if helm name is one of predefined - add icon for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cdx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chart_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;icon_mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gitea&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps/gitea.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Extract the base image name from the full image name
&lt;/span&gt;    &lt;span class="n"&gt;chart_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chart_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;matching_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;icon_mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chart_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Use the mapping, or default to "unknown.png" if not found
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;icon_mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matching_keys&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;matching_keys&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apps/helm.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Run the command and capture the output
&lt;/span&gt;        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;helm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;list&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-o&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="c1"&gt;# Parse the output to extract environment information
&lt;/span&gt;        &lt;span class="n"&gt;releases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;get_icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;releases&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CalledProcessError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/general/error.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;FileNotFoundError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/general/error.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Can&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t find &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;helm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; in PATH, looks like its not installed, please install first&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets list available Helm charts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cdx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chart_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;icon_mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gitea&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps/gitea.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="c1"&gt;# ...
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Extract the base image name from the full image name
&lt;/span&gt;    &lt;span class="n"&gt;chart_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chart_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;matching_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;icon_mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chart_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Use the mapping, or default to "unknown.png" if not found
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;icon_mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matching_keys&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;matching_keys&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apps/helm.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Run the command and capture the output
&lt;/span&gt;        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;helm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;repo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-o&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="c1"&gt;# Parse the output to extract environment information
&lt;/span&gt;        &lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;get_icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CalledProcessError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/general/error.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;FileNotFoundError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ERROR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;icon&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets/icons/general/error.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Can&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t find &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;helm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; in PATH, looks like its not installed, please install first&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets create application action for repo adding:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3en2hn16pffedz8y7o2m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3en2hn16pffedz8y7o2m.png" alt="App action" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 Result
&lt;/h2&gt;

&lt;p&gt;As a result we getting UI where you can see Helm releases installed in current context, Helm repos and Helm charts available in that repos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnpnoe3h271zve3qp742.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnpnoe3h271zve3qp742.png" alt="Helm Charts" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next actions - add install, release test actions for charts/releases and that's it - &lt;a href="https://github.com/devopspass/plugins/tree/main/helm" rel="noopener noreferrer"&gt;https://github.com/devopspass/plugins/tree/main/helm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;helm_repo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refresh info&lt;/li&gt;
&lt;li&gt;Remove repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;helm_repo_chart&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Chart&lt;/li&gt;
&lt;li&gt;Open Chart Source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;helm_release&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test Release&lt;/li&gt;
&lt;li&gt;Remove Release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With just a few hundred of code lines you've created UI for Helm, when some companies even trying to sell solutions like that...&lt;/p&gt;

&lt;p&gt;You can do the same for any API/CLI you're using daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" alt="Give us a start, we’re kitties ;)" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this post, support us, download, try and give us feedback!&lt;/p&gt;

&lt;p&gt;Give us a star 🌟 on &lt;a href="https://github.com/devopspass/devopspass/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>DevOps Fun #2: how long command will sleep?</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Mon, 22 Jul 2024 12:36:14 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/devops-fun-2-how-long-command-will-sleep-4cd7</link>
      <guid>https://dev.to/devopspass-ai/devops-fun-2-how-long-command-will-sleep-4cd7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h6jFRIfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://static.wixstatic.com/media/09a6dd_8802ab34cd7d4e949bb312ebe6b26ec7%7Emv2.png/v1/fit/w_504%2Ch_284%2Cal_c%2Cq_80/file.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h6jFRIfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://static.wixstatic.com/media/09a6dd_8802ab34cd7d4e949bb312ebe6b26ec7%7Emv2.png/v1/fit/w_504%2Ch_284%2Cal_c%2Cq_80/file.png" alt="?" width="504" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In previous aticle: &lt;a href="https://dev.to/devopspass-ai/devops-fun-1-if-youre-cool-enough-to-watch-video-in-console-2apc"&gt;If you're cool enough to watch video in console?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently saw article on one LinedIn channel explaining Linux shell pipes and again saw the same mistake - 99% engineers doesn’t know how pipes actually works!&lt;/p&gt;

&lt;p&gt;Absolutely sure you will be “not absolutely sure” how long that command sleep:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;5 | &lt;span class="nb"&gt;sleep &lt;/span&gt;5 | &lt;span class="nb"&gt;sleep &lt;/span&gt;5 | &lt;span class="nb"&gt;sleep &lt;/span&gt;5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may “suspect” that it will be 20 seconds, but it’s not true.&lt;/p&gt;

&lt;p&gt;It’s surprising people, that ALL commands in pipe running simultaneously! And command will sleep 5 secs.&lt;/p&gt;

&lt;p&gt;You can check it with &lt;code&gt;ps -ef | grep slee[p]&lt;/code&gt; while sleep is running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Xp2zsjE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://static.wixstatic.com/media/09a6dd_dc9c2aa268ac482d925ab7a7c58e5c55%7Emv2.png/v1/fit/w_603%2Ch_287%2Cal_c%2Cq_80/file.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Xp2zsjE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://static.wixstatic.com/media/09a6dd_dc9c2aa268ac482d925ab7a7c58e5c55%7Emv2.png/v1/fit/w_603%2Ch_287%2Cal_c%2Cq_80/file.png" alt="terminal" width="603" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s the reason why you see intermediate result when grepping large file and not waiting for command to finish, in case of sequential run of commands in pipe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" alt="Give us a start, we’re kitties ;)" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this post, support us, download, try and give us feedback!&lt;/p&gt;

&lt;p&gt;Give us a star 🌟 on &lt;a href="https://github.com/devopspass/devopspass/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>devops</category>
      <category>beginners</category>
      <category>bash</category>
    </item>
    <item>
      <title>DevOps fun #1: if you're cool enough to watch video in console?</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Tue, 16 Jul 2024 08:53:38 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/devops-fun-1-if-youre-cool-enough-to-watch-video-in-console-2apc</link>
      <guid>https://dev.to/devopspass-ai/devops-fun-1-if-youre-cool-enough-to-watch-video-in-console-2apc</guid>
      <description>&lt;p&gt;Hey folks, its time for a good content!&lt;/p&gt;

&lt;p&gt;If you're cool enough to watch your favourite anime in console?&lt;/p&gt;

&lt;h2&gt;
  
  
  Story
&lt;/h2&gt;

&lt;p&gt;Ok, some story first. In 1997 (sic!) released first version of aa-lib, library which been allowing to display images In console for MS-DOS and Unix like systems. That day world has been changed!&lt;/p&gt;

&lt;p&gt;Actually not, but I have a feeling that Wachowski bro... (you know) saw aa-lib demo called bb, before thay started with Matrix:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FLlDt_4EGX4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you want to check it locally, on Ubuntu/Debian (if not use Docker):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install bb
bb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For MacOS you can build it from sources - &lt;a href="https://github.com/artyfarty/bb-osx" rel="noopener noreferrer"&gt;https://github.com/artyfarty/bb-osx&lt;/a&gt; or run Ubuntu in Docker and run command above, finally it all working in console!&lt;/p&gt;

&lt;p&gt;AA-project home could be found here - &lt;a href="https://aa-project.sourceforge.net/" rel="noopener noreferrer"&gt;https://aa-project.sourceforge.net/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to play video in console?!
&lt;/h2&gt;

&lt;p&gt;Back to Naruto...the best player in the world - &lt;u&gt;&lt;a href="http://www.mplayerhq.hu/design7/news.html" rel="noopener noreferrer"&gt;mplayer&lt;/a&gt;&lt;/u&gt;, has not very well known that days feature - do video output in different output destinations, for example console:&lt;/p&gt;

&lt;p&gt;What? CACA? AA, BB now CACA? Yes :D&lt;/p&gt;

&lt;p&gt;&lt;a href="http://caca.zoy.org/wiki/libcaca" rel="noopener noreferrer"&gt;libCACA&lt;/a&gt; is a next iteration of AA, because AA had no colors, group enthusiasts around 2010 used the same idea, but added console colors.&lt;/p&gt;

&lt;p&gt;CACA will help you to output video like on the first image of article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACA_GEOMETRY=200x70  mplayer naruto-shippuden_Ep1.mp4 -vo caca
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As small bonus, you can have a cool tool to make ASCII versions of your photos and images:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install CACA Utils
sudo apt install caca-utils

# decrease console font size with Ctrl+Mouse_Scroll
img2txt -W 300 favicon.512x512.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.wixstatic.com%2Fmedia%2F09a6dd_8f8fff4b56974c39b374c20d1ba17463~mv2.png%2Fv1%2Ffit%2Fw_610%2Ch_871%2Cal_c%2Cq_80%2Ffile.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.wixstatic.com%2Fmedia%2F09a6dd_8f8fff4b56974c39b374c20d1ba17463~mv2.png%2Fv1%2Ffit%2Fw_610%2Ch_871%2Cal_c%2Cq_80%2Ffile.png" alt="logo2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2A6cJukGznvBKbMYi8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2A6cJukGznvBKbMYi8.jpeg" alt="Give us a start, we’re kitties ;)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this post, support us, download, try and give us feedback!&lt;/p&gt;

&lt;p&gt;Give us a star 🌟 on &lt;a href="https://github.com/devopspass/devopspass/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>console</category>
      <category>webdev</category>
    </item>
    <item>
      <title>DevOps Pass AI plugins</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Tue, 09 Jul 2024 13:28:21 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/devops-pass-ai-plugins-4mm0</link>
      <guid>https://dev.to/devopspass-ai/devops-pass-ai-plugins-4mm0</guid>
      <description>&lt;p&gt;Right now DOP has bunch of plugins which simplifies your daily activities with DevOps stack and navigation in it.&lt;/p&gt;

&lt;p&gt;You can search in your entire stack in one app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4ypuorxx4nzs58dhs0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4ypuorxx4nzs58dhs0h.png" alt="Search docs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And make necessary actions with this entities just in a few clicks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmco2zkymak7rnowl694i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmco2zkymak7rnowl694i.png" alt="docs actions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ansible
&lt;/h2&gt;

&lt;p&gt;Install Ansible, Molecule and tools for various platforms via Docker without changing local file system.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ari84rg80m55luqn7ac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ari84rg80m55luqn7ac.png" alt="aws"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage AWS profiles, refresh credentials, swith defaults profiles in a few clicks.&lt;/li&gt;
&lt;li&gt;Import all your AWS profiles from LandingZone in a few clicks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Confluence
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9j025fx8kzqojq9qmmph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9j025fx8kzqojq9qmmph.png" alt="confluence"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search in Confluence like on your local! Fast and furious.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevopsPass AI
&lt;/h2&gt;

&lt;p&gt;Add new applications, documents, actions and many more.&lt;br&gt;
Plugins used for DOP extinsion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Manage Docker containers, images, Docker Compose stacks.&lt;/li&gt;
&lt;li&gt;Install, delete, stop and so on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Git
&lt;/h2&gt;

&lt;p&gt;Some common integrations for many git providers, like GitHub, GitLab, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Search you git repos and open them in IDE in a few clicks&lt;/li&gt;
&lt;li&gt;You can clone in into your workspace in one click&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Golang
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nothing special, just install Golang on your local&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Helm
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7v3onpumbkbhpuwitn9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7v3onpumbkbhpuwitn9.png" alt="helm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage Helm releases, repos and charts&lt;/li&gt;
&lt;li&gt;Install Helm and charts in a few clicks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Homebrew
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install HomeBrew...what else you need?!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Java
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Just configure Maven source...&lt;/li&gt;
&lt;li&gt;JABBA version manager is commming soon&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Jenkins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Generate Jenkinsfiles for various cases&lt;/li&gt;
&lt;li&gt;Install default Plugins set for your jenkins&lt;/li&gt;
&lt;li&gt;List pipelines and its status, available for you&lt;/li&gt;
&lt;li&gt;Fast navigation between jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Jira
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgs71ocvwjilkjvijrjcr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgs71ocvwjilkjvijrjcr.png" alt="jira"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just search JIRA stories FAST!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  k3s
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install K3s on your local and enjoy Kubernetes in Docker.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kubernetes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fck2wzs17lvowpymkehnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fck2wzs17lvowpymkehnp.png" alt="k8s"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage K8s/OSE contexts, switch between them&lt;/li&gt;
&lt;li&gt;Manage namespaces&lt;/li&gt;
&lt;li&gt;Use integration with your favourite K8s client&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  nodejs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Manage installed version of NodeJS&lt;/li&gt;
&lt;li&gt;Select default&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ollama
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install ollama locally&lt;/li&gt;
&lt;li&gt;Manage locally available LLMs models&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  openshift
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install CLI client in a few cliks, all other functions are in Kubernetes plugin ;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Python
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faj88bbz0pr5r7j0d27wa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faj88bbz0pr5r7j0d27wa.png" alt="python"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage installed Python's versions via Conda&lt;/li&gt;
&lt;li&gt;Manage environments, requirements.txt and pip&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sailpoint
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Just keep list of available applications by hand,&lt;/li&gt;
&lt;li&gt;List your current requests for Sailpoint access&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Servers
&lt;/h2&gt;

&lt;p&gt;Servers...list, SSH, RDP...what else?&lt;/p&gt;

&lt;h2&gt;
  
  
  systemd
&lt;/h2&gt;

&lt;p&gt;Pretty often but annoying thing - generate SystemD units and timers for your apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terraform
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgm9hp6qyniomwvd6rlai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgm9hp6qyniomwvd6rlai.png" alt="terraform"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Manage version of Terraform, Terragrunt and OpenTofu&lt;/p&gt;

&lt;h2&gt;
  
  
  Vault
&lt;/h2&gt;

&lt;p&gt;Keep list of secret engines and auth methods by hand&lt;br&gt;
Easy navigation to them&lt;/p&gt;

&lt;h2&gt;
  
  
  VSCode
&lt;/h2&gt;

&lt;p&gt;Install VSCode, just it.&lt;/p&gt;

&lt;h2&gt;
  
  
  WSL
&lt;/h2&gt;

&lt;p&gt;Manage WSL installations, distros and runtimes.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>automation</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to run Ansible on Windows?</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Wed, 12 Jun 2024 10:54:54 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/how-to-run-ansible-on-windows-1l9k</link>
      <guid>https://dev.to/devopspass-ai/how-to-run-ansible-on-windows-1l9k</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--boPamcmm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AkvRaNtWaLG6GBDW8lQNdeQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--boPamcmm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AkvRaNtWaLG6GBDW8lQNdeQ.png" alt="We’re trying to make DevOps simple-stupid" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you need consistant way to run Ansible on Mac, Linux and Windows you'll face a surprise! Ansible is not supported on Windows - &lt;a href="https://docs.ansible.com/ansible/latest/os_guide/windows_faq.html#can-ansible-run-on-windows"&gt;https://docs.ansible.com/ansible/latest/os_guide/windows_faq.html#can-ansible-run-on-windows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sad, right? But if you're doing tool like DevOps Pass, you need it.&lt;/p&gt;

&lt;p&gt;So I was inspired by OpenTofu's tenv and created my own Ansible Version Manager, which allows you to run Ansible from Windows host, like on Mac or Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Whats behind?
&lt;/h2&gt;

&lt;p&gt;It uses Docker under the hood and allowing you to run Ansible tools from your local without installation of Python (on Mac/Linux) and on Windows.&lt;/p&gt;

&lt;p&gt;It is running Docker container, pushing all your local environment variables related to Ansible, Molecule, SSH, AWS, Azure and GCP configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  MacOS / Linux
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux&lt;/span&gt;
curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://api.github.com/repos/devopspass/dop-avm/releases/latest | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"https.*linux_amd64"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/"//g'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; | &lt;span class="nb"&gt;tar &lt;/span&gt;xzvf - dop-avm
&lt;span class="c"&gt;# MacOS&lt;/span&gt;
curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://api.github.com/repos/devopspass/dop-avm/releases/latest | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"https.*darwin_amd64"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/"//g'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; | &lt;span class="nb"&gt;tar &lt;/span&gt;xzvf - dop-avm

&lt;span class="nb"&gt;sudo mv &lt;/span&gt;dop-avm /usr/local/bin/
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"cd /usr/local/bin/ &amp;amp;&amp;amp; dop-avm setup"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;

&lt;p&gt;Download latest binary for Windows - &lt;a href="https://github.com/devopspass/dop-avm/releases/"&gt;https://github.com/devopspass/dop-avm/releases/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar xzf dop-avm*.tar.gz
md %USERPROFILE%\bin
move dop-avm.exe %USERPROFILE%\bin\
setx PATH "%USERPROFILE%\bin;%PATH%"

cd %USERPROFILE%\bin\
dop-avm setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DevOps Pass AI
&lt;/h3&gt;

&lt;p&gt;In DOP you can add &lt;strong&gt;Ansible&lt;/strong&gt; app and run action &lt;strong&gt;Install Ansible Version Manager&lt;/strong&gt;, it will download and install &lt;code&gt;dop-avm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncpbgrgoq38t5s2z17vl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncpbgrgoq38t5s2z17vl.png" alt="Ansible Version manager install" width="800" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 How it works?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dop-avm&lt;/code&gt; copying own binary with different names, which will be used later by user:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ansible&lt;/li&gt;
&lt;li&gt;ansible-playbook&lt;/li&gt;
&lt;li&gt;ansible-galaxy&lt;/li&gt;
&lt;li&gt;ansible-vault&lt;/li&gt;
&lt;li&gt;ansible-doc&lt;/li&gt;
&lt;li&gt;ansible-config&lt;/li&gt;
&lt;li&gt;ansible-console&lt;/li&gt;
&lt;li&gt;ansible-inventory&lt;/li&gt;
&lt;li&gt;ansible-adhoc&lt;/li&gt;
&lt;li&gt;ansible-lint&lt;/li&gt;
&lt;li&gt;molecule&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you're running any of this command, it will run Docker container &lt;code&gt;devopspass/ansible:latest&lt;/code&gt; and binary inside (source Dockerfile in repo).&lt;/p&gt;

&lt;p&gt;AVM will pass environment variables from host machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ANSIBLE_*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MOLECULE_*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GALAXY_*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWS_*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus volumes (if exist):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.aws&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.azure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.ansible&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And services, like SSH-agent and Docker socket.&lt;br&gt;
As a result you can run Ansible on Windows, MacOS and Linux via Docker without installation of Python and Ansible on your local, especially it's useful for Windows where it's not possible to run Ansible at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐳 Use another Docker container
&lt;/h2&gt;

&lt;p&gt;Probably you may have Docker container built in your organization, which is used in pipelines or recommended for local, you can use it by specifying &lt;code&gt;DOP_AVM_IMAGE_NAME&lt;/code&gt; environment variable. Be sure that all necessary binaries, like &lt;code&gt;molecule&lt;/code&gt; are inside, when you're running it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" alt="Give us a start, we’re kitties ;)" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this post, support us, download, try and give us feedback!&lt;/p&gt;

&lt;p&gt;Give us a star 🌟 on &lt;a href="https://github.com/devopspass/devopspass/"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw"&gt;Slack&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ansible</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>What is DevOps…from business point of view?</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Wed, 15 May 2024 13:30:24 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/what-is-devopsfrom-business-point-of-view-3pmo</link>
      <guid>https://dev.to/devopspass-ai/what-is-devopsfrom-business-point-of-view-3pmo</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--boPamcmm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AkvRaNtWaLG6GBDW8lQNdeQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--boPamcmm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AkvRaNtWaLG6GBDW8lQNdeQ.png" alt="We’re trying to make DevOps simple-stupid" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you see “DevOps” in our application name, that means we have to explain that term properly and we’ll do, but from a bit different angle. Lets see what DevOps is from business perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common name
&lt;/h2&gt;

&lt;p&gt;First of all you should know, that DevOps have no clear definition. Yep.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Most often, DevOps is characterized by key principles: shared ownership, workflow automation, and rapid feedback.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And also, you’ve probably already heard “mantra”:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;DevOps is not a role.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can check great article on DevOpsKube website - &lt;a href="https://devopscube.com/what-is-devops-what-does-it-really-mean/"&gt;What is Devops? What Does it really mean?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want summary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;DevOps is a culture or a philosophy aiming to bridge the gap between the development and operations teams to improve productivity and collaboration by automating infrastructure, code deployments, and continuous monitoring of applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whats wrong with that defenition? It’s technical. And absolutely ignores business!&lt;/p&gt;

&lt;p&gt;Pretty often engineers forgetting that “all that IT” is not about IT, it’s about business. We’re forgetting that all that wonderful stuff we’re doing, its not “because we can”, its because some business, which doing money, need it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OavsfOT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A-nDN_Fqw5QsnPIC5TExLkQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OavsfOT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A-nDN_Fqw5QsnPIC5TExLkQ.jpeg" alt="Yeah…he don’t care" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Business don’t care
&lt;/h2&gt;

&lt;p&gt;It will confuse engineers if I would say that all that “automation”, “operations”, “development”, “monitoring” are not necessary from &lt;strong&gt;business&lt;/strong&gt; perspective of view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business DONT CARE about it&lt;/strong&gt;, because business is about selling tickets or making sport bets or selling financial services, etc. Its not about IT, at all.&lt;/p&gt;

&lt;p&gt;You heard or faced such a situations when some process in a company is all manual and/or require a lot of people to do it or takes too long? You feel that process could be automated and if will save a lot of man-hours, but no one want’s or plan to automate it. &lt;strong&gt;And its OK.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yep, you heard it right, its OK. Until its time to optimize costs or process slowness affects business needs, its ok. Business don’t value automation only because its automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is DevOps from business perspective?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Lets try to make definition of DevOps in non-technical way as much as possible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;*&lt;em&gt;DevOps *&lt;/em&gt;— is a service of development and adoption of tooling, which helps business to maintain software products on all stages of life-cycle in a self-service manner.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds not much simpler, right? Lets explain each word here.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps
&lt;/h2&gt;

&lt;p&gt;After series of large personal data leaks, business realized, that they have to spent more resources on security hardening, as a result DevOps turned into DevSecOps… Last few years new areas appearing, where “Ops” should be connected with something: DataOps, FinOps etc…&lt;/p&gt;

&lt;p&gt;So lets stop on DevOps term.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jEVVyZBl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Aq9deMmAUvs3JG9p8Av7aEQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jEVVyZBl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Aq9deMmAUvs3JG9p8Av7aEQ.jpeg" alt="Don’t show your automation to *luddites*" width="463" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Automation is not a goal&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pretty often, when people trying to define what DevOps is, they falling into ‘enumeration explanation’: “you should do CI/CD, configuration management, use Cloud Copmuting, Ifrastructure as a Code, endless-list-here”.&lt;/p&gt;

&lt;p&gt;As a result we have a mess in DevOps term definition… Not all projects need Cloud Computing (hello mainframes), when you’re saying “CD” you mean Continuous Delivery or Deployment (?), not all projects need infrastructure (hello Kubernetes ) and so on.&lt;/p&gt;

&lt;p&gt;In the middle of all of that lists stays &lt;strong&gt;AUTOMATION&lt;/strong&gt;. It requires special article about it, but yes folks, DevOps is not about automation, not each automation is done in DevOps way, not every DevOps activity could or worth to be automated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--70BUMZ6J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A_IMUNJgCp1TErgDc-k6E6A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--70BUMZ6J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2A_IMUNJgCp1TErgDc-k6E6A.png" alt="NOT as a Service, it IS a service!" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps is a service?!
&lt;/h2&gt;

&lt;p&gt;Yes. &lt;strong&gt;DevOps engineers (Platform Team, DevX, SRE, etc.) are providing service&lt;/strong&gt;, clients for that teams are entire company or software product team, which maintaining application. Or any other person who want to do Ops-related tasks, without knowledge in various “-Ops” areas.&lt;/p&gt;

&lt;p&gt;What’s confusing me in many DevOps departments, that people thinking “they doing job”, folks NO!, you are providing &lt;strong&gt;SERVICE&lt;/strong&gt;. You are serving to a business needs.&lt;/p&gt;

&lt;p&gt;That small twist in mind blocking many good engineers from being successfull in their career. Soft skills in DevOps became more valuable in many cases than technical ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does “development of tooling” mean?
&lt;/h2&gt;

&lt;p&gt;Tooling its set of simple user interfaces, which helps people to make complicated things related to software life-cycle, without deep knowledge in SRE/DevOps practicies (or other technical areas). Yes, tooling is about “hiding complexity” by simple UI. “Business like pictures”, not because its stupid, but because technical details are not about business.&lt;/p&gt;

&lt;p&gt;By other had this new tools creating new idioms for people who are not deep in technical details, but now can communicate and collaborate about it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zQtvwObI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ak73rnMLdAM7Qyn9e5b7ntQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zQtvwObI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ak73rnMLdAM7Qyn9e5b7ntQ.jpeg" alt="Not that one…" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does “adoption” mean?
&lt;/h2&gt;

&lt;p&gt;Usually we have company-wide DevOps tools which requires adoption on an product team level, for example we have Splunk for the application logs search or AppDynamics for apps monitoring and troubleshooting, but not all applications/teams using it, such tools have to be adopted first, teams trained to use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does “self-service” means?
&lt;/h2&gt;

&lt;p&gt;Self-service means, that person or team using your tooling own process from end to end. DevOps team still responsible for that tool, means it should work as expected, but how that tool used they don’t care. Usage is absolute responsibility of product team, if tool works correctly, all consequences is your problem.&lt;/p&gt;

&lt;p&gt;That twist in mind dramatically changes rules in collaboration between DevOps team and product team. Pretty often Ops teams suffering from situations when Ops have to do “all the magic” for developer and his issue will be fixed. Doesn’t matter if developer forgot to comment proxy usage or did not configured networking correctly for his server, if there is a tool which he can use to fix issue himself. “Sorry man, you own it!”&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Huh, it was a long text. Short summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;DevOps is a service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DevOps engineers (of all kinds) are serving to a business&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automation is not an end in itself&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Self-service is a key for a healthy communications between Dev’s and Ops’es&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What were not covered and require additional articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When you have to automate something, when not&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to determine if something done “in a DevOps way” or not&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DevOps from a solution became a problem. Why and How?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UEXMMzCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2592/0%2A6cJukGznvBKbMYi8.jpeg" alt="Give us a start, we’re kitties ;)" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this post, support us, download, try and give us feedback!&lt;/p&gt;

&lt;p&gt;Give us a star 🌟 on &lt;a href="https://github.com/devopspass/devopspass/"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw"&gt;Slack&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to import all AWS profiles from AWS LandingZone</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Thu, 02 May 2024 13:38:58 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/how-to-import-all-aws-profiles-from-aws-landingzone-5ba5</link>
      <guid>https://dev.to/devopspass-ai/how-to-import-all-aws-profiles-from-aws-landingzone-5ba5</guid>
      <description>&lt;p&gt;If your organization using multiple AWS accounts, you probably know URL’s like &lt;a href="https://d-XXXXXXX.awsapps.com/start/#/" rel="noopener noreferrer"&gt;https://d-XXX.awsapps.com/start/#/&lt;/a&gt; where you could login with your identity provider and and get credentials for AWS account you need.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F4484%2F1%2ARLRrOfI1J31UjdYwZ6mYvQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F4484%2F1%2ARLRrOfI1J31UjdYwZ6mYvQ.png" alt="Yeah…that’s Enterprise baby!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what if that account list is a bit long…what if each of 268 accounts has more than one role?! What if you want to switch between them or sync credentials for multiple? DevOps Pass AI tries to simplify it a bit for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Load AWS profiles from SSO
&lt;/h2&gt;

&lt;p&gt;First of all it allows you to import all that profiles to your &lt;code&gt;~/.aws/profiles&lt;/code&gt; file. If you wish it can sync all credentials for all profiles to &lt;code&gt;~/.aws/credentials&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F4364%2F1%2AOvey16St8Ik5ylNxcIRgRw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F4364%2F1%2AOvey16St8Ik5ylNxcIRgRw.png" alt="Sync AWS profiles from LandingZone"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All you need is paste your AWS LandingZone URL and click green button. It will open new window where you have to pass auth to LZ (via your corporate MS AD account, Okta, whatever). Once you logged in, script will grab all your accounts/roles and create profiles in &lt;code&gt;~/.aws/profiles&lt;/code&gt; and sync AWS credentials if requested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actions for AWS Profiles
&lt;/h2&gt;

&lt;p&gt;Ok, now you have profiles in place, you have list of them on “AWS Profiles” tab, what else?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2176%2F1%2Akqsk-_ZvXD9gLJwk6yEiIA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2176%2F1%2Akqsk-_ZvXD9gLJwk6yEiIA.png" alt="AWS Profile actions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can AWS Console for that ACCOUNT-ROLE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refresh AWS Credentials in &lt;code&gt;~/.aws/credentials&lt;/code&gt; file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make current account default and put its credentials to “[default]” account in &lt;code&gt;~/.aws/credentials&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refresh credentials will do almost the same action like for all accounts, but using cached credentials, if credentials doesnt work it will ask you to login to AWS LandingZone again.&lt;/p&gt;

&lt;p&gt;Thats it! I hope it was useful, leave a comment!&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2AKiuyOybuJ0EpFwt8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2AKiuyOybuJ0EpFwt8.jpeg" alt="Rate Us"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give us a start, we’re kitties 🐱🐯&lt;/p&gt;

&lt;p&gt;Give us a star 🌟 on &lt;a href="https://github.com/devopspass/devopspass/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Workshop: make your first AI app in a few clicks with Python+Ollama+llama3</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Tue, 23 Apr 2024 06:52:55 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/workshop-make-your-first-ai-app-in-a-few-clicks-with-pythonollamallama3-31ib</link>
      <guid>https://dev.to/devopspass-ai/workshop-make-your-first-ai-app-in-a-few-clicks-with-pythonollamallama3-31ib</guid>
      <description>&lt;p&gt;Hey there, you probably heard that we’re living in AI era, so good time to play with it on your local. &lt;/p&gt;

&lt;p&gt;DevOps Pass AI has pretty good integration with Ollama, so you can install Ollama, pull necessary model (fresh llama3 in our case) and make some app to play with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Ollama and pulling image
&lt;/h2&gt;

&lt;p&gt;First of all you have to add Ollama app in DevOps Pass AI:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2606%2F1%2AwGpjVVT_G6o-XBpUbho8_g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2606%2F1%2AwGpjVVT_G6o-XBpUbho8_g.png" alt="Ollama integration app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you have to click “Install Ollama” in right left panel of application actions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2116%2F1%2ACAy_YvW9yWjAeJk30FkQyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2116%2F1%2ACAy_YvW9yWjAeJk30FkQyw.png" alt="Install Ollama action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that you can refresh list of docs below and switch to “Ollama remote models”, find there “llama3”, most fresh LLAMA model from Facebook and pull it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F4676%2F1%2Ae8iAp-EQ0p68w70Prg71Wg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F4676%2F1%2Ae8iAp-EQ0p68w70Prg71Wg.png" alt="Pull llama3 model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pull will require a bit of time, as model size is about 4.7Gb:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3928%2F1%2A8uoUH0jsc0SCUPSpVUTPTQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3928%2F1%2A8uoUH0jsc0SCUPSpVUTPTQ.png" alt="Laama3 model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, now you’re ready to play with LLM models, lets write some app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Ollama endpoint
&lt;/h2&gt;

&lt;p&gt;Before you write anything, dont forget to start Ollama to make its API endpoint available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3944%2F1%2AOXwcwn-bFGHIpPX4KtE6cg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3944%2F1%2AOXwcwn-bFGHIpPX4KtE6cg.png" alt="ollama serve"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep that console running while you’re playing with LLM’s&lt;/p&gt;

&lt;h2&gt;
  
  
  Create new Python env for ollama
&lt;/h2&gt;

&lt;p&gt;Lets keep our system Python clean and create new Conda env, for that you have to add Python app in DevOps Pass AI and click “Create Conda environment” action in right actions pane:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3208%2F1%2AbCdGIhKlakRMjiyV5Hs8-A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3208%2F1%2AbCdGIhKlakRMjiyV5Hs8-A.png" alt="Create Conda env"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Call environment “ollama” and specify following requirements.txt&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama==0.1.8
notebook==7.1.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After that you have to activate Conda Shell (action in right pane, should be run only once), now you’re ready for app development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple app DevOps helper
&lt;/h2&gt;

&lt;p&gt;Lets write really simple script, which will receive prompt and return code.&lt;/p&gt;

&lt;p&gt;We can use it for example to generate simple BASH scripts or Ansible playbooks or whatever. Create file app1.py:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;llama3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Youre DevOps assistant tool, return only code and explain only if asked&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can activate conda env and run script, lets say we want to create new plugin for DevOps Pass AI, which will list Pods in Kubernetes current context and namespace:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Activate Conda env ollama
micromamba activate ollama

# Run app
python app1.py "generate python function list() to list Kubernetes pods, return list of dicts, with name, status and age."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Not ideal, but could be good starting point!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3900%2F1%2APVPwM8q3hUizU10WApH7Gg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F3900%2F1%2APVPwM8q3hUizU10WApH7Gg.png" alt="List Kubernetes Pods function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  App two: Chat
&lt;/h2&gt;

&lt;p&gt;Ok, first example is nice, but doesnt support history, its one-shot script.&lt;/p&gt;

&lt;p&gt;Lets improve it, we’ll write script which will start chat by name (lets say JIRA story id or any other), will keep history for context and you can return to chat at any time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Init Ollama:
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="c1"&gt;# Message function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Youre DevOps assistant tool, return only code and explain only if asked&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;llama3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Check for arguments
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ERROR: Specify chat name as argument: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; CHAT_NAME&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Main loop
&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can start chat for a new story:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2360%2F1%2AVzJcpRX8afu1fg_3SzMnsQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2360%2F1%2AVzJcpRX8afu1fg_3SzMnsQ.png" alt="Ollama chat"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can interrupt it with Ctrl+C and start chat again with the same argument “STORY-1”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2A6mGtvACGksxDSApx.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2A6mGtvACGksxDSApx.jpeg" alt="Give us a start, we’re kitties ;)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give us a start on &lt;a href="https://github.com/devopspass/devopspass/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Managing versions of OpenTofu, Terraform and TerraGrunt with tenv and DOP</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Mon, 22 Apr 2024 08:53:06 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/managing-versions-of-opentofu-terraform-and-terragrunt-with-tenv-and-dop-58gc</link>
      <guid>https://dev.to/devopspass-ai/managing-versions-of-opentofu-terraform-and-terragrunt-with-tenv-and-dop-58gc</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2560%2F1%2A5TUiOqOBLeWw0P6mPV_-QQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2560%2F1%2A5TUiOqOBLeWw0P6mPV_-QQ.png" alt="DevOps Pass AI and Terraform, Terragrunt, Tofu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey folks, its DevOps Pass AI again, and today we’ll tell you about new plugin released last week, to manage Terraform, Terragrunt and Tofu versions on your local.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not TFEnv?
&lt;/h2&gt;

&lt;p&gt;First of all lets explain why not tfenv — &lt;a href="https://github.com/tfutils/tfenv" rel="noopener noreferrer"&gt;https://github.com/tfutils/tfenv&lt;/a&gt;, which many of you mb already uses for Terraform versions management.&lt;/p&gt;

&lt;p&gt;There is multiple reasons: first of all it doesnt support Windows and means not universal for all platforms and second one it doesnt support OpenTofu, which is weird if not say stupid…&lt;/p&gt;

&lt;h2&gt;
  
  
  What is tenv
&lt;/h2&gt;

&lt;p&gt;tenv (&lt;a href="https://github.com/tofuutils/tenv" rel="noopener noreferrer"&gt;https://github.com/tofuutils/tenv&lt;/a&gt;) is a part of OpenTofu utils, which allowing you to manage installed versions of Terraform, Tofu and Terragrunt. Also it supports Linux, MacOS and Windows in the same way and has bunch of packages for different platforms and distros.&lt;/p&gt;

&lt;p&gt;And we did pretty nice integartion with DevOps Pass AI which allowing you to install tenv and manage tools from UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F6112%2F1%2AxZ4Cy0i-MhZQTgZxD6oPwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F6112%2F1%2AxZ4Cy0i-MhZQTgZxD6oPwg.png" alt="tenv integration in DevOps Pass AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After adding Terraform app in DOP, you can install “tenv” and manage tools, make some version active or remove it.&lt;/p&gt;

&lt;p&gt;TBH, that’s it, we did it simple for you ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Us, Contact Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2AYe31dYREmH_hWsOp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2592%2F0%2AYe31dYREmH_hWsOp.jpeg" alt="Support us"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give us a start on &lt;a href="https://github.com/devopspass/devopspass/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or join our community on &lt;a href="https://join.slack.com/t/devops-pass-ai/shared_invite/zt-2gyn62v9f-5ORKktUINe43qJx7HtKFcw" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>terraform</category>
      <category>webdev</category>
    </item>
    <item>
      <title>K3s: smallest K8s on your local</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Tue, 16 Apr 2024 08:32:01 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/k3s-smallest-k8s-on-your-local-42ae</link>
      <guid>https://dev.to/devopspass-ai/k3s-smallest-k8s-on-your-local-42ae</guid>
      <description>&lt;p&gt;Have you ever needed to play with Kubernetes on your local?&lt;br&gt;
For K8s apps development or to test your changes in Helm chart or just for fun?&lt;/p&gt;

&lt;p&gt;Recommended way for local Kubernetes is Minikube, but peronally I dont like it and let me explain why K3s + autok3s + K3d is your choise.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why not Minikube
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cld1tloq6juu4csbxff.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cld1tloq6juu4csbxff.jpg" alt="Your local with Minikube" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Minikube, in the same way as many other local Kubernetes providers is annoying me in one way - it makes your laptop/PC dirty. Creates some sophisticated networking configurations, creates SystemD units, doing some unknown changes on local filesystem, install/update some tools you dont wanted to and so on.&lt;/p&gt;

&lt;p&gt;My solution - use K3s with K3d provider, which will setup Kubernetes in your Docker and change nothing on your local. You can create multi node cluster and remove it next minute. And NOTHING will be changed on your local!&lt;/p&gt;
&lt;h2&gt;
  
  
  How to
&lt;/h2&gt;

&lt;p&gt;If you prepere video &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8U8c2R3WeTA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If not lets move step by step.&lt;/p&gt;

&lt;p&gt;First of all you have to add Docker and K3s applications in DevOps Pass:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52tkppdp4i1w02cninor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52tkppdp4i1w02cninor.png" alt="Docker and K3s applications" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can install Docker from DOP and move on with K3s.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tf3qqfm9hado92ev9qx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tf3qqfm9hado92ev9qx.png" alt="K3s app actions" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;K3s app providing following actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install autoK3s&lt;/strong&gt; - start autok3s tool in your Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup k3d cluster&lt;/strong&gt; - Setup local Kubernetes in Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open autoK3s in Browser&lt;/strong&gt; - open autok3s in your browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;autok3s&lt;/code&gt; is a tool, developed by Rancher, which allowing you to install K3s anywhere, currently supported AWS, Docker, GCP, etc. - &lt;a href="https://github.com/cnrancher/autok3s"&gt;https://github.com/cnrancher/autok3s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;k3d&lt;/code&gt; is one of providers k3s can use, it setups Kubernetes cluster in your local Docker and you even can specify amount of nodes you want to run.&lt;/p&gt;

&lt;p&gt;So install autok3s first, then click "Setup k3d cluster", wait until it appear "Running" in clusters list:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0an98kas7irzrbgtgm2t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0an98kas7irzrbgtgm2t.png" alt="k3s clusters list" width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And done! You have Kubernetes cluster installed locally.&lt;/p&gt;

&lt;p&gt;You can swithc to Kubernetes app and check if context exists and installed namespaces list:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy0mwuin4fhw9fgwq5u6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy0mwuin4fhw9fgwq5u6.png" alt="Kubernetes contexts" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iy3kz808vrddhdiv6by.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0iy3kz808vrddhdiv6by.png" alt="Kubernetes namespaces" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MacOS, as usual...
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9umab886ai095tyicvw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9umab886ai095tyicvw.jpg" alt="MacOS" width="300" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As usual for MacOS there is one exception... Alike Windows or Linux you can not access Docker containers from local network, you have to install additional Brew package - &lt;a href="https://github.com/chipmk/docker-mac-net-connect"&gt;https://github.com/chipmk/docker-mac-net-connect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will allow you to connect your containers and K3s services/ingress'es from host machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install via Homebrew
$ brew install chipmk/tap/docker-mac-net-connect

# Run the service and register it to launch at boot
$ sudo brew services start chipmk/tap/docker-mac-net-connect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thats it, now you can forget about it.&lt;br&gt;
If you're curious what is it: its Brew service written in Go, which refreshing MacOS routing table, to allow you access Docker networks from host machine. More details you can find in repo readme.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install Jenkins via Helm
&lt;/h2&gt;

&lt;p&gt;Go to Helm app in DOP, click "Addd Helm repo" action in right top and add Bitnami Helm repo - &lt;a href="https://charts.bitnami.com/bitnami"&gt;https://charts.bitnami.com/bitnami&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogr3jd54wb8538c4hbaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogr3jd54wb8538c4hbaw.png" alt="Add Bitnami Helm repo" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then on "Helm Repo charts" tab find Jenkins chart:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsc8kzjsa3m2c11zji27j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsc8kzjsa3m2c11zji27j.png" alt="Find Jenkins chart" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now "Actions -&amp;gt; Install Chaart", it will require some values, value should be in JSON format, i.e. if its string &lt;code&gt;"..."&lt;/code&gt; if number &lt;code&gt;8083&lt;/code&gt; if boolean &lt;code&gt;true&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service.ports.https=8443
service.ports.http=8083
jenkinsUser="user"
jenkinsPassword="12345678"
agent.enabled=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click "Install" and wait for Jenkins pod to be ready (you can open "default" namespace in K9s in Kubernetes app or just wait for a few mins):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy99z1qghc27xblpozi59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy99z1qghc27xblpozi59.png" alt="K9s Jenkins pod" width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now copy this to your console to get Jenkins URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export SERVICE_IP=$(kubectl get svc --namespace default jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
echo "Jenkins URL: http://$SERVICE_IP:8083/"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Login to Jenkins and voila!&lt;/p&gt;

&lt;h2&gt;
  
  
  Removing K3s cluster
&lt;/h2&gt;

&lt;p&gt;At the moment you dont need K8s cluster on your local, you can drop it. Navigate to K3s application, find cluster in the list at the bottom and find "Destroy" action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4j9zp4wws1ml33abw4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4j9zp4wws1ml33abw4v.png" alt="Destroy k3s cluster" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thats it! Not even a hint of K8s on your local, you can forget about it till you'll need it again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I hope that workshop was interresting for you we've created K8s cluster on your local, installed some Helm charts and dropped it.&lt;/p&gt;

&lt;p&gt;No more broken semi-configured networking rules or services, no more waste on your local.&lt;/p&gt;

&lt;p&gt;If you likes this article, give us 👍 and start on GitHub 🤩 - &lt;a href="https://github.com/devopspass/devopspass/"&gt;https://github.com/devopspass/devopspass/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Pushing your app in Docker in a few clicks</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Tue, 09 Apr 2024 16:44:20 +0000</pubDate>
      <link>https://dev.to/devopspass-ai/pushing-your-app-in-docker-in-a-few-clicks-4c9b</link>
      <guid>https://dev.to/devopspass-ai/pushing-your-app-in-docker-in-a-few-clicks-4c9b</guid>
      <description>&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/NCzJixmzoK8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by Step
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.devopspass-ai.com/"&gt;https://www.devopspass-ai.com/&lt;/a&gt; - Video version in the end of article.&lt;/p&gt;

&lt;p&gt;Imagine you're developing some application and its good time to make it public or at least test on some more production-similar environment.&lt;/p&gt;

&lt;p&gt;Or for a local development you need some infra, like Redis, MongoDB, MySQL or Postgres. Nice candidate for that is to spin it up with Docker and Docker compose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add Docker app
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1wfyf7k2gpnuhkl6v0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1wfyf7k2gpnuhkl6v0y.png" alt="Docker app" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To start with Docker, add Docker application you switch to Docker in left side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiyiatyrad8e9xqvpsokk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiyiatyrad8e9xqvpsokk.png" alt="Docker integrations" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the bottom you can see three tabs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker containers&lt;/strong&gt;, to manage running/stopped containers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker images&lt;/strong&gt;, to manage local images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker compose&lt;/strong&gt;, to see running Docker Compose stacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the Right you can see Docker app actions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecxzmnn1vx1w79efu6vh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecxzmnn1vx1w79efu6vh.png" alt="Docker app actions" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install Docker&lt;/strong&gt;, to install Docker on MacOS, Linux, Windows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Dockerfile&lt;/strong&gt;, to generate Dockerfile for application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Docker container&lt;/strong&gt;, just an action to start Docker container from DOP UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate compose.yml&lt;/strong&gt;, action to generate Docker Compose config file&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Generating Dockerfile
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2a07q7b1dnzpgdo5kkgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2a07q7b1dnzpgdo5kkgw.png" alt="Generate Dockerfile action" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Action &lt;strong&gt;Generate Dockerfile&lt;/strong&gt; is used to generate &lt;code&gt;Dockerfile&lt;/code&gt; for your application, we support various languages, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Python Django&lt;/li&gt;
&lt;li&gt;Python Flask&lt;/li&gt;
&lt;li&gt;Golang&lt;/li&gt;
&lt;li&gt;Java Spring Boot&lt;/li&gt;
&lt;li&gt;Java Quarkus&lt;/li&gt;
&lt;li&gt;NodeJS&lt;/li&gt;
&lt;li&gt;NodeJS node-gyp&lt;/li&gt;
&lt;li&gt;NodeJS NestJS&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;React pnpm&lt;/li&gt;
&lt;li&gt;ASP.NET Core&lt;/li&gt;
&lt;li&gt;ASP.NET Core Alpine&lt;/li&gt;
&lt;li&gt;Ruby RoR&lt;/li&gt;
&lt;li&gt;Ruby RoR with assets&lt;/li&gt;
&lt;li&gt;Rust root&lt;/li&gt;
&lt;li&gt;Rust non-priviledged&lt;/li&gt;
&lt;li&gt;Dart&lt;/li&gt;
&lt;li&gt;R Studio MSSQL&lt;/li&gt;
&lt;li&gt;R Studio MySQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docker Compose
&lt;/h2&gt;

&lt;p&gt;Once you have &lt;code&gt;Dockerfile&lt;/code&gt; for app, you can create Docker Compose config:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxayztwsopj1k58gbsul3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxayztwsopj1k58gbsul3.png" alt="Generate Docker Compose config" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Action asking if you need infra, like nginx, MySQL, MongoDB, PostgreSQL, Redis. For all backeds it will create volume, so you can be sure that your data will be in place after restart of laptop/PC.&lt;/p&gt;

&lt;p&gt;After that you can spin stack up and play with it...&lt;/p&gt;

</description>
      <category>devopspass</category>
      <category>devops</category>
      <category>docker</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Swiss Army Knife for Kubernetes</title>
      <dc:creator>DevOps Pass AI</dc:creator>
      <pubDate>Wed, 03 Apr 2024 09:53:10 +0000</pubDate>
      <link>https://dev.to/devopspass/swiss-army-knife-for-kubernetes-3feg</link>
      <guid>https://dev.to/devopspass/swiss-army-knife-for-kubernetes-3feg</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4esmt7qdt9rbl8mw3m7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4esmt7qdt9rbl8mw3m7g.png" alt="Image description" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Can you install all necessary Kubernetes tools in one click? How you switching between contexts and namespaces?&lt;br&gt;
How you'll find README and value of Helm chart?&lt;br&gt;
How would you test if Helm release is healthy?&lt;/p&gt;

&lt;p&gt;And main question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How you will install Kubernetes locally?!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DevOps Pass AI helping you to answer all that questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install kubectl, k9s, k3s, Helm in one click&lt;/li&gt;
&lt;li&gt;Manage namespaces and contexts in OpenShift and K8s distros&lt;/li&gt;
&lt;li&gt;Install smallest Kubernetes on your local in one click (and destroy if you dont need it anymore)&lt;/li&gt;
&lt;li&gt;Manage Helm releases, charts and repos with only your mouse!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;p&gt;Intro to Kubernetes toolset in video tutorial&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fRGozFnP-Yk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>helm</category>
      <category>k9s</category>
    </item>
  </channel>
</rss>
