{"id":20651,"date":"2022-11-25T14:57:06","date_gmt":"2022-11-25T13:57:06","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=20651"},"modified":"2024-09-11T10:25:48","modified_gmt":"2024-09-11T08:25:48","slug":"jboss-eap-and-wildfly-cli-scripting-via-ansible","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/","title":{"rendered":"JBoss EAP (and WildFly) cli Scripting via Ansible"},"content":{"rendered":"\n<p>As I am working on a new <a href=\"https:\/\/www.dbi-services.com\/products\/yak\/\" target=\"_blank\" rel=\"noreferrer noopener\">YaK<\/a> component to deploy a JBoss-EAP\/WildFly server, I decided to configure it with help of jboss-cli.sh scripting tool instead of direct modification of xml files. The idea is to create a script on the server via Jinja templates and then run it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tasks<\/h2>\n\n\n\n<p>The role has only one main.yml file which is doing the following:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a temporary script using ansible.builtin.tempfile<\/li>\n\n\n\n<li>Write operations into this file<\/li>\n\n\n\n<li>Run it<\/li>\n\n\n\n<li>Remove the file<\/li>\n<\/ol>\n\n\n\n<p>Theses tasks are in a block with an associate rescue block to catch any error we could have.<\/p>\n\n\n\n<p>Note that I decided to set &#8220;<code>change_when<\/code>&#8221; to false for step 1, 2 and 4 as working with temporary script on the server is not really a modification of the server itself. This helps to have a relevant playbook recap at end of execution.<\/p>\n\n\n\n<p>Also, to support idempotency, I have added a changed_when clause:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">changed_when: \"'changed' in jboss_cli_result.stdout\"<\/pre>\n\n\n\n<p>Whenever a jboss cli script is logging &#8220;changed&#8221;, associate Ansible task will be showed as changed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Templates<\/h2>\n\n\n\n<p>As I can&#8217;t have only one template for all jboss-cli operations, I decided to name template with the operation name. So far, the role is supporting the following operations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>For operation starting with an address (ie. \/subsystem=elytron&#8230; ):\n<ul class=\"wp-block-list\">\n<li>add-alias.j2<\/li>\n\n\n\n<li>add-handler.j2<\/li>\n\n\n\n<li>add.j2<\/li>\n\n\n\n<li>remove-handler.j2<\/li>\n\n\n\n<li>remove.j2<\/li>\n\n\n\n<li>undefine-attribute.j2<\/li>\n\n\n\n<li>write-attribute.j2<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>For other kind of operations (ie. starting with a keyword and not slash):\n<ul class=\"wp-block-list\">\n<li>datasource-add.j2<\/li>\n\n\n\n<li>deploy.j2<\/li>\n\n\n\n<li>echo.j2<\/li>\n\n\n\n<li>module-add.j2<\/li>\n\n\n\n<li>reload.j2<\/li>\n\n\n\n<li>security.j2<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>As add and remove resource are very similar templates, they are symbolic link to another common file ( _ressource.j2). We will not cover all templates in the blog, so let&#8217;s focus on one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deploy a Java Application<\/h2>\n\n\n\n<p>Deploying a Java application consist of following steps:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a folder to store the file on remote server<\/li>\n\n\n\n<li>Copy the file in it<\/li>\n\n\n\n<li>Deploy it in JBoss-EAP\/WildFly<\/li>\n<\/ol>\n\n\n\n<p>Calling the jboss-cli role will look like this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n- name: Deploy WebApp\n  vars:\n    name: &quot;deploy webapp&quot;\n    operations:\n      - deploy_webapp:\n        operation: &quot;deploy&quot;\n        parameters: &quot;{{ deployments }}&quot;\n  ansible.builtin.include_role:\n    name: &quot;jboss-cli&quot;\n<\/pre><\/div>\n\n\n<p>Where deployments is a list of Java applications (ear, war) to deploy.<\/p>\n\n\n\n<p>Parameters for deployment are limited compared to other operations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>operation to specify what we are going to do. This is also indicating which Jinja template to use.<\/li>\n\n\n\n<li>parameters: The list of files to deploy. It is a list of full path to files.<\/li>\n<\/ul>\n\n\n\n<p>deploy.j2 file contains the following code:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n{% for dep in operation.parameters %}\n{% set filename = (dep |basename) %}\n{% set path_to_file = webapp_folder + &#039;\/&#039; + filename %}\nif (outcome != success) of \/deployment={{ filename }}:read-resource()\n    deploy {{ path_to_file }}\n    echo changed\nelse\n    echo nochange\nend-if\n{% endfor %}\n<\/pre><\/div>\n\n\n<p>Line 1: Instead of using loop in Ansible, I found it more convenient to do loop in template itself.<\/p>\n\n\n\n<p>Line 2 and 3: I am populating variables so that jboss-cli commands to make the code a bit easier to read.<\/p>\n\n\n\n<p>Line 4 to 9 are jboss-cli commands.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Line 4: We are reading-resource. If this fails (outcome different from success), &#8230;<\/li>\n\n\n\n<li>We deploy Java application (line 5) and write &#8220;<code>changed<\/code>&#8221; to script output<\/li>\n\n\n\n<li>Or else (line 7), application already exists and we echo <code>nochange<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Such role will output the following lines:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nTASK &#x5B;deploy-webapp : Include deploy-webapp-WildFly role] **************************\nFriday 25 November 2022  06:56:54 +0000 (0:00:01.161)       0:02:31.697 *******\nincluded: \/workspace\/yak\/components\/middleware_webserver\/roles\/deploy-webapp\/tasks\/deploy-webapp-WildFly.yml for oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY\n\nTASK &#x5B;deploy-webapp : Call common tasks] **************************\nFriday 25 November 2022  06:56:54 +0000 (0:00:00.105)       0:02:31.802 *******\nincluded: \/workspace\/yak\/components\/middleware_webserver\/roles\/deploy-webapp\/tasks\/deploy-webapp-JBoss-WildFly-common.yml for oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY\n\nTASK &#x5B;deploy-webapp : Create \/app\/installers\/webapp folders] **************************\nFriday 25 November 2022  06:56:54 +0000 (0:00:00.146)       0:02:31.949 *******\nchanged: &#x5B;oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY]\n\nTASK &#x5B;deploy-webapp : Copy File] **********************************\nFriday 25 November 2022  06:56:55 +0000 (0:00:00.556)       0:02:32.505 *******\nchanged: &#x5B;oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY] =&amp;gt; (item=\/workspace\/.ssh\/helloworld.war)\n\nTASK &#x5B;Deploy WebApp] **********************************************\nFriday 25 November 2022  06:56:56 +0000 (0:00:00.970)       0:02:33.476 *******\n\nTASK &#x5B;jboss-cli : Create Temporary Script] *****************************************\nFriday 25 November 2022  06:56:56 +0000 (0:00:00.111)       0:02:33.587 *******\nok: &#x5B;oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY]\n\nTASK &#x5B;jboss-cli : Write Operations into Script] ************************************\nFriday 25 November 2022  06:56:56 +0000 (0:00:00.503)       0:02:34.091 *******\nok: &#x5B;oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY] =&amp;gt; (item=deploy on deploy)\n\nTASK &#x5B;jboss-cli : Run Script deploy webapp] ****************************************\nFriday 25 November 2022  06:56:57 +0000 (0:00:00.802)       0:02:34.894 *******\nchanged: &#x5B;oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY]\n\nTASK &#x5B;jboss-cli : Debug] ******************************************\nFriday 25 November 2022  06:57:00 +0000 (0:00:03.175)       0:02:38.070 *******\nskipping: &#x5B;oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY]\n\nTASK &#x5B;jboss-cli : Remove Temporary Script] *****************************************\nFriday 25 November 2022  06:57:00 +0000 (0:00:00.070)       0:02:38.140 *******\nskipping: &#x5B;oci_dbi_test\/srv-linux-mdw-ols-1\/WILDFLY]\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Next Steps<\/h2>\n\n\n\n<p>For this particular operation, we could imagine to implement a &#8220;force&#8221; option, whenever we want to overwrite the deployed webapp. I could also remove deployed web application when they are not declared in host variables.<\/p>\n\n\n\n<p>For now, the role already support enough operation to be able to install and configure a JBoss or WildFly server with dbi services best practices. The component also takes care of configuring datasource with associated driver as well as SSL setup for administration console and web application secured access.<\/p>\n\n\n\n<p>Role also supports JBoss-EAP or WildFly indifferently.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As I am working on a new YaK component to deploy a JBoss-EAP\/WildFly server, I decided to configure it with help of jboss-cli.sh scripting tool instead of direct modification of xml files. The idea is to create a script on the server via Jinja templates and then run it. Tasks The role has only one [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1321,197,2721],"tags":[119,1100],"type_dbi":[],"class_list":["post-20651","post","type-post","status-publish","format-standard","hentry","category-ansible","category-application-integration-middleware","category-yak","tag-jboss-eap","tag-wildfly"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>JBoss EAP (and WildFly) cli Scripting via Ansible - dbi Blog<\/title>\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\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JBoss EAP (and WildFly) cli Scripting via Ansible\" \/>\n<meta property=\"og:description\" content=\"As I am working on a new YaK component to deploy a JBoss-EAP\/WildFly server, I decided to configure it with help of jboss-cli.sh scripting tool instead of direct modification of xml files. The idea is to create a script on the server via Jinja templates and then run it. Tasks The role has only one [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-25T13:57:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-11T08:25:48+00:00\" \/>\n<meta name=\"author\" content=\"Middleware Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Middleware Team\" \/>\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\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"JBoss EAP (and WildFly) cli Scripting via Ansible\",\"datePublished\":\"2022-11-25T13:57:06+00:00\",\"dateModified\":\"2024-09-11T08:25:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/\"},\"wordCount\":563,\"commentCount\":2,\"keywords\":[\"JBoss EAP\",\"WildFly\"],\"articleSection\":[\"Ansible\",\"Application integration &amp; Middleware\",\"YaK\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/\",\"name\":\"JBoss EAP (and WildFly) cli Scripting via Ansible - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2022-11-25T13:57:06+00:00\",\"dateModified\":\"2024-09-11T08:25:48+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JBoss EAP (and WildFly) cli Scripting via Ansible\"}]},{\"@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\/8d8563acfc6e604cce6507f45bac0ea1\",\"name\":\"Middleware Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"caption\":\"Middleware Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JBoss EAP (and WildFly) cli Scripting via Ansible - dbi Blog","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\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/","og_locale":"en_US","og_type":"article","og_title":"JBoss EAP (and WildFly) cli Scripting via Ansible","og_description":"As I am working on a new YaK component to deploy a JBoss-EAP\/WildFly server, I decided to configure it with help of jboss-cli.sh scripting tool instead of direct modification of xml files. The idea is to create a script on the server via Jinja templates and then run it. Tasks The role has only one [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/","og_site_name":"dbi Blog","article_published_time":"2022-11-25T13:57:06+00:00","article_modified_time":"2024-09-11T08:25:48+00:00","author":"Middleware Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Middleware Team","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"JBoss EAP (and WildFly) cli Scripting via Ansible","datePublished":"2022-11-25T13:57:06+00:00","dateModified":"2024-09-11T08:25:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/"},"wordCount":563,"commentCount":2,"keywords":["JBoss EAP","WildFly"],"articleSection":["Ansible","Application integration &amp; Middleware","YaK"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/","url":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/","name":"JBoss EAP (and WildFly) cli Scripting via Ansible - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2022-11-25T13:57:06+00:00","dateModified":"2024-09-11T08:25:48+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/jboss-eap-and-wildfly-cli-scripting-via-ansible\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JBoss EAP (and WildFly) cli Scripting via Ansible"}]},{"@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\/8d8563acfc6e604cce6507f45bac0ea1","name":"Middleware Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","caption":"Middleware Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/20651","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\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=20651"}],"version-history":[{"count":12,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/20651\/revisions"}],"predecessor-version":[{"id":21015,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/20651\/revisions\/21015"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=20651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=20651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=20651"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=20651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}