{"id":49428,"date":"2025-05-22T03:57:39","date_gmt":"2025-05-22T03:57:39","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49428"},"modified":"2025-05-22T05:01:01","modified_gmt":"2025-05-22T05:01:01","slug":"rundeck-community-edition-authentication-authorization-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/rundeck-community-edition-authentication-authorization-tutorial\/","title":{"rendered":"Rundeck Community Edition: Authentication &amp; Authorization Tutorial"},"content":{"rendered":"\n<p>Here&#8217;s a detailed <strong>tutorial for Authentication and Authorization in Rundeck Community Edition<\/strong>. This guide includes setup for both <strong>file-based authentication<\/strong> and <strong>role-based access control (RBAC)<\/strong> using <strong>ACL policy files<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udd10 Rundeck Community Edition: Authentication &amp; Authorization Tutorial<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf0 Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rundeck Community Edition installed (Ubuntu\/Windows)<\/li>\n\n\n\n<li>Admin access to the server (root or sudo)<\/li>\n\n\n\n<li>Basic knowledge of YAML and properties files<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udddd\ufe0f 1. Authentication in Rundeck<\/h2>\n\n\n\n<p>Rundeck CE uses <strong>JAAS (Java Authentication and Authorization Service)<\/strong> for authentication. By default, it authenticates users from a <code>realm.properties<\/code> file.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 Location of the file<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">\/etc\/rundeck\/realm.properties  <span class=\"hljs-comment\"># Linux<\/span>\nC:\\rundeck\\server\\config\\realm.properties  <span class=\"hljs-comment\"># Windows<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udccc Format<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">username<\/span>: password, role1,role2,...\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\u2705 Example<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">admin<\/span>: admin123, admin, user\n<span class=\"hljs-attribute\">devuser<\/span>: devpass, dev\n<span class=\"hljs-attribute\">viewonly<\/span>: viewpass, read\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udd12 You can generate password hashes using tools like <code>htpasswd<\/code> or <code>openssl passwd -crypt<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p>To apply changes, restart Rundeck:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart rundeckd\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfad 2. Authorization in Rundeck (Access Control)<\/h2>\n\n\n\n<p>Rundeck uses <strong>ACL (Access Control List)<\/strong> policy files (YAML format) to define <strong>who can do what<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc2 ACL Policy Directory<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/etc\/rundeck\/aclpolicy\/\n<\/code><\/span><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Each file must end with <code>.aclpolicy<\/code> and be readable by the Rundeck process.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddf1 2.1 Example: Admin Policy<\/h3>\n\n\n\n<p><code>admin.aclpolicy<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">description: Admin Policy\n<span class=\"hljs-attr\">context<\/span>:\n  project: <span class=\"hljs-string\">'.*'<\/span>\n<span class=\"hljs-attr\">for<\/span>:\n  project:\n    - match:\n        name: <span class=\"hljs-string\">'.*'<\/span>\n      <span class=\"hljs-attr\">allow<\/span>: &#91;<span class=\"hljs-string\">'*'<\/span>]\n  <span class=\"hljs-attr\">node<\/span>:\n    - allow: &#91;<span class=\"hljs-string\">'*'<\/span>]\n  <span class=\"hljs-attr\">job<\/span>:\n    - allow: &#91;<span class=\"hljs-string\">'*'<\/span>]\n  <span class=\"hljs-attr\">adhoc<\/span>:\n    - allow: &#91;<span class=\"hljs-string\">'*'<\/span>]\n  <span class=\"hljs-attr\">resource<\/span>:\n    - allow: &#91;<span class=\"hljs-string\">'*'<\/span>]\n<span class=\"hljs-attr\">by<\/span>:\n  group: &#91;admin]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddea 2.2 Example: Developer Policy (limited job run rights)<\/h3>\n\n\n\n<p><code>developer.aclpolicy<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">description: Dev Policy\n<span class=\"hljs-attr\">context<\/span>:\n  project: <span class=\"hljs-string\">'.*'<\/span>\n<span class=\"hljs-attr\">for<\/span>:\n  job:\n    - allow: &#91;read, run]\n  <span class=\"hljs-attr\">node<\/span>:\n    - allow: &#91;read]\n<span class=\"hljs-attr\">by<\/span>:\n  group: &#91;dev]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd0d 2.3 Example: Read-Only User<\/h3>\n\n\n\n<p><code>readonly.aclpolicy<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">description: ReadOnly Policy\n<span class=\"hljs-attr\">context<\/span>:\n  project: <span class=\"hljs-string\">'.*'<\/span>\n<span class=\"hljs-attr\">for<\/span>:\n  job:\n    - allow: &#91;read]\n  <span class=\"hljs-attr\">node<\/span>:\n    - allow: &#91;read]\n  <span class=\"hljs-attr\">project<\/span>:\n    - allow: &#91;read]\n  <span class=\"hljs-attr\">resource<\/span>:\n    - allow: &#91;read]\n<span class=\"hljs-attr\">by<\/span>:\n  group: &#91;read]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2699\ufe0f 3. Managing Users and Roles<\/h2>\n\n\n\n<p>Edit <code>realm.properties<\/code> to assign users to roles (groups), which map to the <code>group:<\/code> field in your ACLs.<\/p>\n\n\n\n<p><strong>User:<\/strong> <code>john<\/code>, Role: <code>dev<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">john<\/span>: dev123, dev\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then, make sure your ACL file references <code>group: [dev]<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udea6 4. Verifying Access<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Login to Rundeck Web UI as different users.<\/li>\n\n\n\n<li>Validate access by attempting to:\n<ul class=\"wp-block-list\">\n<li>View\/run jobs<\/li>\n\n\n\n<li>Execute ad-hoc commands<\/li>\n\n\n\n<li>View project settings<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Unauthorized attempts will show &#8220;Access Denied&#8221;<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee1\ufe0f 5. Tips &amp; Best Practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep ACL files small and modular (<code>admin.aclpolicy<\/code>, <code>dev.aclpolicy<\/code>, etc.)<\/li>\n\n\n\n<li>Validate ACL syntax with <code>rundeck<\/code> logs (<code>\/var\/log\/rundeck\/service.log<\/code>)<\/li>\n\n\n\n<li>Use <code>.*<\/code> regex cautiously\u2014it grants access to all projects<\/li>\n\n\n\n<li>Set appropriate permissions on <code>\/etc\/rundeck\/aclpolicy\/<\/code>: <code>sudo chown -R rundeck:rundeck \/etc\/rundeck\/aclpolicy\/<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcce Summary<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Tool\/Config File<\/th><\/tr><\/thead><tbody><tr><td>Authentication<\/td><td><code>\/etc\/rundeck\/realm.properties<\/code><\/td><\/tr><tr><td>Authorization<\/td><td><code>\/etc\/rundeck\/aclpolicy\/*.aclpolicy<\/code><\/td><\/tr><tr><td>Access by Role<\/td><td>Mapped via <code>group:<\/code> in ACL<\/td><\/tr><tr><td>Restart Rundeck<\/td><td><code>sudo systemctl restart rundeckd<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcda References<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.rundeck.com\/docs\/administration\/security\/authorization.html\" target=\"_blank\" rel=\"noopener\">Rundeck ACL Policy Format<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.rundeck.com\/docs\/administration\/security\/authentication.html\" target=\"_blank\" rel=\"noopener\">JAAS Authentication<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Here is your <strong>Rundeck configuration<\/strong> in <strong>Markdown (markup) format<\/strong> with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 A <code>realm.properties<\/code> spec for user-role mapping<\/li>\n\n\n\n<li>\u2705 A unified ACL <code>.aclpolicy<\/code> file with RBAC for <code>Dev<\/code>, <code>QA<\/code>, and <code>DevOps<\/code> roles<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd10 <code>realm.properties<\/code><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \/etc\/rundeck\/realm.properties<\/span>\n\nRajesh: rajesh123, dev\nBrad: brad123, qa\nRaimy: raimy123, devops, dev\nAndry: andry123, dev\nKevin: kevin123, qa\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u2139\ufe0f Passwords here are in plain text. You can replace them with hashed versions for security.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcdc <code>access-rbac.aclpolicy<\/code><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \/etc\/rundeck\/aclpolicy\/access-rbac.aclpolicy<\/span>\n\ndescription: RBAC policy <span class=\"hljs-keyword\">for<\/span> Dev, QA, <span class=\"hljs-keyword\">and<\/span> DevOps roles\ncontext:\n  application: <span class=\"hljs-string\">'rundeck'<\/span>\n<span class=\"hljs-keyword\">for<\/span>:\n  project:\n    - match:\n        name: <span class=\"hljs-string\">'.*'<\/span>\n      allow: &#91;<span class=\"hljs-string\">'read'<\/span>]\n  job:\n    - match:\n        name: <span class=\"hljs-string\">'.*'<\/span>\n      allow: &#91;<span class=\"hljs-string\">'read'<\/span>, <span class=\"hljs-string\">'run'<\/span>]\n  node:\n    - allow: &#91;<span class=\"hljs-string\">'read'<\/span>]\n  adhoc:\n    - allow: &#91;<span class=\"hljs-string\">'read'<\/span>]\n  resource:\n    - allow: &#91;<span class=\"hljs-string\">'read'<\/span>]\nby:\n  group: &#91;dev, qa, devops]\n\n---\n<span class=\"hljs-comment\"># DevOps elevated privileges<\/span>\ndescription: DevOps Admin Rights\ncontext:\n  application: <span class=\"hljs-string\">'rundeck'<\/span>\n<span class=\"hljs-keyword\">for<\/span>:\n  job:\n    - allow: &#91;<span class=\"hljs-string\">'create'<\/span>, <span class=\"hljs-string\">'update'<\/span>, <span class=\"hljs-string\">'delete'<\/span>, <span class=\"hljs-string\">'read'<\/span>, <span class=\"hljs-string\">'run'<\/span>]\n  node:\n    - allow: &#91;<span class=\"hljs-string\">'read'<\/span>, <span class=\"hljs-string\">'run'<\/span>]\n  project:\n    - allow: &#91;<span class=\"hljs-string\">'read'<\/span>, <span class=\"hljs-string\">'configure'<\/span>]\n  resource:\n    - allow: &#91;<span class=\"hljs-string\">'read'<\/span>, <span class=\"hljs-string\">'create'<\/span>]\n  storage:\n    - allow: &#91;<span class=\"hljs-string\">'read'<\/span>, <span class=\"hljs-string\">'create'<\/span>, <span class=\"hljs-string\">'update'<\/span>, <span class=\"hljs-string\">'delete'<\/span>]\n  system:\n    - allow: &#91;<span class=\"hljs-string\">'admin'<\/span>]\nby:\n  group: &#91;devops]\ncontext:\n  application: <span class=\"hljs-string\">'rundeck'<\/span>\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddfe Summary Table<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>User<\/th><th>Password<\/th><th>Roles Assigned<\/th><\/tr><\/thead><tbody><tr><td>Rajesh<\/td><td>rajesh123<\/td><td>dev<\/td><\/tr><tr><td>Brad<\/td><td>brad123<\/td><td>qa<\/td><\/tr><tr><td>Raimy<\/td><td>raimy123<\/td><td>dev, devops<\/td><\/tr><tr><td>Andry<\/td><td>andry123<\/td><td>dev<\/td><\/tr><tr><td>Kevin<\/td><td>kevin123<\/td><td>qa<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Role<\/th><th>Permissions Granted<\/th><\/tr><\/thead><tbody><tr><td><code>dev<\/code><\/td><td>Read &amp; Run jobs, read nodes\/projects<\/td><\/tr><tr><td><code>qa<\/code><\/td><td>Same as dev (read + run only)<\/td><\/tr><tr><td><code>devops<\/code><\/td><td>Full system rights including job\/project\/config<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Let me know if you want:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Separate ACLs per role (<code>dev.aclpolicy<\/code>, etc.)<\/li>\n\n\n\n<li>Project-specific permissions<\/li>\n\n\n\n<li>A packaged <code>.zip<\/code> with these files<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Here&#8217;s a detailed tutorial for Authentication and Authorization in Rundeck Community Edition. This guide includes setup for both file-based authentication and role-based access control (RBAC) using ACL policy files. \ud83d\udd10&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49428","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49428"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49428\/revisions"}],"predecessor-version":[{"id":49431,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49428\/revisions\/49431"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}