{"id":130451,"date":"2022-12-12T08:00:00","date_gmt":"2022-12-12T08:00:00","guid":{"rendered":"https:\/\/fedoramagazine.org\/?p=37360"},"modified":"2022-12-12T08:00:00","modified_gmt":"2022-12-12T08:00:00","slug":"automate-container-management-on-fedora-linux-with-the-podman-linux-system-role","status":"publish","type":"post","link":"https:\/\/sickgaming.net\/blog\/2022\/12\/12\/automate-container-management-on-fedora-linux-with-the-podman-linux-system-role\/","title":{"rendered":"Automate container management on Fedora Linux with the Podman Linux System Role"},"content":{"rendered":"<p>Containers are a popular way to distribute and run software on Linux. One of the tools included in Fedora Linux to work with containers is the Pod Manager tool, also known as <a href=\"https:\/\/podman.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Podman<\/a>. This article describes the use of the Ansible Podman Linux System Roles to automate container management.<\/p>\n<p> <span id=\"more-37360\"><\/span> <\/p>\n<p>With Podman, you can quickly and easily download container images and run containers. For more information on Podman, check out the <a href=\"https:\/\/podman.io\/getting-started\/\" target=\"_blank\" rel=\"noreferrer noopener\">Getting Started section<\/a> on the <a href=\"https:\/\/podman.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">podman.io<\/a> site. <\/p>\n<p>While Podman is very easy to use, many people are interested in automating Podman for a variety of reasons. For example, maybe you have multiple Fedora Linux systems that you would like to deploy a container workload across, or perhaps you&#8217;re a developer and would like to setup an automated process to deploy containers on your local workstation for testing purposes. Whether you are working with containers on a single system, or need to manage containers across a number of systems, automation can be critical to being efficient and saving time. <\/p>\n<h2>Overview of Linux System Roles<\/h2>\n<p><a href=\"https:\/\/linux-system-roles.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Linux System Roles<\/a> are a set of Ansible roles\/collections that can help automate the configuration and management of several aspects of Fedora Linux, CentOS Stream, RHEL, and RHEL derivatives. Linux System Roles is packaged in Fedora as an RPM (<em>linux-system-roles<\/em>) and is also available on Ansible Galaxy. For more information on Linux System Roles, and to see a list of included roles, refer to the <a href=\"https:\/\/linux-system-roles.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Linux System Roles project page<\/a>.<\/p>\n<p>Linux System Roles recently added a new <a href=\"https:\/\/github.com\/linux-system-roles\/podman\/\">podman<\/a> role for automating the management of Podman containers. One of Podman&#8217;s unique features is that it is daemonless, so the <em>podman<\/em> role directly sets the desired configuration on each host, and is capable of configuring the <em>containers.conf<\/em>, <em>containers-registries.conf<\/em>, <em>containers-storage.conf<\/em>, and <em>containers-policy.json<\/em> settings. <\/p>\n<h2>Podman systemd integration and Kubernetes YAML support<\/h2>\n<p>The <em>podman<\/em> system role utilizes the <a href=\"https:\/\/www.redhat.com\/sysadmin\/kubernetes-workloads-podman-systemd\" target=\"_blank\" rel=\"noreferrer noopener\">systemd integration with Kubernetes YAML<\/a> introduced in Podman version 4.2. Podman supports the ability to run containers based on Kubernetes YAML, which can make it easier to transition between Podman and Kubernetes. Podman 4.2 introduced a new <em>podman-kube@.service<\/em> which uses systemd to manage containers defined in Kubernetes YAML. You&#8217;ll see an example of how the <em>podman<\/em> system role utilizes this functionality below. <\/p>\n<h2>Demo environment overview<\/h2>\n<p>In my environment I have four systems running Fedora Linux. The <em>fedora-controlnode.example.com<\/em> system will be the Ansible control node &#8212; this is where I&#8217;ll install Ansible and Linux System Roles. The other three systems,<em> fedora-node1.example.com<\/em>, <em>fedora-node2.example.com<\/em>, and <em>fedora3-node3.example.com<\/em> are the systems that I would like to deploy container workloads on to. <\/p>\n<p>On these three systems, I would like to deploy a <a href=\"https:\/\/nextcloud.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Nextcloud<\/a> container. I would also like to deploy a web server container on these systems and run this as a non-privileged user (also referred to as a rootless container). I&#8217;ll use the <a href=\"https:\/\/catalog.redhat.com\/software\/containers\/ubi8\/httpd-24\/6065b844aee24f523c207943\" target=\"_blank\" rel=\"noreferrer noopener\">httpd-24 container image<\/a> that is a Red Hat <a href=\"https:\/\/developers.redhat.com\/products\/rhel\/ubi\" target=\"_blank\" rel=\"noreferrer noopener\">Universal Base Image<\/a> (UBI).<\/p>\n<h2>Setting up the control node system<\/h2>\n<p>Starting on the <em>fedora-controlnode.example.com<\/em> system, I&#8217;ll need to install the <em>linux-system-roles<\/em> and <em>ansible<\/em> packages:<\/p>\n<pre id=\"block-fd797828-bdff-425e-ae13-a5d8bfb4f98e\" class=\"wp-block-preformatted\">[ansible@fedora-controlnode ~]$ sudo dnf install linux-system-roles ansible <\/pre>\n<p>I&#8217;ll also need to configure SSH keys and the sudo configuration so that a user on the <em>fedora-controlnode.example.com<\/em> host can authenticate and escalate to root privileges on each of the three managed nodes. In this example, I am using an account named <em>ansible<\/em>. <\/p>\n<h2>Defining the Kubernetes YAML for the Nextcloud container<\/h2>\n<p>I&#8217;ll create a Kubernetes YAML file named <em>nextcloud.yml<\/em> with the following content that defines how I want the <a href=\"https:\/\/hub.docker.com\/_\/nextcloud\" target=\"_blank\" rel=\"noreferrer noopener\">Nextcloud container<\/a> configured:<\/p>\n<pre class=\"wp-block-preformatted\">apiVersion: v1\nkind: Pod\nmetadata: name: nextcloud\nspec: containers: - name: nextcloud image: docker.io\/library\/nextcloud ports: - containerPort: 80 hostPort: 8000 volumeMounts: - mountPath: \/var\/www\/html:Z name: nextcloud-html volumes: - name: nextcloud-html hostPath: path: \/nextcloud-html<\/pre>\n<p>The key parts of this YAML specify: <\/p>\n<ul>\n<li>the name of the container, <\/li>\n<li>the URL for the container image, <\/li>\n<li>that the container&#8217;s port 80 will be published on the host as port 8000, <\/li>\n<li>that the <em>\/var\/www\/html<\/em> directory should use a volume mount using the <em>\/nextcloud-html<\/em> directory on the host. <\/li>\n<\/ul>\n<h2>Defining the Kubernetes YAML for the web server<\/h2>\n<p>I&#8217;d also like to deploy a container running a web server, so I&#8217;ll define the following Kubernetes YAML file for it, named <em>ubi8-httpd.yml<\/em>:<\/p>\n<pre class=\"wp-block-preformatted\">apiVersion: v1\nkind: Pod\nmetadata: name: ubi8-httpd\nspec: containers: - name: ubi8-httpd image: registry.access.redhat.com\/ubi8\/httpd-24 ports: - containerPort: 8080 hostPort: 8080 volumeMounts: - mountPath: \/var\/www\/html:Z name: ubi8-html volumes: - name: ubi8-html hostPath: path: ubi8-html<\/pre>\n<p>This is similar to the <em>nextcloud.yml<\/em> file: <\/p>\n<ul>\n<li>specifying the name of the container,<\/li>\n<li>the URL for the container image, <\/li>\n<li>that the container&#8217;s port 8080 should be published on the host as port 8080, <\/li>\n<li>that the <em>\/var\/www\/html<\/em> directory should use a volume mount using the <em>ubi8-html<\/em> directory on the host. <\/li>\n<\/ul>\n<p>Note that later on we&#8217;ll configure this container to run as a non-privileged user, so this path will be relative to the user&#8217;s home directory. <\/p>\n<h2>Defining the Ansible inventory file<\/h2>\n<p>I need to define a Ansible inventory file that lists the host names of the systems I would like to deploy the containers on. I&#8217;ll create a simple inventory file, named <em>inventory<\/em>, with the list of my three managed nodes:<\/p>\n<pre class=\"wp-block-preformatted\">fedora-node1.example.com\nfedora-node2.example.com\nfedora-node3.example.com<\/pre>\n<h2>Defining the Ansible playbook<\/h2>\n<p>The final file I need to create is the actual Ansible playbook file, which I&#8217;ll name <em>podman.yml<\/em> with the following content:<\/p>\n<pre class=\"wp-block-preformatted\">- name: Run the podman system role hosts: all vars: podman_firewall: - port: 8080\/tcp state: enabled - port: 8000\/tcp state: enabled podman_create_host_directories: true podman_host_directories: \"ubi8-html\": owner: ansible group: ansible mode: \"0755\" podman_kube_specs: - state: started run_as_user: ansible run_as_group: ansible kube_file_src: ubi8-httpd.yml - state: started kube_file_src: nextcloud.yml roles: - fedora.linux_system_roles.podman<mark class=\"has-inline-color has-luminous-vivid-orange-color\">\n<\/mark>\n- name: Create index.html file hosts: all tasks: - ansible.builtin.copy: content: \"Hello from {{ ansible_hostname }}\" dest: \/home\/ansible\/ubi8-html\/index.html owner: ansible group: ansible mode: 0644 serole: object_r setype: container_file_t seuser: system_u<\/pre>\n<p>This playbook contains two plays, the first is named <em>Run the podman system role<\/em>. This play defines variables that control the <em>podman<\/em> system role, which is called as part of this play. The variables defined are:<\/p>\n<ul>\n<li><em>podman_firewall<\/em>: specifies that port 8080\/tcp and 8000\/tcp should be enabled. These ports are used by the <em>ubi8-httpd<\/em> and <em>nextcloud<\/em> containers, respectively.<\/li>\n<li><em>podman_create_host_directories<\/em>: specifies that host directories defined in the Kubernetes files will be created if they don&#8217;t exist<\/li>\n<li><em>podman_host_directories<\/em>: Within the <em>ubi8-httpd.html<\/em> Kubernetes YAML file, I defined a <em>ubi8-html <\/em>volume. This variable specifies that this <em>ubi8-html<\/em> directory on the hosts will be created with the <em>ansible<\/em> owner and group, and with a <em>0755<\/em> mode. Note that the <em>nextcloud-html<\/em> volume, defined in the <em>nextcloud.yml<\/em> file, is not listed here so the default ownership and permissions will be used when the directory is created on the hosts. <\/li>\n<li><em>podman_kube_specs<\/em>: This lists the Kubernetes YAML files that the <em>podman<\/em> system role should manage. It refers to the two files that were previously explained, <em>ubi8-httpd.yml<\/em>, and <em>nextcloud.yml<\/em> . Note that for the <em>ubi8-httpd.yml<\/em> container, it is also specified that this should be run as the <em>ansible<\/em> user and group. <\/li>\n<\/ul>\n<p>The second play, <em>Create index.html file<\/em>, uses the <em>ansible.builtin.copy<\/em> module to deploy a <em>index.html<\/em> file to the <em>\/home\/ansible\/ubi8-html\/<\/em> directory. This will provide the web server running from the <em>ubi8-html <\/em>containers content to serve. <\/p>\n<h2>Running the playbook<\/h2>\n<p>The next step is to run the playbook from the <em>fedora-controlnode.example.com<\/em> host with the following command:<\/p>\n<pre class=\"wp-block-preformatted\">[ansible@fedora-controlnode ~]$ ansible-playbook -i inventory -b podman.yml<\/pre>\n<p>I&#8217;ll verify that the playbook completes successfully with no failed tasks:<\/p>\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"930\" height=\"111\" src=\"https:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2022\/12\/automate-container-management-on-fedora-linux-with-the-podman-linux-system-role.png\" alt=\"\" class=\"wp-image-37399\" \/><\/figure>\n<p>At this point, the <em>nextcloud<\/em> and <em>ubi8-html<\/em> containers should be deployed on each of the three managed nodes. <\/p>\n<h2>Validating the Nextcloud containers <\/h2>\n<p>Now, I&#8217;ll validate the successful deployment of the <em>nextcloud<\/em> containers on the three managed nodes. I can validate that Nextcloud is accessible by connecting to each host on port 8000 using a web browser, which shows the Nextcloud configuration screen on each host:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"437\" height=\"813\" src=\"https:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2022\/12\/automate-container-management-on-fedora-linux-with-the-podman-linux-system-role-1.png\" alt=\"\" class=\"wp-image-37400\" \/><\/figure>\n<p>I&#8217;ll further investigate the <em>fedora-node1.example.com<\/em> host by connecting to it over SSH and using sudo to access a root shell:<\/p>\n<pre class=\"wp-block-preformatted\">[ansible@fedora-controlnode ~]$ ssh fedora-node1.example.com [ansible@fedora-node1 ~]$ sudo su - [root@fedora-node1 ~]# <\/pre>\n<p>Run <em>podman ps<\/em> to validate that the <em>nextcloud<\/em> container is running:<\/p>\n<pre class=\"wp-block-preformatted\">[root@fedora-node1 ~]# podman ps\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n7b6b131a652d localhost\/podman-pause:4.2.1-1662580699 4 minutes ago Up 4 minutes ago 0aa0edcf4b08-service\n71a2a1a48232 localhost\/podman-pause:4.2.1-1662580699 4 minutes ago Up 4 minutes ago 0.0.0.0:8000-&gt;80\/tcp 8b226e4ad5c1-infra\n<strong>c307a07c7cae docker.io\/library\/nextcloud:latest apache2-foregroun... 4 minutes ago Up 4 minutes ago 0.0.0.0:8000-&gt;80\/tcp nextcloud-nextcloud<\/strong><\/pre>\n<p>Validate that the<em> \/nextcloud-html<\/em> directory on the host has been populated with content from the container:<\/p>\n<pre class=\"wp-block-preformatted\">[root@fedora-node1 ~]# ls -al \/nextcloud-html\/\ntotal 112\ndrwxr-xr-x. 1 33 tape 420 Nov 7 13:16 .\ndr-xr-xr-x. 1 root root 186 Nov 7 13:12 ..\ndrwxr-xr-x. 1 33 tape 880 Nov 7 13:16 3rdparty\ndrwxr-xr-x. 1 33 tape 1182 Nov 7 13:16 apps\n-rw-r--r--. 1 33 tape 19327 Nov 7 13:16 AUTHORS\ndrwxr-xr-x. 1 33 tape 408 Nov 7 13:17 config\n-rw-r--r--. 1 33 tape 4095 Nov 7 13:16 console.php\n-rw-r--r--. 1 33 tape 34520 Nov 7 13:16 COPYING\ndrwxr-xr-x. 1 33 tape 440 Nov 7 13:16 core\n...\n...<\/pre>\n<p>I can also see that a systemd unit has created for this container:<\/p>\n<pre class=\"wp-block-preformatted\">[root@fedora-node1 ~]# systemctl list-units | grep nextcloud podman-kube@-etc-containers-ansible\\x2dkubernetes.d-nextcloud.yml.service loaded active running A template for running K8s workloads via podman-play-kube [root@fedora-node1 ~]# systemctl status podman-kube@-etc-containers-ansible\\\\x2dkubernetes.d-nextcloud.yml.service \u25cf podman-kube@-etc-containers-ansible\\x2dkubernetes.d-nextcloud.yml.service - A template for running K8s workloads via podman-play-kube Loaded: loaded (\/usr\/lib\/systemd\/system\/podman-kube@.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-11-07 13:16:52 MST; 7min ago Docs: man:podman-play-kube(1) Main PID: 7601 (conmon) Tasks: 3 (limit: 4655) Memory: 31.1M CPU: 2.562s\n...\n...<\/pre>\n<p>Note that the name of the service is quite long because it refers to the name of the Kubernetes YAML file, <em>\/etc\/containers\/ansible-kubernetes.d\/nextcloud.yml<\/em>. This file was deployed by the <em>podman<\/em> system role. If I display the contents of the file, it matches the contents of the <em>nextcloud.yml<\/em> Kubernetes YAML file I created on the control node host. <\/p>\n<pre class=\"wp-block-preformatted\">[root@fedora-node1 ~]# cat \/etc\/containers\/ansible-kubernetes.d\/nextcloud.yml apiVersion: v1\nkind: Pod\nmetadata: name: nextcloud\nspec: containers: - image: docker.io\/library\/nextcloud name: nextcloud ports: - containerPort: 80 hostPort: 8000 volumeMounts: - mountPath: \/var\/www\/html:Z name: nextcloud-html volumes: - hostPath: path: \/nextcloud-html name: nextcloud-html<\/pre>\n<h2>Validating the ubi8-httpd containers<\/h2>\n<p>I&#8217;ll also validate that the <em>ub8-httpd<\/em> container, which was deployed to run as the <em>ansible<\/em> user and group, is working properly. Back on the <em>fedora-controlnode.example.com<\/em> host, I&#8217;ll validate that I can access the web server on port 8080 on each of the three managed nodes:<\/p>\n<pre class=\"wp-block-preformatted\">[ansible@fedora-controlnode ~]$ for server in fedora-node1.example.com fedora-node2.example.com fedora-node3.example.com; do curl ${server}:8080; echo; done<br \/>Hello from fedora-node1<br \/>Hello from fedora-node2<br \/>Hello from fedora-node3<\/pre>\n<p>I&#8217;ll also connect to one of the managed nodes as the <em>ansible<\/em> user to further investigate:<\/p>\n<pre class=\"wp-block-preformatted\">[ansible@fedora-controlnode ~]$ ssh fedora-node1.example.com\n[ansible@fedora-node1 ~]$ whoami\nansible<\/pre>\n<p>I&#8217;ll run <em>podman ps<\/em> and validate that the ubi8-httpd container is running:<\/p>\n<pre class=\"wp-block-preformatted\">[ansible@fedora-node1 ~]$ podman ps\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n7b42efd7c9c0 localhost\/podman-pause:4.2.1-1662580699 20 minutes ago Up 20 minutes ago 1b46d9874ed0-service\nf62b9a2ef9b8 localhost\/podman-pause:4.2.1-1662580699 20 minutes ago Up 20 minutes ago 0.0.0.0:8080-&gt;8080\/tcp 0938dc63acfd-infra\n<strong>4b3a64783aeb registry.access.redhat.com\/ubi8\/httpd-24:latest \/usr\/bin\/run-http... 20 minutes ago Up 20 minutes ago 0.0.0.0:8080-&gt;8080\/tcp ubi8-httpd-ubi8-httpd<\/strong><\/pre>\n<p>This container was deployed as a non-privileged user (the <em>ansible<\/em> user) so there is a systemd user instance running as the <em>ansible<\/em> user. I&#8217;ll need to specify the <em>&#8211;user<\/em> option on the <em>systemctl<\/em> command when validating that the systemd unit was created and is running:<\/p>\n<pre class=\"wp-block-preformatted\">[ansible@fedora-node1 ~]$ systemctl --user list-units | grep ubi8 podman-kube@-home-ansible-.config-containers-ansible\\x2dkubernetes.d-ubi8\\x2dhttpd.yml.service loaded active running A template for running K8s workloads via podman-play-kube [ansible@fedora-node1 ~]$ systemctl --user status podman-kube@-home-ansible-.config-containers-ansible\\\\x2dkubernetes.d-ubi8\\\\x2dhttpd.yml.service \u25cf podman-kube@-home-ansible-.config-containers-ansible\\x2dkubernetes.d-ubi8\\x2dhttpd.yml.service - A template for running K8s workloads via podman-play-kube Loaded: loaded (\/usr\/lib\/systemd\/user\/podman-kube@.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-11-07 13:12:31 MST; 24min ago Docs: man:podman-play-kube(1) Main PID: 5260 (conmon) Tasks: 17 (limit: 4655) Memory: 9.3M CPU: 1.245s\n...\n...<\/pre>\n<p>As previously mentioned, the systemd unit name is so long because it contains the path to the Kubernetes YAML file, which in this case is <em>\/home\/ansible\/.config\/containers\/ansible-kubernetes.d\/ubi8-httpd.yml<\/em>. This file was deployed by the <em>podman<\/em> system role and contains the contents of the <em>ubi8-httpd.yml<\/em> file previously configured on the <em>fedora-controlnode.example.com<\/em> host. <\/p>\n<h2>Validating containers automatically start at boot<\/h2>\n<p>I&#8217;ll reboot the three managed nodes to validate that the containers automatically start up at boot. <\/p>\n<p>After the reboot, the <em>nextcloud<\/em> containers are still accessible on each host on port 8000, and the <em>ubi8-httpd<\/em> containers are accessible on each host at port 8080. <\/p>\n<p>The systemd units for the <em>nextcloud<\/em> containers and <em>ubi8-httpd<\/em> containers are both enabled to start at boot. However, note that the <em>ubi8-httpd<\/em> container is running as a non-privileged user (the <em>ansible<\/em> user) , so the <em>podman<\/em> system role has automatically enabled user lingering for the <em>ansible<\/em> user. This setting enables a systemd user instance to be started at boot, and to keep running when the user logs out, so that the container will automatically start at boot. <\/p>\n<h2>Conclusion<\/h2>\n<p>The <em>podman<\/em> Linux System Role can help automate the deployment of Podman containers across your Fedora Linux environment. You can also combine the <em>podman<\/em> system role with the other Linux System Roles in the Fedora <em>linux-system-roles<\/em> package to automate even more. For example, you could write a playbook that utilizes the <em>storage<\/em> Linux System Role to configure filesystems across your environment, and then use the <em>podman<\/em> system role to deploy containers that utilize those filesystems. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Containers are a popular way to distribute and run software on Linux. One of the tools included in Fedora Linux to work with containers is the Pod Manager tool, also known as Podman. This article describes the use of the Ansible Podman Linux System Roles to automate container management. With Podman, you can quickly and [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":130452,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[45,61,46,47],"class_list":["post-130451","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fedora-os","tag-fedora","tag-fedora-project-community","tag-magazine","tag-news"],"_links":{"self":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/130451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/comments?post=130451"}],"version-history":[{"count":0,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/130451\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media\/130452"}],"wp:attachment":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media?parent=130451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/categories?post=130451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/tags?post=130451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}