<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>The Wombelix Post - Terraform</title><link href="https://dominik.wombacher.cc/" rel="alternate"/><link href="/feeds/tag_terraform.atom.xml" rel="self"/><id>https://dominik.wombacher.cc/</id><updated>2025-07-28T00:00:00+02:00</updated><entry><title>New release of sr.ht go lib and terraform provider to fix update repo bug</title><link href="https://dominik.wombacher.cc/posts/new-release-of-srht-go-lib-and-terraform-provider-to-fix-update-repo-bug.html" rel="alternate"/><published>2025-07-28T00:00:00+02:00</published><updated>2025-07-28T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2025-07-28:/posts/new-release-of-srht-go-lib-and-terraform-provider-to-fix-update-repo-bug.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2025 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I released new versions of &lt;a class="reference external" href="https://git.sr.ht/~wombelix/terraform-provider-sourcehut"&gt;terraform-provider-sourcehut&lt;/a&gt; (v0.2.1)
and the related Go library &lt;a class="reference external" href="https://git.sr.ht/~wombelix/sourcehut-go"&gt;sourcehut-go&lt;/a&gt; (v0.1.1).
This is a bugfix release to address an issue when updating  ... &lt;a class="read-more" href="/posts/new-release-of-srht-go-lib-and-terraform-provider-to-fix-update-repo-bug.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2025 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I released new versions of &lt;a class="reference external" href="https://git.sr.ht/~wombelix/terraform-provider-sourcehut"&gt;terraform-provider-sourcehut&lt;/a&gt; (v0.2.1)
and the related Go library &lt;a class="reference external" href="https://git.sr.ht/~wombelix/sourcehut-go"&gt;sourcehut-go&lt;/a&gt; (v0.1.1).
This is a bugfix release to address an issue when updating a repository description.&lt;/p&gt;
&lt;p&gt;End of last year, I published the &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/release-sourcehut-srht-opentofu-terraform-provider-and-go-library.html"&gt;initial version of the provider and library&lt;/a&gt;
and started using it for my &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/opentofu-based-management-of-my-git-repositories.html"&gt;OpenTofu based management of my git repositories&lt;/a&gt;.
When I tried to update the description of an existing repository, the provider failed with a very generic error:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Multiple API errors occured&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This wasn't very helpful, so I started to dig into the code to find the root cause.&lt;/p&gt;
&lt;p&gt;The issue was in the &lt;cite&gt;sourcehut-go&lt;/cite&gt; library itself. The error handling for multiple errors was just
returning a static string instead of the actual error details from the API.
I improved the error handling to be more specific:&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gd"&gt;--- a/errors.go&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/errors.go&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -4,6 +4,8 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;package sourcehut&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gi"&gt;+import &amp;quot;strings&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;// Ensure that the build fails if Error and Errors don't implement error.&lt;span class="pygments-w"&gt;
 &lt;/span&gt;var _, _ error = (*Error)(nil), (*Errors)(nil)&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -34,7 +36,18 &amp;#64;&amp;#64; type Errors []Error&lt;/span&gt;&lt;span class="pygments-w"&gt;

 &lt;/span&gt;// Error satisfies the error interface for Errors.&lt;span class="pygments-w"&gt;
 &lt;/span&gt;func (err Errors) Error() string {&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-       return &amp;quot;Multiple API errors occured&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       if len(err) == 0 {&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               return &amp;quot;[WARN] Errors.Error() triggered with err length 0&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       }&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       if len(err) == 1 {&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               return err[0].Error()&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       }&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       var details []string&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       for _, e := range err {&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               details = append(details, e.Reason)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       }&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       return strings.Join(details, &amp;quot;; &amp;quot;)&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;}&lt;span class="pygments-w"&gt;

 &lt;/span&gt;// StatusCode returns the HTTP status code of the request that unmarshaled this&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;With this change in place, the error message became much more useful:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;A repository with this name already exists.; validation failed&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This new error pointed me in the right direction. I checked the
