{"id":391,"date":"2024-03-01T09:12:16","date_gmt":"2024-03-01T08:12:16","guid":{"rendered":"https:\/\/www.codeschoepfer.de\/?p=391"},"modified":"2024-06-08T13:51:28","modified_gmt":"2024-06-08T11:51:28","slug":"installing-updates-on-gnu-linux-using-ansible","status":"publish","type":"post","link":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/","title":{"rendered":"Installing Updates on GNU\/Linux using Ansible"},"content":{"rendered":"<p> <img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/gnu-blog-960_480.jpg\" alt=\"Ansible\" class=\"img-float-left\" \/>Patching Linux systems is a vital task to ensure security, performance, and stability. Doing this manually across multiple servers can be an error prone and time consuming task. That is where Ansible comes in, a powerful automation tool that simplifies the process of updating Linux systems. Compared to the Windows Server patching described in another blog post the Linux part is easier.<\/p>\n<\/p>\n<h2>The Ansible Playbook<\/h2>\n<p>In our automation environment we use roles to make the playbook reusable by different functions. Here we took out the most important functions to form a simple playbook for demonstration purposes.<\/p>\n<p>We are planning to provide a public access to our Git later, where you can fetch those files.<\/p>\n<p>For demonstration purposes, we have chosen the Ansible Apt module to showcase patching on Debian GNU\/Linux. This module also works seamlessly with Ubuntu Server systems and Proxmox. Additionally, Ansible provides other modules tailored for different Linux distributions, including SuSE (using the zypper module), Red Hat (using Yum\/DNF), and Arch Linux (using Pacman), ensuring coverage in various environments.<\/p>\n<h3>hosts.ini<\/h3>\n<pre><code class=\"language-ini\">[debian]\ndebian ansible_host=172.16.66.66<\/code><\/pre>\n<h3>linux-updates.yaml<\/h3>\n<p>The file, along with the accompanying comments, should be self-explanatory. We will dive into the crucial aspects of the file in the following section.<\/p>\n<pre><code class=\"language-yaml\">---\n# Tasks for patching GNU\/Linux Server\n\n- name: GNU\/Linux Update Playbook\n  hosts: debian\n  gather_facts: false\n  become: true\n\n  tasks:\n    # Update the Apt Cache if it is older that one hour.\n    - name: Update the Apt cache\n      ansible.builtin.apt:\n        update_cache: yes\n        cache_valid_time: 3600\n\n    - name: Proof needrestart is installed, if not install it\n      ansible.builtin.apt:\n        name: needrestart\n\n    - name: Upgrade all packages to the most recent version\n      ansible.builtin.apt:\n        upgrade: full\n        clean: yes\n        autoremove: yes\n        autoclean: yes\n      environment:\n        - NEEDRESTART_MODE: automatically\n\n    - name: Check if a rebooted is required\n      stat:\n        path: \/var\/run\/reboot-required\n      register: reboot_required\n\n    - name: Reboot the machine if required\n      ansible.builtin.reboot:\n        msg: \"Rebooting due to system updates\"\n        connect_timeout: 5\n        reboot_timeout: 360\n        pre_reboot_delay: 0\n        post_reboot_delay: 30\n        test_command: uptime\n      when: reboot_required.stat.exists<\/code><\/pre>\n<h3>Execute the playbook<\/h3>\n<p>Executing the playbook is straightforward: you can run it using the <code>ansible-playbook<\/code> command, or through automation platforms like Ansible AWX or Ansible Semaphore, among others.<\/p>\n<pre><code class=\"language-bash\">\u279c ansible-playbook -i hosts.ini linux-updates.yaml<\/code><\/pre>\n<h2>Further Explanations<\/h2>\n<p>In this section, we will dive a little bit deeper into the special sections of the previously mentioned playbook file.<\/p>\n<h3>Update the Apt cache<\/h3>\n<p>When know Debian you have to ensure your package cache is recent, so that the system do know the lastest updates. You need to refresh the package cache in all commonly used systems like Red Hat and SuSE, too.<\/p>\n<pre><code class=\"language-yaml\">    # Update the Apt Cache if it is older that one hour.\n    - name: Update the Apt cache\n      ansible.builtin.apt:\n        update_cache: yes\n        cache_valid_time: 3600<\/code><\/pre>\n<h3>Install new patches?<\/h3>\n<p>Except of the use of <em>needrestart<\/em> there is nothing special here. We just do a full upgrade using Apt and do an autoremove afterwards, which does remove old kernel packages and the like. And with the <em>clean<\/em> we instruct Apt to do a package cleanup in the local package repository to save disk space.<\/p>\n<p><strong>needrestart<\/strong> is needed to determine services which have been updated and require a restart. Multiple solutions are available to determine the same, for example check out <em>checkrestart<\/em> out of the <em>debian-goodies<\/em> package. Needrestart makes the handling quite easy, during installtion of the package an Apt handler is automatically installed, which gets instructed by the environment variable <code>NEEDRESTART_MODE<\/code>.<\/p>\n<pre><code class=\"language-yaml\">    - name: Proof needrestart is installed, if not install it\n      ansible.builtin.apt:\n        name: needrestart\n\n    - name: Upgrade all packages to the most recent version\n      ansible.builtin.apt:\n        upgrade: full\n        clean: yes\n        autoremove: yes\n      environment:\n        - NEEDRESTART_MODE: automatically<\/code><\/pre>\n<h3>Do we need to reboot?<\/h3>\n<p>In the end Ansible determines whether a system reboot is required or not. If the file <code>\/var\/run\/reboot-required<\/code> was generated by Apt, Ansible starts the reboot process.<\/p>\n<pre><code class=\"language-yaml\">    - name: Check if a rebooted is required\n      stat:\n        path: \/var\/run\/reboot-required\n      register: reboot_required\n\n    - name: Reboot the machine if required\n      ansible.builtin.reboot:\n        msg: \"Rebooting due to system updates\"\n        connect_timeout: 5\n        reboot_timeout: 360\n        pre_reboot_delay: 0\n        post_reboot_delay: 30\n        test_command: uptime\n      when: reboot_required.stat.exists<\/code><\/pre>\n<h2>Final Toughts<\/h2>\n<p>Even though the gerenal patching process in easier compared to the Windows world. The Linux world can get more complicated when you have to patch cluster systems where the nodes have to be rebooted in a sequenced way (for example: Kubernetes, Ceph or classic HA clusters). You have to keep in mind, patching just the Operating System is not sufficient when you drive Podman or Docker containers on top of your systems.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Manual updates across multiple servers can be tedious and error-prone. Ansible automates and simplifies this, making Linux updates easier.<\/p>\n","protected":false},"author":1,"featured_media":564,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,21],"tags":[],"class_list":["post-391","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-install-en","category-linux-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Installing Updates on GNU\/Linux using Ansible - Codesch\u00f6pfer GmbH<\/title>\n<meta name=\"description\" content=\"Manual updates across multiple servers can be tedious and error-prone. Ansible automates and simplifies this, making Linux updates easier.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Installing Updates on GNU\/Linux using Ansible - Codesch\u00f6pfer GmbH\" \/>\n<meta property=\"og:description\" content=\"Manual updates across multiple servers can be tedious and error-prone. Ansible automates and simplifies this, making Linux updates easier.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/\" \/>\n<meta property=\"og:site_name\" content=\"Codesch\u00f6pfer GmbH\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-01T08:12:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-08T11:51:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/05\/gnu-blog-960_480.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"480\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"SWigand\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@codeschoepfer\" \/>\n<meta name=\"twitter:site\" content=\"@codeschoepfer\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"SWigand\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/\"},\"author\":{\"name\":\"SWigand\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#\\\/schema\\\/person\\\/02681979bb8b0335811903f12812deda\"},\"headline\":\"Installing Updates on GNU\\\/Linux using Ansible\",\"datePublished\":\"2024-03-01T08:12:16+00:00\",\"dateModified\":\"2024-06-08T11:51:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/\"},\"wordCount\":517,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codeschoepfer.de\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/gnu-blog-960_480.jpg\",\"articleSection\":[\"Install\",\"Linux\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/\",\"url\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/\",\"name\":\"Installing Updates on GNU\\\/Linux using Ansible - Codesch\u00f6pfer GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codeschoepfer.de\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/gnu-blog-960_480.jpg\",\"datePublished\":\"2024-03-01T08:12:16+00:00\",\"dateModified\":\"2024-06-08T11:51:28+00:00\",\"description\":\"Manual updates across multiple servers can be tedious and error-prone. Ansible automates and simplifies this, making Linux updates easier.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codeschoepfer.de\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/gnu-blog-960_480.jpg\",\"contentUrl\":\"https:\\\/\\\/www.codeschoepfer.de\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/gnu-blog-960_480.jpg\",\"width\":960,\"height\":480,\"caption\":\"GNU\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/installing-updates-on-gnu-linux-using-ansible\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Installing Updates on GNU\\\/Linux using Ansible\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/\",\"name\":\"Codesch\u00f6pfer GmbH\",\"description\":\"Codesch\u00f6pfer GmbH\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#organization\",\"name\":\"Codesch\u00f6pfer GmbH\",\"url\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codeschoepfer.de\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/logo_cs_vlinks_rgb.png\",\"contentUrl\":\"https:\\\/\\\/www.codeschoepfer.de\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/logo_cs_vlinks_rgb.png\",\"width\":723,\"height\":202,\"caption\":\"Codesch\u00f6pfer GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/codeschoepfer\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/codeschoepfer\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/#\\\/schema\\\/person\\\/02681979bb8b0335811903f12812deda\",\"name\":\"SWigand\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0776bc73f0cf88d13c2bcf9ae4d44c263da721e7df582404bb666a5a12a0504b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0776bc73f0cf88d13c2bcf9ae4d44c263da721e7df582404bb666a5a12a0504b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0776bc73f0cf88d13c2bcf9ae4d44c263da721e7df582404bb666a5a12a0504b?s=96&d=mm&r=g\",\"caption\":\"SWigand\"},\"sameAs\":[\"https:\\\/\\\/www.codeschoepfer.de\"],\"url\":\"https:\\\/\\\/www.codeschoepfer.de\\\/en\\\/author\\\/swigand\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Installing Updates on GNU\/Linux using Ansible - Codesch\u00f6pfer GmbH","description":"Manual updates across multiple servers can be tedious and error-prone. Ansible automates and simplifies this, making Linux updates easier.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/","og_locale":"en_US","og_type":"article","og_title":"Installing Updates on GNU\/Linux using Ansible - Codesch\u00f6pfer GmbH","og_description":"Manual updates across multiple servers can be tedious and error-prone. Ansible automates and simplifies this, making Linux updates easier.","og_url":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/","og_site_name":"Codesch\u00f6pfer GmbH","article_published_time":"2024-03-01T08:12:16+00:00","article_modified_time":"2024-06-08T11:51:28+00:00","og_image":[{"width":960,"height":480,"url":"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/05\/gnu-blog-960_480.jpg","type":"image\/jpeg"}],"author":"SWigand","twitter_card":"summary_large_image","twitter_creator":"@codeschoepfer","twitter_site":"@codeschoepfer","twitter_misc":{"Written by":"SWigand","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/#article","isPartOf":{"@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/"},"author":{"name":"SWigand","@id":"https:\/\/www.codeschoepfer.de\/en\/#\/schema\/person\/02681979bb8b0335811903f12812deda"},"headline":"Installing Updates on GNU\/Linux using Ansible","datePublished":"2024-03-01T08:12:16+00:00","dateModified":"2024-06-08T11:51:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/"},"wordCount":517,"publisher":{"@id":"https:\/\/www.codeschoepfer.de\/en\/#organization"},"image":{"@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/05\/gnu-blog-960_480.jpg","articleSection":["Install","Linux"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/","url":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/","name":"Installing Updates on GNU\/Linux using Ansible - Codesch\u00f6pfer GmbH","isPartOf":{"@id":"https:\/\/www.codeschoepfer.de\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/#primaryimage"},"image":{"@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/05\/gnu-blog-960_480.jpg","datePublished":"2024-03-01T08:12:16+00:00","dateModified":"2024-06-08T11:51:28+00:00","description":"Manual updates across multiple servers can be tedious and error-prone. Ansible automates and simplifies this, making Linux updates easier.","breadcrumb":{"@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/#primaryimage","url":"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/05\/gnu-blog-960_480.jpg","contentUrl":"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/05\/gnu-blog-960_480.jpg","width":960,"height":480,"caption":"GNU"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codeschoepfer.de\/en\/installing-updates-on-gnu-linux-using-ansible\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/www.codeschoepfer.de\/en\/"},{"@type":"ListItem","position":2,"name":"Installing Updates on GNU\/Linux using Ansible"}]},{"@type":"WebSite","@id":"https:\/\/www.codeschoepfer.de\/en\/#website","url":"https:\/\/www.codeschoepfer.de\/en\/","name":"Codesch\u00f6pfer GmbH","description":"Codesch\u00f6pfer GmbH","publisher":{"@id":"https:\/\/www.codeschoepfer.de\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codeschoepfer.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codeschoepfer.de\/en\/#organization","name":"Codesch\u00f6pfer GmbH","url":"https:\/\/www.codeschoepfer.de\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codeschoepfer.de\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/04\/logo_cs_vlinks_rgb.png","contentUrl":"https:\/\/www.codeschoepfer.de\/wp-content\/uploads\/2024\/04\/logo_cs_vlinks_rgb.png","width":723,"height":202,"caption":"Codesch\u00f6pfer GmbH"},"image":{"@id":"https:\/\/www.codeschoepfer.de\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/codeschoepfer","https:\/\/www.linkedin.com\/company\/codeschoepfer\/"]},{"@type":"Person","@id":"https:\/\/www.codeschoepfer.de\/en\/#\/schema\/person\/02681979bb8b0335811903f12812deda","name":"SWigand","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0776bc73f0cf88d13c2bcf9ae4d44c263da721e7df582404bb666a5a12a0504b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0776bc73f0cf88d13c2bcf9ae4d44c263da721e7df582404bb666a5a12a0504b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0776bc73f0cf88d13c2bcf9ae4d44c263da721e7df582404bb666a5a12a0504b?s=96&d=mm&r=g","caption":"SWigand"},"sameAs":["https:\/\/www.codeschoepfer.de"],"url":"https:\/\/www.codeschoepfer.de\/en\/author\/swigand\/"}]}},"_links":{"self":[{"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/posts\/391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/comments?post=391"}],"version-history":[{"count":10,"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/posts\/391\/revisions"}],"predecessor-version":[{"id":671,"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/posts\/391\/revisions\/671"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/media\/564"}],"wp:attachment":[{"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/media?parent=391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/categories?post=391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codeschoepfer.de\/en\/wp-json\/wp\/v2\/tags?post=391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}