{"id":2996,"date":"2022-02-21T07:00:00","date_gmt":"2022-02-21T06:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=2996"},"modified":"2022-02-18T19:00:18","modified_gmt":"2022-02-18T18:00:18","slug":"nextcloud-im-container-teil-2-die-ansible-rolle","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-2-die-ansible-rolle\/","title":{"rendered":"Nextcloud im Container &#8211; Teil 2: Die Ansible-Rolle"},"content":{"rendered":"\n<p>In <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-1-der-plan\/\" data-type=\"post\" data-id=\"2993\">Teil 1<\/a> dieser Artikelserie habe ich mein Ansinnen ausf\u00fchrlich beschrieben. Dieser Teil widmet sich der Entwicklung einer Ansible-Rolle zum Deployment des Nextcloud-Apache-Container-Images.<\/p>\n\n\n\n<p>In den folgenden Abschnitten beschreibe ich die Einrichtung eines Python Virtual Environments, die Installation von Ansible in dem zuvor erstellten Environment und die Installation der Ansible-Collection <em>containers.podman, <\/em>bevor ich mich abschlie\u00dfend der eigentlichen Ansible-Rolle widme.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"python-virtual-environments-fur-ansible\">Python Virtual Environments f\u00fcr Ansible<\/h2>\n\n\n\n<p>Zur Einrichtung habe ich mich an den englischsprachigen Artikel &#8222;<a href=\"https:\/\/www.redhat.com\/sysadmin\/python-venv-ansible\">How to set up and use Python virtual environments for Ansible<\/a>&#8220; von <a href=\"https:\/\/www.redhat.com\/sysadmin\/users\/gineesh-madapparambath\">Gineesh Madapparambath<\/a> gehalten. Die notwendigen Schritte werden hier kurz und b\u00fcndig dokumentiert.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;t14s ~]$ python3 --version\nPython 3.9.7\n\n&#91;t14s ~]$ mkdir python-venv\n&#91;t14s ~]$ cd !$\ncd python-venv\n\n&#91;t14s python-venv]$ python3 -m venv ansible-core2.x\n&#91;t14s python-venv]$ source ansible-core2.x\/bin\/activate\n(ansible-core2.x) &#91;jkastning@t14s python-venv]$ python3 -m pip install --upgrade pip\nRequirement already satisfied: pip in .\/ansible-core2.x\/lib\/python3.9\/site-packages (21.0.1)\nCollecting pip\n  Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)\n     |\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 1.7 MB 2.3 MB\/s \nInstalling collected packages: pip\n  Attempting uninstall: pip\n    Found existing installation: pip 21.0.1\n    Uninstalling pip-21.0.1:\n      Successfully uninstalled pip-21.0.1\nSuccessfully installed pip-21.3.1\n\n(ansible-core2.x) &#91;t14s python-venv]$ python3 -m pip install ansible-core\nCollecting ansible-core\n&#91;...]\n\n(ansible-core2.x) &#91;t14s python-venv]$ ansible --version\nansible &#91;core 2.11.6] \n  config file = None\n  configured module search path = &#91;'\/home\/tronde\/.ansible\/plugins\/modules', '\/usr\/share\/ansible\/plugins\/modules']\n  ansible python module location = \/home\/tronde\/python-venv\/ansible-core2.x\/lib64\/python3.9\/site-packages\/ansible\n  ansible collection location = \/home\/tronde\/.ansible\/collections:\/usr\/share\/ansible\/collections\n  executable location = \/home\/tronde\/python-venv\/ansible-core2.x\/bin\/ansible\n  python version = 3.9.7 (default, Aug 30 2021, 00:00:00) &#91;GCC 11.2.1 20210728 (Red Hat 11.2.1-1)]\n  jinja version = 3.0.2\n  libyaml = True<\/code><\/pre>\n\n\n\n<p>Damit ist die Installation von <code>ansible-core<\/code> abgeschlossen. Im folgenden Code-Block wird gepr\u00fcft, ob Ansible sich grunds\u00e4tzlich mit dem Zielsystem verbinden und dort einen Python-Interpreter identifizieren kann.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(ansible-core2.x) &#91;t14s python-venv]$ ansible -i hosts --private-key ~\/.ssh\/ansible_id_rsa -m ping example.com\nexample.com | SUCCESS =&gt; {\n    \"ansible_facts\": {\n        \"discovered_interpreter_python\": \"\/usr\/bin\/python3\"\n    },\n    \"changed\": false,\n    \"ping\": \"pong\"\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"installation-der-ansible-collection-containers-podman\">Installation der Ansible-Collection <em>containers.podman<\/em><\/h2>\n\n\n\n<p>Um Podman auf dem Zielsystem konfigurieren zu k\u00f6nnen, wird die genannte Ansible-Collection ben\u00f6tigt, welche mit folgendem Befehl installiert werden kann. Der Code-Block zeigt zus\u00e4tzlich die Ausgabe w\u00e4hrend der Installation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(ansible-core2.x) &#91;t14s ansible-core2.x]$ ansible-galaxy collection install containers.podman\nStarting galaxy collection install process\nProcess install dependency map\nStarting collection install process\nDownloading https:\/\/galaxy.ansible.com\/download\/containers-podman-1.8.2.tar.gz to \/home\/tronde\/.ansible\/tmp\/ansible-local-8729oh0om8w3\/tmp7tv2yrae\/containers-podman-1.8.2-9rw3fd1y\nInstalling 'containers.podman:1.8.2' to '\/home\/tronde\/.ansible\/collections\/ansible_collections\/containers\/podman'\ncontainers.podman:1.8.2 was installed successfully<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ansible-rolle-deployment-von-nextcloud-und-mariadb-als-pod\">Ansible-Rolle:  Deployment von Nextcloud und MariaDB als Pod<\/h2>\n\n\n\n<p>Nextcloud ben\u00f6tigt f\u00fcr den Betrieb eine Datenbank. Hierf\u00fcr k\u00f6nnte man eine integrierte <a href=\"https:\/\/de.wikipedia.org\/wiki\/SQLite\">SQLite<\/a> nutzen. Dies wird jedoch nur f\u00fcr kleine Umgebungen empfohlen. W\u00e4hrend der Entstehung dieses Artikels wird <a href=\"https:\/\/de.wikipedia.org\/wiki\/MariaDB\">MariaDB<\/a> als Datenbank-Backend vom Nextlcoud-Projekt <a href=\"https:\/\/docs.nextcloud.com\/server\/latest\/admin_manual\/installation\/system_requirements.html\">empfohlen<\/a>. Daher habe ich mich entschieden, das Nextcloud-Image zusammen mit einem MariaDB-Container zu deployen. Dazu greife ich auf die beiden folgenden Container-Repositorien zur\u00fcck:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Nextcloud (Official Image) &#8212; <a href=\"https:\/\/hub.docker.com\/_\/nextcloud\">https:\/\/hub.docker.com\/_\/nextcloud<\/a><\/li><li>MariaDB (Official Image) &#8212; <a href=\"https:\/\/hub.docker.com\/_\/mariadb\">https:\/\/hub.docker.com\/_\/mariadb<\/a><\/li><\/ul>\n\n\n\n<p>Das Grundger\u00fcst bzw. die Verzeichnisstruktur f\u00fcr die Ansible-Rolle wurde erstellt mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible-galaxy role init --offline ansible_role_deploy_nextcloud_with_mariadb_pod<\/code><\/pre>\n\n\n\n<p>Die aktuelle Version der Ansible-Rolle ist auf <a href=\"https:\/\/github.com\/Tronde\/ansible_role_deploy_nextcloud_with_mariadb_pod\">GitHub<\/a> zu finden. Ich werde ihre Bestandteile hier im Einzelnen vorstellen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"die-variablen-in-defaults-main-yml\">Die Variablen in defaults\/main.yml<\/h3>\n\n\n\n<p>In der Datei <code>defaults\/main.yml<\/code> habe ich Standardwerte f\u00fcr Variablen definiert, die geeignet sind, eine funktionsf\u00e4hige Nextcloud-Instanz zu initialisieren. Die Bezeichner der Variablen sind dabei der Dokumentation der verwendeten Container-Repositorien entnommen.<\/p>\n\n\n\n<p>In Zeile 4-7 und 10 werden die Namen f\u00fcr Podman-Volumes definiert, welche die persistent zu speichernden Daten aufnehmen werden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>     1\t---\n     2\t# defaults file for ansible_role_deploy_nextcloud_with_mariadb_pod\n     3\t# Podman volumes for Nextcloud\n     4\tNC_HTML: nc_html\n     5\tNC_APPS: nc_apps\n     6\tNC_CONFIG: nc_config\n     7\tNC_DATA: nc_data\n     8\t\n     9\t# Podman volume for MariaDB\n    10\tMYSQL_DATA: mysql_data<\/code><\/pre>\n\n\n\n<p>Die Zeilen 13-17 definieren Variablen f\u00fcr die MariaDB-Instanz, wie z.B. Namen der Datenbank, Benutzername und Passw\u00f6rter f\u00fcr diese Datenbank und den DB-Host. Diese werden neben dem MariaDB-Container auch von dem Nextcloud-Container ben\u00f6tigt, um eine Verbindung zur Datenbank herstellen zu k\u00f6nnen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    12\t# MySQL\/MariaDB vars\n    13\tMYSQL_DATABASE: nc_db\n    14\tMYSQL_USER: nextcloud\n    15\tMYSQL_PASSWORD: ToPSeCrEt2021!\n    16\tMYSQL_ROOT_PASSWORD: ToPSeCrEt2021!\n    17\tMYSQL_HOST: 127.0.0.1\n    18\t\n    19\t# Vars for MariaDB container\n    20\tMARIADB_CONMON_PIDFILE: \/tmp\/mariadb_conmon.pid\n    21\tMARIADB_IMAGE: docker.io\/library\/mariadb:10.5.7\n    22\tMARIADB_NAME: nc_mariadb<\/code><\/pre>\n\n\n\n<p>Zeile 20-22 definiert Variablen, die f\u00fcr den MariaDB-Container ben\u00f6tigt werden. Hier wird z.B. die Version des Container-Images (<code>MARIADB_IMAGE<\/code>) und ein Name f\u00fcr die Container-Instanz (<code>MARIADB_NAME<\/code>) festgelegt.<\/p>\n\n\n\n<p>Die folgenden Zeilen widmen sich den Variablen f\u00fcr den Nextcloud-Container. Dort werden in den Zeilen 25 u. 26 Benutzername und Passwort f\u00fcr den  Nextcloud-Admin definiert, gefolgt von einigen Variablen, welche bei Nutzung eines Reverse-Proxy ben\u00f6tigt werden und SMTP-Variablen, welche der Nextcloud den Mailversand erm\u00f6glichen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    24\t# Nextcloud vars\n    25\tNEXTCLOUD_ADMIN_USER: nc_admin\n    26\tNEXTCLOUD_ADMIN_PASSWORD: VSnfD2021!\n    27\tNEXTCLOUD_OVERWRITEPROTOCOL: \"\"\n    28\tNEXTCLOUD_OVERWRITECLIURL: \"\"\n    29\tNEXTCLOUD_TRUSTED_DOMAINS: \"\"\n    30\t\n    31\t# SMTP vars\n    32\tSMTP_HOST: smtp.example.com\n    33\tSMTP_SECURE: tls # ssl to use SSL, or tls zu use STARTTLS\n    34\tSMTP_PORT: 587 # (25, 465 for SSL, 587 for STARTTLS)\n    35\tSMTP_AUTHTYPE: LOGIN\n    36\tSMTP_NAME: bob@example.com\n    37\tSMTP_PASSWORD: MailSecret1!\n    38\tMAIL_FROM_ADDRESS: no-reply@example.com\n    39\tMAIL_DOMAIN: \"@example.com\"<\/code><\/pre>\n\n\n\n<p>Bei den SMTP-Variablen handelt es sich um Beispiel-Werte. Diese m\u00fcssen an die konkrete Umgebung angepasst werden.<\/p>\n\n\n\n<p>Es folgen nun noch ein paar Variablen, welche dem Pod und dem Nextcloud-Container einen Namen geben, sowie die Version des zu verwendenden Nextcloud-Container-Images festlegen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    41\t# Vars for podman-pod(1)\n    42\tPOD_NAME: nc_pod\n    43\tPOD_PORT: 127.0.0.1:40231:80\n    44\tPOD_INFRA_CONMON_PIDFILE: \/tmp\/nc_pod_infra.pid\n    45\t\n    46\t# Vars for Nextcloud container\n    47\tNC_CONMON_PIDFILE: \/tmp\/nc_conmon.pid\n    48\tNC_IMAGE: docker.io\/library\/nextcloud:23-apache\n    49\tNC_NAME: nextcloud<\/code><\/pre>\n\n\n\n<p>Durch <code>POD_PORT: 127.0.0.1:40231:80<\/code> wird definiert, dass der Port 40231 an das Loopback-Interface gebunden und mit Port 80 des Pods verkn\u00fcpft wird. Mit dieser Einstellung ist die Nextcloud-Instanz nur von dem Host aus erreichbar, auf dem sie ausgebracht wurde. M\u00f6chte man sie auch von anderen Hosts aus erreichbar machen, kann man entweder den Teil mit <code>127.0.0.1:<\/code> weglassen oder einen Reverse-Proxy wie z.B. NGINX verwenden. Ich empfehle an dieser Stelle letzteres.<\/p>\n\n\n\n<p><strong>Hinweis:<\/strong> In <code>defauts\/main.yml<\/code> stehen Passw\u00f6rter im Klartext. Diese sind mit der Ver\u00f6ffentlichung der Ansible-Rolle allgemein bekannt und sollten gegen solche ersetzt werden, die geheimgehalten werden. Dies kann z.B. geschehen, in dem man die entsprechenden Variablen in <code>vars\/main.yml<\/code> oder <code>host_vars\/hostname<\/code> neu definiert. Es bietet sich an, diese zus\u00e4tzlich mit <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/vault.html\" target=\"_blank\" rel=\"noreferrer noopener\">Ansible-Vault<\/a> zu verschl\u00fcsseln.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"die-tasks-in-tasks-main-yml\">Die Tasks in tasks\/main.yml<\/h3>\n\n\n\n<p>Im vorstehenden Abschnitt wurden die Variablen definiert, welche f\u00fcr die nun folgenden Tasks ben\u00f6tigt werden. Diese sind in <code>tasks\/main.yml<\/code> definiert und werden im folgenden wieder abschnittsweise erl\u00e4utert.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>     1\t---\n     2\t# tasks file for ansible_role_deploy_nextcloud_with_mariadb_pod\n     3\t- name: Main folder, needed for updating\n     4\t  containers.podman.podman_volume:\n     5\t    state: present\n     6\t    name: \"{{ NC_HTML }}\"\n     7\t    recreate: no\n     8\t    debug: no\n     9\t\n    10\t- name: Volume for installed\/modified apps\n    11\t  containers.podman.podman_volume:\n    12\t    state: present\n    13\t    name: \"{{ NC_APPS }}\"\n    14\t    recreate: no\n    15\t    debug: no\n    16\t\n    17\t- name: Volume for local configuration\n    18\t  containers.podman.podman_volume:\n    19\t    state: present\n    20\t    name: \"{{ NC_CONFIG }}\"\n    21\t    recreate: no\n    22\t    debug: no\n    23\t\n    24\t- name: Volume for the actual data of Nextcloud\n    25\t  containers.podman.podman_volume:\n    26\t    state: present\n    27\t    name: \"{{ NC_DATA }}\"\n    28\t    recreate: no\n    29\t    debug: no\n    30\t\n    31\t- name: Volume for the MySQL data files\n    32\t  containers.podman.podman_volume:\n    33\t    state: present\n    34\t    name: \"{{ MYSQL_DATA }}\"\n    35\t    recreate: no\n    36\t    debug: no<\/code><\/pre>\n\n\n\n<p>Die ersten Zeilen enthalten Tasks, durch welche die Podman-Volumes zur persistenten Datenspeicherung auf dem Zielsystem erstellt werden. Diese Tasks sind, wie f\u00fcr Ansible \u00fcblich, deklarativ und idempotent. Existiert ein Volume bereits, liefert der entsprechende Task ein &#8218;OK&#8216; zur\u00fcck, da keine Aktionen erforderlich sind.<\/p>\n\n\n\n<p>Die folgenden Zeilen erstellen den Podman-Pod und f\u00fcgen ihm einen Nextcloud- sowie einen MariaDB-Container hinzu. Die Dokumentation der verwendeten Module findet sich in Punkt 5 und 6 im Abschnitt <a href=\"#quellen-links\">Quellen und weiterf\u00fchrende Links<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    38\t- name: Create the podman-pod(1)\n    39\t  containers.podman.podman_pod:\n    40\t    debug: no\n    41\t    infra: yes\n    42\t    infra_conmon_pidfile: \"{{ POD_INFRA_CONMON_PIDFILE }}\"\n    43\t    publish: \"{{ POD_PORT }}\"\n    44\t    name: \"{{ POD_NAME }}\"\n    45\t    state: started\n    46\t\n    47\t- name: Create MariaDB container\n    48\t  containers.podman.podman_container:\n    49\t    debug: yes\n    50\t    conmon_pidfile: \"{{ MARIADB_CONMON_PIDFILE }}\"\n    51\t    image: \"{{ MARIADB_IMAGE }}\"\n    52\t    image_strict: yes\n    53\t    pod: \"{{ POD_NAME }}\"\n    54\t    recreate: yes\n    55\t    state: started\n    56\t    name: \"{{ MARIADB_NAME }}\"\n    57\t    env:\n    58\t      MYSQL_USER: \"{{ MYSQL_USER }}\"\n    59\t      MYSQL_PASSWORD: \"{{ MYSQL_PASSWORD }}\"\n    60\t      MYSQL_ROOT_PASSWORD: \"{{ MYSQL_ROOT_PASSWORD }}\"\n    61\t      MYSQL_DATABASE: \"{{ MYSQL_DATABASE }}\"\n    62\t    volume: \"{{ MYSQL_DATA }}:\/var\/lib\/mysql:Z\"\n    63\t\n    64\t- name: Wait for DB to initilize\n    65\t  wait_for:\n    66\t    timeout: 20\n    67\t\n    68\t- name: Create Nextcloud container\n    69\t  containers.podman.podman_container:\n    70\t    debug: no \n    71\t    conmon_pidfile: \"{{ NC_CONMON_PIDFILE }}\"\n    72\t    image: \"{{ NC_IMAGE }}\"\n    73\t    image_strict: yes\n    74\t    pod: \"{{ POD_NAME }}\"\n    75\t    recreate: yes\n    76\t    state: started\n    77\t    name: \"{{ NC_NAME }}\"\n    78\t    env:\n    79\t      MYSQL_DATABASE: \"{{ MYSQL_DATABASE }}\"\n    80\t      MYSQL_USER: \"{{ MYSQL_USER }}\"\n    81\t      MYSQL_PASSWORD: \"{{ MYSQL_PASSWORD }}\"\n    82\t      MYSQL_HOST: \"{{ MYSQL_HOST }}\"\n    83\t      NEXTCLOUD_ADMIN_USER: \"{{ NEXTCLOUD_ADMIN_USER }}\"\n    84\t      NEXTCLOUD_ADMIN_PASSWORD: \"{{ NEXTCLOUD_ADMIN_PASSWORD }}\"\n    85\t      NEXTCLOUD_TRUSTED_DOMAINS: \"{{ NEXTCLOUD_TRUSTED_DOMAINS }}\"\n    86\t      SMTP_HOST: \"{{ SMTP_HOST }}\"\n    87\t      SMTP_SECURE: \"{{ SMTP_SECURE }}\"\n    88\t      SMTP_PORT: \"{{ SMTP_PORT }}\"\n    89\t      SMTP_AUTHTYPE: \"{{ SMTP_AUTHTYPE }}\"\n    90\t      SMTP_NAME: \"{{ SMTP_NAME }}\"\n    91\t      SMTP_PASSWORD: \"{{ SMTP_PASSWORD }}\"\n    92\t      MAIL_FROM_ADDRESS: \"{{ MAIL_FROM_ADDRESS }}\"\n    93\t      MAIL_DOMAIN: \"{{ MAIL_DOMAIN }}\"\n    94\t      OVERWRITEPROTOCOL: \"{{ NEXTCLOUD_OVERWRITEPROTOCOL }}\"\n    95\t      OVERWRITECLIURL: \"{{ NEXTCLOUD_OVERWRITECLIURL }}\"\n    96\t    volume:\n    97\t      - \"{{ NC_HTML }}:\/var\/www\/html:Z\"\n    98\t      - \"{{ NC_APPS }}:\/var\/www\/html\/custom_apps:Z\"\n    99\t      - \"{{ NC_CONFIG }}:\/var\/www\/html\/config:Z\"\n   100\t      - \"{{ NC_DATA }}:\/var\/www\/html\/data:Z\"<\/code><\/pre>\n\n\n\n<p>In Zeile 64-66 habe ich einen Task definiert, der einfach nur 20 Sekunden wartet. Dies wurde erforderlich, da ich Laufzeitprobleme feststellen konnte, wenn der Nextcloud-Container startet, bevor die Datenbank im MariaDB-Container initialisiert war. Dieses Konstrukt ist nicht sch\u00f6n und ich bin f\u00fcr Verbesserungsvorschl\u00e4ge offen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zwischenfazit\">Zwischenfazit<\/h2>\n\n\n\n<p>Die Erstellung der Ansible-Rolle hat l\u00e4nger gedauert, als angenommen. Dies liegt nur zum Teil in meiner sp\u00e4rlichen Freizeit begr\u00fcndet. Einen gr\u00f6\u00dferen Einfluss darauf hatte die Dokumentation zum Nextcloud-Repository. Diese geht davon aus, dass man ein Dockerfile bzw. Docker-Compose verwendet. So war noch etwas Internet-Recherche erforderlich, um den Pod letztendlich ans Laufen zu bringen.<\/p>\n\n\n\n<p>Dieser Artikel besch\u00e4ftigte sich mit den Tag-1-Aufgaben, an deren Ende eine Nextcloud-Instanz ausgebracht wurde, welche an einen Reverse-Proxy angebunden werden kann. <\/p>\n\n\n\n<p>Im n\u00e4chsten Artikel gehe ich auf die Konfiguration des NGINX-Reverse-Proxy ein. Hierbei habe ich einige \u00dcberraschungen erlebt, welche mich an der Reife des Projekts [<a href=\"#quellen-links\">2<\/a>] zweifeln lassen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"quellen-links\">Quellen und weiterf\u00fchrende Links<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>Nextcloud System Requirements &#8212; <a href=\"https:\/\/docs.nextcloud.com\/server\/latest\/admin_manual\/installation\/system_requirements.html\">https:\/\/docs.nextcloud.com\/server\/latest\/admin_manual\/installation\/system_requirements.html<\/a><\/li><li>Nextcloud (Official Image) &#8212; <a href=\"https:\/\/hub.docker.com\/_\/nextcloud\">https:\/\/hub.docker.com\/_\/nextcloud<\/a><\/li><li>MariaDB (Official Image) &#8212; <a href=\"https:\/\/hub.docker.com\/_\/mariadb\">https:\/\/hub.docker.com\/_\/mariadb<\/a><\/li><li><a href=\"https:\/\/github.com\/Tronde\/ansible_role_deploy_nextcloud_with_mariadb_pod\">GitHub Tronde\/ansible_role_deploy_nextcloud_with_mariadb_pod<\/a><\/li><li><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/containers\/podman\/podman_pod_module.html#ansible-collections-containers-podman-podman-pod-module\">podman_pod<\/a> \u2013 Manage Podman pods<\/li><li><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/containers\/podman\/podman_container_module.html#ansible-collections-containers-podman-podman-container-module\">podman_container<\/a> \u2013 Manage podman containers<\/li><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>In Teil 1 dieser Artikelserie habe ich mein Ansinnen ausf\u00fchrlich beschrieben. Dieser Teil widmet sich der Entwicklung einer Ansible-Rolle zum Deployment des Nextcloud-Apache-Container-Images. In den folgenden Abschnitten beschreibe ich die Einrichtung eines Python Virtual Environments, die Installation von Ansible in dem zuvor erstellten Environment und die Installation der Ansible-Collection containers.podman, bevor ich mich abschlie\u00dfend der<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/nextcloud-im-container-teil-2-die-ansible-rolle\/\">[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":[1],"tags":[410,653,665,652,430,305,607],"class_list":["post-2996","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-ansible","tag-containers-podman","tag-mariadb","tag-nextcloud","tag-osbn","tag-planet","tag-pod"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2996","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=2996"}],"version-history":[{"count":9,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2996\/revisions"}],"predecessor-version":[{"id":3134,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2996\/revisions\/3134"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=2996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=2996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=2996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}