&lt;a class="reference external" href="https://web.archive.org/web/20250207112955/https://man.sr.ht/git.sr.ht/api.md#repository-resource"&gt;git.sr.ht legacy API documentation&lt;/a&gt;
and found the problem. The API endpoint for updating a repository treats the &lt;cite&gt;name&lt;/cite&gt; field as optional.
If you provide a name that is different from the current one, it triggers a rename and a redirect.
If you provide the same name, it fails because a repository with that name already exists.&lt;/p&gt;
&lt;p&gt;To fix this, I changed the &lt;cite&gt;UpdateRepo&lt;/cite&gt; function to only include the &lt;cite&gt;name&lt;/cite&gt;
in the payload if it's actually different from the old name.&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gd"&gt;--- a/git/git.go&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/git/git.go&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -8,6 +8,7 &amp;#64;&amp;#64; package git&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;import (&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       &amp;quot;bytes&amp;quot;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       &amp;quot;encoding/json&amp;quot;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       &amp;quot;fmt&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       &amp;quot;io&amp;quot;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       &amp;quot;net/http&amp;quot;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       &amp;quot;net/url&amp;quot;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -152,15 +153,25 &amp;#64;&amp;#64; func (c *Client) NewRepo(name, description string, visibility RepoVisibility) (*&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;// If repo.Name differs from oldName, a redirect from the old name to the new&lt;span class="pygments-w"&gt;
 &lt;/span&gt;// name.&lt;span class="pygments-w"&gt;
 &lt;/span&gt;func (c *Client) UpdateRepo(oldName string, repo *Repo) error {&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-       jsonRepo, err := json.Marshal(struct {&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-               Name string `json:&amp;quot;name&amp;quot;`&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-               Desc string `json:&amp;quot;description&amp;quot;`&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-               Visi string `json:&amp;quot;visibility&amp;quot;`&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-       }{&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-               Name: repo.Name,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-               Desc: repo.Description,&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-               Visi: string(repo.Visibility),&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-       })&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       updateData := make(map[string]interface{})&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       // Only include name if it's different from oldName (for renaming)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       if repo.Name != &amp;quot;&amp;quot; &amp;amp;&amp;amp; repo.Name != oldName {&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               updateData[&amp;quot;name&amp;quot;] = repo.Name&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       }&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       // Always include description, allows empty as well&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       updateData[&amp;quot;description&amp;quot;] = repo.Description&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       if repo.Visibility != &amp;quot;&amp;quot; {&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               // Validate visibility value&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               if repo.Visibility != VisibilityPublic &amp;amp;&amp;amp; repo.Visibility != VisibilityUnlisted &amp;amp;&amp;amp; repo.Visibility != VisibilityPrivate {&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+                       return fmt.Errorf(&amp;quot;invalid visibility: %s (must be public, unlisted, or private)&amp;quot;, repo.Visibility)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               }&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+               updateData[&amp;quot;visibility&amp;quot;] = string(repo.Visibility)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       }&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+       jsonRepo, err := json.Marshal(updateData)&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;       if err != nil {&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I used the opportunity to refactor the code a bit and to add a value validation for the repo visibility.&lt;/p&gt;
&lt;p&gt;With these two fixes, updating a repository description with my sourcehut terraform provider now works as expected.&lt;/p&gt;
&lt;p&gt;The new versions are available in the &lt;a class="reference external" href="https://search.opentofu.org/provider/wombelix/sourcehut/latest"&gt;OpenTofu&lt;/a&gt;
and &lt;a class="reference external" href="https://registry.terraform.io/providers/wombelix/sourcehut/latest"&gt;Terraform&lt;/a&gt; registry.&lt;/p&gt;
&lt;p&gt;The OpenTofu Registry WebUI is often behind the API, even if it doesn't show v0.2.1 yet, it is already available.
You can verify it by running &lt;code&gt;curl https://registry.opentofu.org/v1/providers/wombelix/sourcehut/versions&lt;/code&gt;.&lt;/p&gt;
</content><category term="Code"/><category term="sourcehut"/><category term="sr.ht"/><category term="Go"/><category term="Golang"/><category term="OpenTofu"/><category term="Terraform"/><category term="OpenSource"/><category term="Bugfix"/></entry><entry><title>DNS management with OpenTofu and some AI assistance</title><link href="https://dominik.wombacher.cc/posts/dns-management-with-opentofu-and-some-ai-assistance.html" rel="alternate"/><published>2025-07-27T00:00:00+02:00</published><updated>2025-07-27T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2025-07-27:/posts/dns-management-with-opentofu-and-some-ai-assistance.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2025 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I migrated dozens of DNS records from manual to OpenTofu based management.
My DNS provider allows downloading zone files in BIND format, but other
information like record IDs needed  ... &lt;a class="read-more" href="/posts/dns-management-with-opentofu-and-some-ai-assistance.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2025 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I migrated dozens of DNS records from manual to OpenTofu based management.
My DNS provider allows downloading zone files in BIND format, but other
information like record IDs needed for OpenTofu imports are buried in
the HTML of their web interface.&lt;/p&gt;
&lt;p&gt;Manual migration would have been time-consuming and error-prone.
Perfect opportunity to test AI assistance. I'm not expecting magic, but
to handle the repetitive parsing while I focus on validation and logic.&lt;/p&gt;
&lt;p&gt;I used Google's Gemini Code Assistant for this experiment. Over the
past months I've worked with Amazon Q Developer, GitHub Copilot,
Cursor, and Roo Code with various models.&lt;/p&gt;
&lt;p&gt;The key was, and in my experience always is, to provide specific
context instead of vague requests. I had already built the OpenTofu
modules and project structure to manage Domains and DNS records months ago.
So, I knew exactly what I needed and how things should work. This allowed
me to give precise guidance to the assistant without relying on it to figure
out implementation details.&lt;/p&gt;
&lt;p&gt;I provided the AI with full context: existing record files, OpenTofu
module structure, and clear objectives. I essentially train the coding
assistant on the patterns and conventions of my existing codebase.
This doesn't mean hours of actual training, just a few well-crafted prompts.&lt;/p&gt;
&lt;p&gt;For tasks like this (processing large amounts of data that humans
can barely read, finding patterns, applying logic, and transforming
data into different formats) LLMs are naturally a good fit.&lt;/p&gt;
&lt;p&gt;For converting a BIND zone file, my instruction was:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
Here is the BIND zone file for mycloudoffice.de. I need you to create
a records_mycloudoffice_de.tf file. Please follow the syntax and naming
conventions you see in my existing records_wombacher_cc.tf file, and be
sure to ignore irrelevant records like SOA and RRSIG or CAA that are handled
in a different place and are not in scope now.

&lt;/pre&gt;
&lt;p&gt;Of course, I then pasted the complete BIND zone file content after
this instruction as well. By providing both raw data and a clear example of
desired output, the model understood the pattern, identified relevant
records, and produced properly formatted OpenTofu code. The &amp;quot;Magic&amp;quot; here
is that popular LLMs of course know what DNS records are and how BIND Zone
files are structured. So, they don't need handholding to understand and parse them.&lt;/p&gt;
&lt;p&gt;The next step was generating import commands. To get these resources
into my OpenTofu state without destroying and recreating them, I
needed &lt;code&gt;tofu import&lt;/code&gt; commands for each record. The unique IDs are
somewhere in the HTML code from my DNS provider's web interface.&lt;/p&gt;
&lt;p&gt;My prompt was:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
Now, I need you to generate the tofu import commands for the resources
you just created. Here is the raw HTML containing the record IDs. The
command format is &amp;quot;tofu import &amp;lt;resource_address&amp;gt; &amp;lt;domain&amp;gt;:&amp;lt;record_id&amp;gt;&amp;quot;.

&lt;/pre&gt;
&lt;p&gt;Again, I included the full HTML source after this instruction.
A while later, I had a complete list of shell commands ready to
execute. A task that would have involved manually matching dozens of
records to their IDs was done in seconds without errors.&lt;/p&gt;
&lt;p&gt;But this wasn't about blindly accepting AI responses. When we encountered
a URL record type specific to my DNS provider, the AI's first attempt
was based on its general knowledge of resource options. Since none of
my shared examples contained details for this specific URL type, it
made a reasonable but non-functional guess.&lt;/p&gt;
&lt;p&gt;I researched the provider's documentation and fed that back to the
model to get the right syntax. Even then, &lt;code&gt;tofu plan&lt;/code&gt; revealed
subtle drift that required my analysis and guidance to resolve.
But two short iterations later, we had a working solution.&lt;/p&gt;
&lt;p&gt;This collaboration - where AI handles repetitive tasks while I
provide direction and validation - is practical and effective. It's
not about replacing developers but freeing us from repetitive work so
we can focus on architecture and problem-solving.&lt;/p&gt;
&lt;p&gt;As models improve, we stay in the driver's seat, making decisions and
reviewing results. Work quality depends on clear instructions and
critical evaluation of results, not on expecting AI to solve everything
automatically.&lt;/p&gt;
&lt;p&gt;Personally, I never want to go back to do all this manually.
It isn't fun to read through hundreds of lines of BIND zone files
and HTML code to find the right IDs in a weirdly nested div tag.&lt;/p&gt;
&lt;p&gt;If you are interested in the outcome, some of what Gemini came up with
today made it into my
&lt;a class="reference external" href="https://git.sr.ht/~wombelix/domain-mgmt"&gt;OpenTofu based domain management&lt;/a&gt;.&lt;/p&gt;
</content><category term="Code"/><category term="AI"/><category term="GenAI"/><category term="DNS"/><category term="Terraform"/><category term="OpenTofu"/><category term="Automation"/><category term="Gemini"/></entry><entry><title>Release: sourcehut (sr.ht) OpenTofu / Terraform provider and Go library</title><link href="https://dominik.wombacher.cc/posts/release-sourcehut-srht-opentofu-terraform-provider-and-go-library.html" rel="alternate"/><published>2024-12-28T00:00:00+01:00</published><updated>2024-12-28T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2024-12-28:/posts/release-sourcehut-srht-opentofu-terraform-provider-and-go-library.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I released &lt;a class="reference external" href="https://git.sr.ht/~wombelix/terraform-provider-sourcehut"&gt;terraform-provider-sourcehut&lt;/a&gt;
and the related Go library &lt;a class="reference external" href="https://git.sr.ht/~wombelix/sourcehut-go"&gt;sourcehut-go&lt;/a&gt; into the wild.
The majority of code is licensed under &lt;code&gt;BSD-2-Clause&lt;/code&gt;.
The provider is available in the &lt;a class="reference external" href="https://search.opentofu.org/provider/wombelix/sourcehut/latest"&gt;OpenTofu&lt;/a&gt;
and &lt;a class="reference external" href="https://registry.terraform.io/providers/wombelix/sourcehut/latest"&gt;Terraform  ... &lt;/a&gt;&lt;a class="read-more" href="/posts/release-sourcehut-srht-opentofu-terraform-provider-and-go-library.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Today I released &lt;a class="reference external" href="https://git.sr.ht/~wombelix/terraform-provider-sourcehut"&gt;terraform-provider-sourcehut&lt;/a&gt;
and the related Go library &lt;a class="reference external" href="https://git.sr.ht/~wombelix/sourcehut-go"&gt;sourcehut-go&lt;/a&gt; into the wild.
The majority of code is licensed under &lt;code&gt;BSD-2-Clause&lt;/code&gt;.
The provider is available in the &lt;a class="reference external" href="https://search.opentofu.org/provider/wombelix/sourcehut/latest"&gt;OpenTofu&lt;/a&gt;
and &lt;a class="reference external" href="https://registry.terraform.io/providers/wombelix/sourcehut/latest"&gt;Terraform&lt;/a&gt; registry.
The online version of the Documentation can be found there as well.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sourcehut-go&lt;/code&gt; is a Go SDK for accessing the sourcehut legacy REST API with oauth personal access tokens
created via &lt;a class="reference external" href="https://meta.sr.ht/oauth"&gt;meta.sr.ht/oauth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Both projects are based on the work of &lt;a class="reference external" href="https://codeberg.org/SamWhited"&gt;Sam Whited&lt;/a&gt; who archived
the former code base on August 22, 2022.&lt;/p&gt;
&lt;p&gt;My motivation to improve and release it:
I plan to move my git repository management to OpenTofu.
Providers for my usual mirror targets GitHub, Gitlab and GitLab are available.
But there was no functional and published provider for sourcehut (sr.ht).
Which I use as my primary code hosting and build platform.&lt;/p&gt;
&lt;p&gt;Now that the library and provider are in a working state,
I can continue to work on the actual project :D&lt;/p&gt;
</content><category term="Code"/><category term="sourcehut"/><category term="sr.ht"/><category term="Go"/><category term="Golang"/><category term="OpenTofu"/><category term="Terraform"/><category term="OpenSource"/></entry><entry><title>Uyuni Test Environment with sumaform on local libvirt host (openSUSE Tumbleweed)</title><link href="https://dominik.wombacher.cc/posts/uyuni_test_environment_with_sumaform_on_local_libvirt_host_opensuse_tumbleweed.html" rel="alternate"/><published>2022-03-08T00:00:00+01:00</published><updated>2022-03-08T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-03-08:/posts/uyuni_test_environment_with_sumaform_on_local_libvirt_host_opensuse_tumbleweed.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;A convenient way to quickly setup a local Uyuni Instance inclusive Clients, either for Development or Testing, is sumaform.
It supports different backends and provides a ton of options, check  ... &lt;a class="read-more" href="/posts/uyuni_test_environment_with_sumaform_on_local_libvirt_host_opensuse_tumbleweed.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;A convenient way to quickly setup a local Uyuni Instance inclusive Clients, either for Development or Testing, is sumaform.
It supports different backends and provides a ton of options, check it out: &lt;a class="reference external" href="https://github.com/uyuni-project/sumaform"&gt;https://github.com/uyuni-project/sumaform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just want to run a Uyuni Server and a few Clients (openSUSE, EL, Debian) on my Laptop so I can verify reported bugs,
try some configs as well as deploy and test changes during development, without investing much time.&lt;/p&gt;
&lt;p&gt;Following a overview of the, in my case, relevant steps, examples of my config and some Ansible snippets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo zypper addrepo http://download.opensuse.org/repositories/systemsmanagement:/sumaform/openSUSE_Tumbleweed/systemsmanagement:sumaform.repo
sudo zypper install git-core
sudo zypper install --from systemsmanagement_sumaform terraform terraform-provider-libvirt
git clone https://github.com/uyuni-project/sumaform.git

&lt;/pre&gt;
&lt;p&gt;Follow the &lt;em&gt;First-time configuration (libvirt)&lt;/em&gt; instructions in the
&lt;a class="reference external" href="https://github.com/uyuni-project/sumaform/blob/2082e344b9cdde5c3befb11fc358d80eb50de346/backend_modules/libvirt/README.md"&gt;README&lt;/a&gt;,
but use the uyuni example file instead: &lt;code&gt;copy main.tf.uyuni.example to main.tf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Config &amp;amp; Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
vim main.tf

terraform init
terraform validate
terraform apply

&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;My terraform main.cf based on the uyuni example file&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code shell literal-block"&gt;
terraform&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&lt;span class="pygments-nv"&gt;required_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;1.0.10&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;required_providers&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
   &lt;/span&gt;&lt;span class="pygments-nv"&gt;libvirt&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
     &lt;/span&gt;&lt;span class="pygments-nv"&gt;version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;0.6.3&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
   &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;provider&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;libvirt&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;base&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;cc_username&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;cc_password&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;images&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;[&lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;centos7&amp;quot;&lt;/span&gt;,&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;opensuse153o&amp;quot;&lt;/span&gt;,&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;ubuntu1804&amp;quot;&lt;/span&gt;&lt;span class="pygments-o"&gt;]&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;base_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.base.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;product_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;uyuni-master&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;name&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;image&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;opensuse153o&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;use_os_released_updates&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_first_user&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;auto_accept&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;skip_changelog_import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;mgr_sync_autologin&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_sample_channel&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_sample_activation_key&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;create_sample_bootstrap_script&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;publish_private_ssl_key&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;false&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;java_debugging&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;provider_settings&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;memory&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;8192&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;vcpu&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;4&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;redhat-minion&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;base_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.base.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;product_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;uyuni-master&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;name&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;minion-centos7&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;image&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;centos7&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;server_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.server.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;provider_settings&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;memory&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;1024&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;auto_connect_to_master&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;module&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;debian-minion&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;base_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.base.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;product_version&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;uyuni-master&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;name&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;minion-ubuntu1804&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;image&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s2"&gt;&amp;quot;ubuntu1804&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;server_configuration&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;module.server.configuration&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;provider_settings&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nv"&gt;memory&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-m"&gt;1024&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nv"&gt;auto_connect_to_master&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nb"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-o"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ansible Snippets for the Setup steps&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Import systemsmanagement:/sumaform RPM Key&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;rpm_key&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;key&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;https://download.opensuse.org/repositories/systemsmanagement:/sumaform/openSUSE_Tumbleweed/repodata/repomd.xml.key&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;present&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Add systemsmanagement:/sumaform RPM Repository&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;community.general.zypper_repository&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;systemsmanagement_sumaform&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;description&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Using Terraform to create a SUSE Manager test environment (openSUSE_Tumbleweed)&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;repo&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;https://download.opensuse.org/repositories/systemsmanagement:/sumaform/openSUSE_Tumbleweed/&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;priority&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;90&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;present&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;ignore_errors&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Package Installation (Uyuni Development - sumaform)&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;community.general.zypper&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;terraform&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;terraform-provider-libvirt&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;git-core&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;allow_vendor_change&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;force_resolution&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;force&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;latest&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
</content><category term="Linux"/><category term="uyuni"/><category term="sumaform"/><category term="terraform"/><category term="libvirt"/><category term="openSUSE"/></entry></feed>