{"id":31860,"date":"2025-06-10T20:56:18","date_gmt":"2025-06-10T18:56:18","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=31860"},"modified":"2025-06-10T20:56:20","modified_gmt":"2025-06-10T18:56:20","slug":"parallel-execution-of-ansible-roles","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/","title":{"rendered":"Parallel execution of Ansible roles"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"h-introduction\">Introduction<\/h2>\n\n\n\n<p>You can run a playbook for specific host(s), a group of hosts, or &#8220;all&#8221; (all hosts of the inventory). <\/p>\n\n\n\n<p>Ansible will then run the tasks in parallel on the specified hosts. To avoid an overload, the parallelism &#8211; called &#8220;forks&#8221; &#8211; is limited to 5 per default.<\/p>\n\n\n\n<p>A task with a loop (e.g. <code>with_items:<\/code>) will be executed serially per default. To run it in parallel, you can use the &#8220;async&#8221; mode. <\/p>\n\n\n\n<p>But unfortunately, this async mode will not work to include roles or other playbooks in the loop. In this blog post we will see a workaround to run roles in parallel (on the same host).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-parallelization-over-the-ansible-hosts\">Parallelization over the ansible hosts<\/h2>\n\n\n\n<p>In this example, we have 3 hosts (dbhost1, dbhost2, dbhost3) in the dbservers group <br>(use <code>ansible-inventory --graph<\/code> to see all your groups) and we run the following sleep1.yml playbook <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- name: PLAY1\n  hosts: &#091;dbservers]\n  gather_facts: no\n  tasks:\n    - ansible.builtin.wait_for: timeout=10<\/code><\/pre>\n\n\n\n<p>The tasks of the playbook will run in  parallel on all hosts of the <code>dbservers<\/code> group, but not more at the same time as specified with the &#8220;forks&#8221; parameter. (specified in ansible.cfg, shell-variable ANSIBLE_FORKS, commandline parameter &#8211;forks)<br><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_strategies.html\">https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_strategies.html<\/a><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ time ansible-playbook sleep1.yml --forks 2\n...\nok: &#x5B;dbhost1]  #appears after 10sec\nok: &#x5B;dbhost2]  #appears after 10sec\nok: &#x5B;dbhost3]  #appears after 20sec\n...\nreal    0m22.384s\n<\/pre><\/div>\n\n\n<p>With forks=2 the results of dbhost1 and dbhost2 will both be returned after 10 seconds (sleep 10 in parallel). dbhost3 has to wait until one of the running tasks is completed. So the playbook will complete after approx. 20 seconds. If forks is 1, then it takes 30s, if forks is 3, it takes 10s (plus overhead).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-parallelization-of-loops\">Parallelization of loops<\/h2>\n\n\n\n<p>Per default, a loop is not run in parallel<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- name: PLAY2A\n  hosts: localhost\n  tasks:\n    - set_fact:\n        sleepsec: &#091; 1, 2, 3, 4, 5, 6, 7 ]\n\n    - name: nonparallel loop\n      ansible.builtin.wait_for: \"timeout={{item}} \"\n      with_items: \"{{sleepsec}}\"\n      register: loop_result\n<\/code><\/pre>\n\n\n\n<p>This sequential run will take at least 28 seconds. <\/p>\n\n\n\n<p>To run the same loop in parallel, use &#8220;async&#8221;<br><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_async.html\">https:\/\/docs.ansible.com\/ansible\/latest\/playbook_guide\/playbooks_async.html<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- name: PLAY2B\n  hosts: localhost\n  gather_facts: no\n  tasks:\n    - name: parallel loop\n      ansible.builtin.wait_for: \"timeout={{item}}\"\n      with_items: \"{{sleepsec}}\"\n      register: loop_result\n      async: 600  # Maximum runtime in seconds. Adjust as needed.\n      poll: 0     # Fire and continue (never poll here)\n\n    # in the meantime, you can run other tasks\n\n    - name: Wait for parallel loop to finish (poll)\n      async_status:\n        jid: \"{{ item.ansible_job_id }}\"\n      register: loop_check\n      until: loop_check.finished\n      delay: 1      # Check every 1 seconds\n      retries: 600  # Retry up to 600 times. \n                    # delay*retries should be \"async:\" above\n      with_items: \"{{ loop_result.results }}\"\n<\/code><\/pre>\n\n\n\n<p>In the first task we start all sleeps in parallel. It will timeout after 600 seconds. We will not wait for the result (poll: 0). A later task polls the background processes until all parallel loops are finished. This execution only takes a little bit more than 7 seconds (the longest sleep plus some overhead). Between the loop and the poll you can add other tasks to use the waiting time for something more productive. Or if you know your loop takes at least 1 minute, then you can add to reduce the overhead of the polling loop, an <code>ansible.builtin.wait_for: \"timeout=60\"<\/code>.<\/p>\n\n\n\n<p>For example, we have an existing role to create and configure a new useraccount with many, sometimes longer running steps, e.g. add to LDAP, create NFS share, create a certificate, send a welcome-mail, &#8230;.; most of these tasks are not bound to a specific host, and will run on &#8220;localhost&#8221; calling a REST-API.<\/p>\n\n\n\n<p>The following code example is a dummy role for copy\/paste to see how it works with parallel execution.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># roles\/create_user\/tasks\/main.yml    \n    - debug: var=user\n    - ansible.builtin.wait_for: timeout=10<\/code><\/pre>\n\n\n\n<p>Now we have to create many useraccounts and would like to do that  in parallel. We use the code above and adapt it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- name: PLAY3A\n  hosts: localhost\n  gather_facts: no\n  tasks:\n    - set_fact:\n        users: &#091; 'Dave', 'Eva', 'Hans' ]\n\n    - name: parallel user creation\n      ansible.builtin.include_role: name=create_user\n      with_items: \"{{users}}\"\n      loop_control:\n        loop_var: user\n      register: loop_result\n      async: 600\n      poll: 0<\/code><\/pre>\n\n\n\n<p>But unfortunately, Ansible will not accept include_role: <br><code>ERROR! 'poll' is not a valid attribute for a IncludeRole<\/code><\/p>\n\n\n\n<p>The only solution is to rewrite the role and to run every task with the async mode. <\/p>\n\n\n\n<p>But is there no better solution to re-use existing roles? Let&#8217;s see&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-parallel-execution-of-roles-in-a-loop\">Parallel execution of roles in a loop<\/h2>\n\n\n\n<p>As we already know<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ansible can run playbooks\/tasks in parallel over different hosts (hosts parameter of the play).<\/li>\n\n\n\n<li>Ansible can run tasks with a loop in parallel with the async option, but<\/li>\n\n\n\n<li>Ansible can NOT run tasks with a loop in parallel for include_role or include_tasks<\/li>\n<\/ul>\n\n\n\n<p>So, the trick will be to run the roles on &#8220;different&#8221; hosts. There is a special behavior of localhost. Well-known is the localhost IP 127.0.0.1; But also 127.0.0.2 to 127.255.255.254 refer to localhost (check it with &#8216;ping&#8217;). For our create-user script: we will run it on &#8220;different&#8221; localhosts in parallel. For that, we create a host-group at runtime with localhost addresses. The number of these localhost IP&#8217;s is equal to the number of users to create.<\/p>\n\n\n\n<p>users[0] is Dave. It will be created on 127.0.0.1<br>users[1] is Eva. It will be created on 127.0.0.2<br>users[2] is Hans. It will be created on 127.0.0.3<br>&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- name: create dynamic localhosts group\n  hosts: localhost\n  gather_facts: no\n  vars:\n    users: &#091; 'Dave', 'Eva', 'Hans' ]\n  tasks:\n    # Create a group of localhost IP's; \n    # Ansible will treat it as \"different\" hosts.\n    # To know, which locahost-IP should create which user:\n    # The last 2 numbers of the IP matches the element of the {{users}} list:\n    # 127.0.1.12 -&gt; (1*256 + 12)-1 = 267 -&gt; users&#091;267]\n    # -1: first Array-Element is 0, but localhost-IP starts at 127.0.0.1\n    - name: create parallel execution localhosts group\n      add_host:\n        name: \"127.0.{{item|int \/\/ 256}}.{{ item|int % 256 }}\"\n        group: localhosts\n      with_sequence:  start=1  end=\"{{users|length}}\" \n\n- name: create useraccounts\n  hosts: &#091;localhosts]  # &#091; 127.0.0.1, 127.0.0.2, ... ]\n  connection: local\n  gather_facts: no\n  vars:\n    users: &#091; 'Dave', 'Eva', 'Hans' ]\n  # this play runs in parallel over the &#091;localhosts] \n  tasks:\n    - set_fact:\n        ip_nr: \"{{ inventory_hostname.split('.') }}\"\n\n    - name: parallel user creation\n      ansible.builtin.include_role:\n        name: create_user\n      vars:\n        user: \"{{ users&#091; (ip_nr&#091;2]|int*256 + ip_nr&#091;3]|int-1) ] }}\"\n<\/code><\/pre>\n\n\n\n<p>In this example: With forks=3 it runs in 11 seconds. With forks=1 (no parallelism) it takes 32 seconds.<\/p>\n\n\n\n<p>The degree of parallelism (forks) depends on your use-case and your infrastructure. If you have to restore files, probably the network-bandwith, disk-I\/O or the number of tape-slots is limited. Choose a value of forks that does not overload your infrastructure.<\/p>\n\n\n\n<p>If some tasks or the whole role has to be run on another host than localhost (e.g. create a local useraccount on a server), then you can use <code>delegate_to: \"{{remote_host}}\"<\/code>.<\/p>\n\n\n\n<p>This principle can ideally be used for plays that are not bound to a specific host, usually for tasks that will run from localhost and calling a REST-API without logging in with ssh to a server. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-summary\">Summary<\/h2>\n\n\n\n<p>Ansible is optimized to run playbooks on different hosts in parallel. The degree of parallelism can be limited by the &#8220;forks&#8221; parameter (default 5).<\/p>\n\n\n\n<p>Ansible can run loops in parallel with the async mode. Unfortunately that does not work if we include a role or tasks.<\/p>\n\n\n\n<p>The workaround to run roles in parallel on the same host is to assign every loop item to a different host, and then to run the role on different hosts. For the different hosts we can use the localhost IP&#8217;s between 127.0.0.1 and 127.255.255.254 to build a dynamic host-group; the number corresponds to number of loop items<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction You can run a playbook for specific host(s), a group of hosts, or &#8220;all&#8221; (all hosts of the inventory). Ansible will then run the tasks in parallel on the specified hosts. To avoid an overload, the parallelism &#8211; called &#8220;forks&#8221; &#8211; is limited to 5 per default. A task with a loop (e.g. with_items:) [&hellip;]<\/p>\n","protected":false},"author":123,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1321,1320],"tags":[],"type_dbi":[],"class_list":["post-31860","post","type-post","status-publish","format-standard","hentry","category-ansible","category-devops"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Parallel execution of Ansible roles - dbi Blog<\/title>\n<meta name=\"description\" content=\"Ansible: How to run tasks in parallel. And how to run tasks including roles in parallel (which is not implemented by Ansible)\" \/>\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.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Parallel execution of Ansible roles\" \/>\n<meta property=\"og:description\" content=\"Ansible: How to run tasks in parallel. And how to run tasks including roles in parallel (which is not implemented by Ansible)\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-10T18:56:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-10T18:56:20+00:00\" \/>\n<meta name=\"author\" content=\"Martin Bracher\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Bracher\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/\"},\"author\":{\"name\":\"Martin Bracher\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/86cb065eea74ac30961c4cc45ce56c9e\"},\"headline\":\"Parallel execution of Ansible roles\",\"datePublished\":\"2025-06-10T18:56:18+00:00\",\"dateModified\":\"2025-06-10T18:56:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/\"},\"wordCount\":891,\"commentCount\":0,\"articleSection\":[\"Ansible\",\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/\",\"name\":\"Parallel execution of Ansible roles - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2025-06-10T18:56:18+00:00\",\"dateModified\":\"2025-06-10T18:56:20+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/86cb065eea74ac30961c4cc45ce56c9e\"},\"description\":\"Ansible: How to run tasks in parallel. And how to run tasks including roles in parallel (which is not implemented by Ansible)\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/parallel-execution-of-ansible-roles\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Parallel execution of Ansible roles\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/86cb065eea74ac30961c4cc45ce56c9e\",\"name\":\"Martin Bracher\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/864a93d77bcd4cd44bab880a88f25fb5173ffbfac8e6e8775f0b4e056a4fbb56?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/864a93d77bcd4cd44bab880a88f25fb5173ffbfac8e6e8775f0b4e056a4fbb56?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/864a93d77bcd4cd44bab880a88f25fb5173ffbfac8e6e8775f0b4e056a4fbb56?s=96&d=mm&r=g\",\"caption\":\"Martin Bracher\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/martinbracher\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Parallel execution of Ansible roles - dbi Blog","description":"Ansible: How to run tasks in parallel. And how to run tasks including roles in parallel (which is not implemented by Ansible)","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.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/","og_locale":"en_US","og_type":"article","og_title":"Parallel execution of Ansible roles","og_description":"Ansible: How to run tasks in parallel. And how to run tasks including roles in parallel (which is not implemented by Ansible)","og_url":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/","og_site_name":"dbi Blog","article_published_time":"2025-06-10T18:56:18+00:00","article_modified_time":"2025-06-10T18:56:20+00:00","author":"Martin Bracher","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Martin Bracher","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/"},"author":{"name":"Martin Bracher","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/86cb065eea74ac30961c4cc45ce56c9e"},"headline":"Parallel execution of Ansible roles","datePublished":"2025-06-10T18:56:18+00:00","dateModified":"2025-06-10T18:56:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/"},"wordCount":891,"commentCount":0,"articleSection":["Ansible","DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/","url":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/","name":"Parallel execution of Ansible roles - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2025-06-10T18:56:18+00:00","dateModified":"2025-06-10T18:56:20+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/86cb065eea74ac30961c4cc45ce56c9e"},"description":"Ansible: How to run tasks in parallel. And how to run tasks including roles in parallel (which is not implemented by Ansible)","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/parallel-execution-of-ansible-roles\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Parallel execution of Ansible roles"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/86cb065eea74ac30961c4cc45ce56c9e","name":"Martin Bracher","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/864a93d77bcd4cd44bab880a88f25fb5173ffbfac8e6e8775f0b4e056a4fbb56?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/864a93d77bcd4cd44bab880a88f25fb5173ffbfac8e6e8775f0b4e056a4fbb56?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/864a93d77bcd4cd44bab880a88f25fb5173ffbfac8e6e8775f0b4e056a4fbb56?s=96&d=mm&r=g","caption":"Martin Bracher"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/martinbracher\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/31860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/123"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=31860"}],"version-history":[{"count":25,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/31860\/revisions"}],"predecessor-version":[{"id":39093,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/31860\/revisions\/39093"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=31860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=31860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=31860"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=31860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}