{"id":3906,"date":"2024-08-19T07:00:00","date_gmt":"2024-08-19T05:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=3906"},"modified":"2024-08-12T23:51:12","modified_gmt":"2024-08-12T21:51:12","slug":"meine-zweite-ansible-collection","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/meine-zweite-ansible-collection\/","title":{"rendered":"Meine zweite Ansible Collection"},"content":{"rendered":"\n<p>Dies ist ein Erfahrungsbericht zur Migration meiner <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-2-die-ansible-rolle\/\" data-type=\"post\" data-id=\"2996\">Ansible-Rolle \u201eNextcloud im Container\u201c<\/a> in eine Ansible Collection. Er umfasst die Migration der bestehenden Rolle und die Erg\u00e4nzung der neuen Collection um eine weitere Rolle, welche sich um die Aufgaben Backup und Restore k\u00fcmmert.<\/p>\n\n\n\n<p>Wer es ganz eilig hat, kann direkt zur <a href=\"#zusammenfassung\">Zusammenfassung<\/a> springen. Allen anderen w\u00fcnsche ich viel Spa\u00df bei der Lekt\u00fcre.<\/p>\n\n\n\n<p>F\u00fcr grundlegende Informationen zu Ansible Collections siehe:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.redhat.com\/de\/technologies\/management\/ansible\/content-collections\">Ansible Content Collections<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections_guide\/index.html\">Using Ansible collections<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_collections.html\">Developing collections<\/a><\/li>\n<\/ul>\n\n\n\n<p><em>Randnotiz: <\/em>Dass ihr zu meiner ersten Ansible Collection hier im Blog nicht f\u00fcndig werdet, liegt darin begr\u00fcndet, dass meine Arbeit daran eingeschlafen ist.<\/p>\n\n\n\n<p>Die Entwicklung der hier beschriebenen Collection k\u00f6nnt ihr auf <a href=\"https:\/\/codeberg.org\">Codeberg.org<\/a> verfolgen. Die Repo-URL lautet: <a href=\"https:\/\/codeberg.org\/Tronde\/nextcloud\">https:\/\/codeberg.org\/Tronde\/nextcloud<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Motivation<\/h2>\n\n\n\n<p>F\u00fcr mein Wochenendprojekt <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-1-der-plan\/\" data-type=\"post\" data-id=\"2993\">\u201eNextcloud im Container\u201c<\/a> habe ich eine <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-2-die-ansible-rolle\/\">Ansible-Rolle<\/a> entwickelt und auf <a href=\"https:\/\/github.com\/Tronde\/ansible_role_deploy_nextcloud_with_mariadb_pod\">Github ver\u00f6ffentlicht<\/a>, die dem Zweck dient, Nextcloud mit einer MariaDB in einer rootless Podman-Umgebung zu installieren.<\/p>\n\n\n\n<p>Wie ihr in <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-5-backup-und-restore\/\">Teil 5<\/a> der Artikel-Serie nachlesen k\u00f6nnt, war ich mit der L\u00f6sung f\u00fcr Backup und Restore nicht ganz zufrieden. Ich m\u00f6chte dieses Thema erneut angehen und mithilfe einer Ansible-Rolle l\u00f6sen.<\/p>\n\n\n\n<p>Backup und Restore beschreiben jedoch andere Anwendungsf\u00e4lle als die Bereitstellung, weswegen ich den daf\u00fcr notwendigen Quelltext nicht mit in die bestehende Rolle pressen m\u00f6chte. Da Backup und Restore f\u00fcr mich jedoch zum Betrieb dazugeh\u00f6ren, m\u00f6chte ich alle Ansible-Rollen, die ich zum Betrieb meines Nextcloud-Setups ben\u00f6tige, in einer Collection zusammenfassen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Migration der bestehenden Rolle in eine Collection<\/h2>\n\n\n\n<p>Ich orientiere mich hierzu an der englischsprachigen Dokumentation <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/migrating_roles.html#migrating-a-role-to-a-collection\">\u201eMigrating a role to a collection\u201c<\/a>. Da ich bereits einen <a href=\"https:\/\/galaxy.ansible.com\/docs\/contributing\/namespaces.html\">Galaxy Namespace<\/a> besitze, nutze ich diesen auch f\u00fcr die Erstellung der Collection. Der folgende Codeblock zeigt die verwendeten Befehle.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>]$ ansible-galaxy collection init tronde.nextcloud\n- Collection tronde.nextcloud was created successfully\n\n]$ mkdir tronde\/nextcloud\/roles\/deploy_nextcloud_with_mariadb_pod &amp;&amp; rsync -a ..\/roles\/ansible_role_deploy_nextcloud_with_mariadb_pod\/ tronde\/nextcloud\/roles\/deploy_nextcloud_with_mariadb_pod\/\n\n]$ tree -L 3 tronde\/nextcloud\/\ntronde\/nextcloud\/\n\u251c\u2500\u2500 docs\n\u251c\u2500\u2500 galaxy.yml\n\u251c\u2500\u2500 meta\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 runtime.yml\n\u251c\u2500\u2500 plugins\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 README.md\n\u2514\u2500\u2500 roles\n    \u2514\u2500\u2500 deploy_nextcloud_with_mariadb_pod\n        \u251c\u2500\u2500 defaults\n        \u251c\u2500\u2500 meta\n        \u251c\u2500\u2500 README.md\n        \u251c\u2500\u2500 tasks\n        \u251c\u2500\u2500 tests\n        \u2514\u2500\u2500 vars\n\n]$ rm -rf tronde\/nextcloud\/roles\/deploy_nextcloud_with_mariadb_pod\/.git<\/code><\/pre>\n\n\n\n<p>Im letzten Schritt entferne ich das <code>.git<\/code>-Verzeichnis, da ich die Collection als Ganzes in einem Repository verwalten m\u00f6chte, statt alle Rollen einzeln zu versionieren und dann in die Collection einzuf\u00fcgen.<\/p>\n\n\n\n<p>Anschlie\u00dfend aktualisiere ich die Dateien <code>galaxy.yml<\/code> und <code>README.md<\/code>. In der Rolle habe ich ein Playbook zum Testen verwendet, welches im Pfad <code>deploy_nextcloud_with_mariadb_pod\/tests\/test.yml<\/code> liegt. Um konform mit der <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_collections_structure.html\">Struktur einer Ansible Collection<\/a> zu sein, erstelle ich im Wurzelverzeichnis meiner Collection das Verzeichnis <code>playbooks<\/code> und kopiere das Test-Playbook hier hinein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>]$ tree playbooks\/\nplaybooks\/\n\u2514\u2500\u2500 deploy_nextcloud_with_mariadb_pod.yml<\/code><\/pre>\n\n\n\n<p>An dieser Stelle halte ich zun\u00e4chst inne und \u00fcberlege mir, welche Tools ich noch ben\u00f6tige, um meine Collection entwickeln und testen zu k\u00f6nnen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ansible Development Tools<\/h2>\n\n\n\n<p><a href=\"https:\/\/ansible.readthedocs.io\/projects\/dev-tools\/\">Ansible Development Tools (ADT)<\/a> ist ein Projekt mit dem Ziel, einen Werkzeugkasten mit allen wichtigen Werkzeugen zur Entwicklung von Ansible Content zu bieten. Genau so etwas habe ich gesucht. Das probiere ich gleich aus.<\/p>\n\n\n\n<p>Um mir mein System nicht zu verhunzen, installiere ich die ADT in ein <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\">Python Virtual Environment<\/a> und lasse mir anzeigen, welche Werkzeuge ADT mitbringt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>]$ python -m venv adt\n]$ . adt\/bin\/activate\n(adt) ]$ pip install --upgrade pip\n(adt) ]$ pip install ansible-dev-tools\n(adt) ]$ pip install molecule-podman\n(adt) ]$ adt --version\nansible-builder                          3.1.0\nansible-core                             2.17.1\nansible-creator                          24.7.0\nansible-dev-environment                  24.7.0\nansible-dev-tools                        24.7.1\nansible-lint                             24.7.0\nansible-navigator                        24.7.0\nansible-sign                             0.1.1\nmolecule                                 24.7.0\npytest-ansible                           24.7.0\ntox-ansible                              24.7.0<\/code><\/pre>\n\n\n\n<p>Bei <code>molecule-podman<\/code> handelt es sich um einen Molecule-Treiber, welcher ben\u00f6tigt wird um Molecule-Tests in Podman-Containern ausf\u00fchren zu k\u00f6nnen. Ich habe dieses Paket mitinstalliert, da ich mir vorstellen kann, dies in naher Zukunft zu nutzen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ansible-lint<\/h3>\n\n\n\n<p><a href=\"https:\/\/ansible.readthedocs.io\/projects\/lint\/\">Ansible Lint<\/a> ist das erste Werkzeug aus der ADT-Sammlung, welches ich verwende, um den Quelltext meiner Collection zu pr\u00fcfen. Dazu wird das Kommando einfach im Wurzelverzeichnis der Collection ausgef\u00fchrt. Anschlie\u00dfend k\u00f6nnen die gefundenen Fehler behoben werden.<\/p>\n\n\n\n<p>Da es den Rahmen dieses Artikels sprengen w\u00fcrde, werde ich dem Thema einen eigenen Text widmen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">molecule<\/h3>\n\n\n\n<p><a href=\"https:\/\/ansible.readthedocs.io\/projects\/molecule\/\">Ansible Molecule<\/a> eignet sich zum Testen von Ansible-Rollen und Collections. Ich nutze meine Ansible Collection, um mich mit diesem Werkzeug vertraut zu machen.<\/p>\n\n\n\n<p>Zwar gibt es auch hier erst eine Lernkurve, doch wird mir eine durchdachte Test-Konfiguration bei der weiteren Entwicklung sicher zugutekommen. Ich orientiere mich zu Beginn am Ansible <a href=\"https:\/\/ansible.readthedocs.io\/projects\/molecule\/getting-started\/\">Molecule Getting Started Guide<\/a>.<\/p>\n\n\n\n<p>Zu Beginn m\u00f6chte ich meine in die Collection migrierte Rolle testen. Dazu bearbeite ich die Datei <code>tronde\/nextcloud\/extensions\/molecule\/default\/converge.yml<\/code>. Sie enth\u00e4lt schlie\u00dflich folgenden Inhalt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>extensions]$ cat molecule\/default\/converge.yml \n---\n- name: Converge\n  hosts: localhost\n  gather_facts: false\n  tasks:\n    - name: Test collection role deploy_nextcloud_with_mariadb_pod\n      ansible.builtin.import_role:\n        name: tronde.nextcloud.deploy_nextcloud_with_mariadb_pod<\/code><\/pre>\n\n\n\n<p>Und mit folgendem Befehl teste ich, ob meine Nextcloud-Instanz erfolgreich deployt wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>extensions]$ molecule converge\n\u2026\nPLAY RECAP *********************************************************************\nlocalhost                  : ok=10   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n\nextensions]$ podman ps\nCONTAINER ID  IMAGE                                    COMMAND               CREATED             STATUS             PORTS                    NAMES\n48438d1bd884  quay.io\/centos\/centos:stream8            bash -c while tru...  7 minutes ago       Up 7 minutes                                instance\n104c525a6b50  localhost\/podman-pause:5.1.1-1717459200                        About a minute ago  Up About a minute  127.0.0.1:40671-&gt;80\/tcp  e34ddf4d4203-infra\nf27842b12d56  docker.io\/library\/mariadb:10.11.2        mariadbd              About a minute ago  Up About a minute  127.0.0.1:40671-&gt;80\/tcp  nc_mariadb\n9ee391a57fbd  docker.io\/library\/nextcloud:25-apache    apache2-foregroun...  13 seconds ago      Up 13 seconds      127.0.0.1:40671-&gt;80\/tcp  nextcloud<\/code><\/pre>\n\n\n\n<p>Das Ergebnis ist positiv und kann durch Aufruf von <code>http:\/\/127.0.0.1:40671<\/code> im Webbrowser \u00fcberpr\u00fcft werden. Ein Login mit den Default-Werten aus <code>tronde\/nextcloud\/roles\/deploy_nextcloud_with_mariadb_pod\/defaults\/main.yml<\/code> best\u00e4tigt das erfolgreiche Deployment.<\/p>\n\n\n\n<p>Es handelt sich hierbei noch nicht um ein ad\u00e4quates Test-Setup; doch f\u00fcr den Moment ist es ausreichend. Ich werde mich noch weiter einarbeiten m\u00fcssen, um das Test-Setup verbessern zu k\u00f6nnen. Vermutlich wird auch dazu dann ein weiterer Artikel folgen.<\/p>\n\n\n\n<p>Falls sich jemand wundert, es ist durchaus Absicht, dass die Nextcloud nur via 127.0.0.1 und per HTTP erreichbar ist. Ich betreibe diese hinter einem Reverse-Proxy. Details k\u00f6nnen in <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-3-mit-reverse-proxy\/\" data-type=\"post\" data-id=\"3120\">Nextcloud im Container \u2014 Teil 3: Mit Reverse-Proxy<\/a> nachgelesen werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backup und Restore f\u00fcr die Nextcloud<\/h2>\n\n\n\n<p>Um die Konfiguration und die in der Nextcloud gespeicherten Daten sichern und wiederherstellen zu k\u00f6nnen, werde ich eine Offline-Sicherung der verwendeten Podman Volumes durchf\u00fchren. Der Ablauf f\u00fcr die <strong>Sicherung<\/strong> sieht wie folgt aus:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Den Pod \u02cbnc_pod\u02cb inkl. aller darin enthaltenen Container stoppen<\/li>\n\n\n\n<li>Alle zum Setup geh\u00f6renden Podman Volumes in Tarballs exportieren<\/li>\n\n\n\n<li>Diese Tarballs vom <em>managed Node<\/em> auf den <em>Control Node<\/em> sichern<\/li>\n\n\n\n<li>Den \u02cbnc_pod\u02cb wieder starten<\/li>\n<\/ol>\n\n\n\n<p>Die <strong>Wiederherstellung<\/strong> l\u00e4uft sinngem\u00e4\u00df andersherum ab:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Die Tarballs werden vom <em>Control Node<\/em> auf den <em>Managed Node<\/em> kopiert<\/li>\n\n\n\n<li>Der Pod \u02cbnc_pod\u02cb inkl. aller darin enthaltenen Container wird gestoppt<\/li>\n\n\n\n<li>Die Podman Volumes aus Schritt 1 werden importiert<\/li>\n\n\n\n<li>Der <code>nc_pod<\/code> wird wieder gestartet<\/li>\n\n\n\n<li>Die zur Wiederherstellung auf den <em>Managed Node<\/em> kopierten Tarballs werden wieder entfernt<\/li>\n<\/ol>\n\n\n\n<p>Um diese neue Rolle der Collection hinzuzuf\u00fcgen, navigiere ich in das Rollenverzeichnis <code>tronde\/nextcloud\/roles\/<\/code> und erstelle dort das Grundger\u00fcst f\u00fcr die Rolle: <code>ansible-galaxy role init backup_nextcloud<\/code><\/p>\n\n\n\n<p>Die Struktur sieht bei mir wie folgt aus, wobei nicht ben\u00f6tigte Verzeichnisse noch nicht entfernt wurden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible_collections]$ tree -L 2 tronde\/nextcloud\/roles\/backup_restore_nextcloud\/\ntronde\/nextcloud\/roles\/backup_restore_nextcloud\/\n\u251c\u2500\u2500 defaults\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 main.yml\n\u251c\u2500\u2500 files\n\u251c\u2500\u2500 handlers\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 main.yml\n\u251c\u2500\u2500 meta\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 main.yml\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 tasks\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 main.yml\n\u251c\u2500\u2500 templates\n\u251c\u2500\u2500 tests\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 inventory\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 test.yml\n\u2514\u2500\u2500 vars\n    \u2514\u2500\u2500 main.yml\n\n9 directories, 8 files<\/code><\/pre>\n\n\n\n<p>Den aktuellen Entwicklungsstand k\u00f6nnt ihr unter dieser URL einsehen: <a href=\"https:\/\/codeberg.org\/Tronde\/nextcloud\/src\/branch\/main\/roles\/backup_restore_nextcloud\">https:\/\/codeberg.org\/Tronde\/nextcloud\/src\/branch\/main\/roles\/backup_restore_nextcloud<\/a><\/p>\n\n\n\n<p>Das dortige <a href=\"https:\/\/codeberg.org\/Tronde\/nextcloud\/src\/branch\/main\/roles\/backup_restore_nextcloud\/README.md\">README.md<\/a> enth\u00e4lt wie bei dedizierten Rollen die Dokumentation zu dieser Rolle. Um doppelte Texte zu vermeiden, verweise ich im <a href=\"https:\/\/codeberg.org\/Tronde\/nextcloud\/src\/branch\/main\/README.md\">Collection-README<\/a> auf die jeweiligen README-Dateien in den einzelnen Rollen.<\/p>\n\n\n\n<p>Getestet wird diese Rolle ebenfalls mit Molecule. Zu den Tests mit Molecule werde ich noch mehr schreiben, sobald ich dies etwas verfeinert habe.<\/p>\n\n\n\n<p>Fallen mir noch weitere Anwendungsf\u00e4lle ein, k\u00f6nnen diese nun einfach als weitere Rollen der Collection hinzugef\u00fcgt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ansible-Variablen definieren<\/h2>\n\n\n\n<p>Jede Rolle in dieser Collection ist f\u00fcr sich alleine nutzbar. Somit definiert jede Rolle die Eingangs-Variablen in der <code>defaults\/main.yml<\/code> der jeweiligen Rolle.<\/p>\n\n\n\n<p>Bei der Entwicklung achte ich darauf, dass Variablen, die z.B. den Namen eines Podman Volumes enthalten, in allen Rollen gleich geschrieben werden. Damit ist es m\u00f6glich, diese Variablen an anderer Stelle zu definieren und in den verschiedenen Rollen nutzbar zu machen. So k\u00f6nnen an individuelle Deployments angepasste Variablen in Playbooks, group_vars, host_vars, etc. definiert werden.<\/p>\n\n\n\n<p>Wo Variablen definiert werden k\u00f6nnen und welche Pr\u00e4zedenz diese besitzen, kann in der offiziellen Doku nachgelesen werden: <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_variables.html#id45\">Variable precedence: Where should I put a variable?<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zusammenfassung\">Zusammenfassung<\/h2>\n\n\n\n<p>Eine Ansible-Rolle ohne Plug-ins in eine Ansible Collection zu \u00fcberf\u00fchren, ist mit dem <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/migrating_roles.html#migrating-a-role-to-a-collection\">kurzen Abschnitt aus der Dokumentation<\/a> schnell erledigt.<\/p>\n\n\n\n<p>Weitere Rollen k\u00f6nnen der Collection hinzugef\u00fcgt werden, indem man sie im Verzeichnis <code>roles<\/code> der <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_collections_structure.html\">Collection-Verzeichnisstruktur<\/a> wie gewohnt mit <code>ansible-galaxy role init &lt;Rollenname&gt;<\/code> erstellt und mit Leben f\u00fcllt. Sorgfalt ist und bleibt bei der Benennung von Variablen und deren <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_variables.html#id45\">Pr\u00e4zedenz<\/a> geboten, um nicht wahnsinnig zu werden. Dies ist nicht wirklich schwierig, doch muss ich fast jedes Mal in der Dokumentation nachschlagen, um sicher zu sein.<\/p>\n\n\n\n<p>Die <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_variables.html#id45\">Ansible Development Tools (ADT)<\/a> sind eine praktische Sammlung von Werkzeugen zur Entwicklung von Rollen und Collections f\u00fcr Ansible. F\u00fcr mich sind aktuell <a href=\"https:\/\/ansible.readthedocs.io\/projects\/lint\/\">Ansible Lint<\/a> und <a href=\"https:\/\/ansible.readthedocs.io\/projects\/molecule\/\">Ansible Molecule<\/a> die wichtigsten Werkzeuge aus dieser Sammlung. Wobei gerade die Dokumentation von Molecule auf dem Weg zu meinem Ziel, n\u00e4mlich meine Collections in verschiedenen rootless Podman Containern mit nested Podman und Ansible zu testen, leider viele Fragen offen l\u00e4sst. Grunds\u00e4tzlich lassen sich Testpl\u00e4ne damit realisieren und vereinfachen mein bisheriges Testsetup bestehend aus diversen Skripts und virtuellen Maschinen. Und sie bieten Stoff f\u00fcr weitere Eintr\u00e4ge in diesem Blog.<\/p>\n\n\n\n<p>Die weitere Entwicklung meiner Nextcloud Collection findet auf Codeberg statt. Ihr findet sie dort unter der URL: <a href=\"https:\/\/codeberg.org\/Tronde\/nextcloud\">https:\/\/codeberg.org\/Tronde\/nextcloud<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dies ist ein Erfahrungsbericht zur Migration meiner Ansible-Rolle \u201eNextcloud im Container\u201c in eine Ansible Collection. Er umfasst die Migration der bestehenden Rolle und die Erg\u00e4nzung der neuen Collection um eine weitere Rolle, welche sich um die Aufgaben Backup und Restore k\u00fcmmert. Wer es ganz eilig hat, kann direkt zur Zusammenfassung springen. Allen anderen w\u00fcnsche ich<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/meine-zweite-ansible-collection\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[532],"tags":[846,847,430,305],"class_list":["post-3906","post","type-post","status-publish","format-standard","hentry","category-ansible","tag-ansible-collection","tag-ansible-molecule","tag-osbn","tag-planet"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=3906"}],"version-history":[{"count":11,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3906\/revisions"}],"predecessor-version":[{"id":3927,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/3906\/revisions\/3927"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=3906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=3906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=3906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}