{"id":874,"date":"2026-07-02T06:10:14","date_gmt":"2026-07-01T23:10:14","guid":{"rendered":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/a-comprehensive-guide-to-using-ansible-for-it-automation-from-beginner-to-advanced\/"},"modified":"2026-07-02T06:10:14","modified_gmt":"2026-07-01T23:10:14","slug":"a-comprehensive-guide-to-using-ansible-for-it-automation-from-beginner-to-advanced","status":"publish","type":"post","link":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/a-comprehensive-guide-to-using-ansible-for-it-automation-from-beginner-to-advanced\/","title":{"rendered":"A Comprehensive Guide to Using Ansible for IT Automation: From Beginner to Advanced"},"content":{"rendered":"<h1>A Comprehensive Guide to Using Ansible for IT Automation: From Beginner to Advanced<\/h1>\n<p>In today\u2019s fast-paced IT landscape, manual server configuration, application deployment, and repetitive system administration tasks are not only inefficient but also error-prone. Automation has become a non-negotiable requirement for organizations that want to scale reliably, reduce human error, and free up their engineering teams for more strategic work. Among the many automation tools available, Ansible stands out as a powerful, agentless, and remarkably simple solution that uses YAML to describe desired system states. Whether you are managing a handful of virtual machines or orchestrating a sprawling cloud infrastructure, Ansible provides a consistent framework for provisioning, configuration management, application deployment, and orchestration. This tutorial will take you from the very basics of setting up Ansible to advanced patterns like role-based playbooks, dynamic inventories, and integration with cloud providers. By the end, you will have the knowledge and confidence to automate virtually any IT task with Ansible.<\/p>\n<p>Ansible operates on a push-based model, meaning the control node (where Ansible is installed) pushes modules and instructions to managed nodes via SSH (or WinRM for Windows). This eliminates the need for any agent software on the target machines, drastically reducing maintenance overhead and security concerns. The core language of Ansible is YAML, a human-readable data serialization format that makes playbooks (the automation scripts) easy to write, read, and version control. With a vast library of built-in modules\u2014covering everything from file manipulation and package management to cloud API interactions\u2014Ansible can handle nearly any task you throw at it. Furthermore, its idempotent nature ensures that no matter how many times you run a playbook, the system will only be changed if it is not already in the desired state. This makes Ansible exceptionally safe for continuous deployments and configuration enforcement. In this guide, we will explore how to get started with Ansible, craft playbooks that are both powerful and maintainable, and adopt best practices that will serve you as your automation environment grows.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/via.placeholder.com\/800x600\/4a90d9\/ffffff?text=how%20to%20use%20Ansible%20for%20automation\" alt=\"Article illustration\" style=\"display:block;margin:20px auto;max-width:100%;height:auto;border-radius:8px;\" \/><\/p>\n<h2>Step-by-Step Guide to Mastering Ansible Automation<\/h2>\n<h3>Step 1: Installing Ansible and Setting Up the Control Node<\/h3>\n<p>The first step in your Ansible journey is to install the software on a control node\u2014typically a Linux or macOS machine, though Windows can serve as a control node via WSL2. The most straightforward method is to use your distribution\u2019s package manager. For example, on Ubuntu or Debian, you can run <code>sudo apt update && sudo apt install ansible<\/code>. On RHEL\/CentOS 8+ or Fedora, <code>sudo dnf install ansible<\/code> works. Alternatively, you can use Python\u2019s pip to get the latest version: <code>pip install ansible<\/code> (preferably in a virtual environment). After installation, verify it with <code>ansible --version<\/code>. You should see output showing the version number and configuration file location. The control node must be able to SSH into all managed nodes. For simple labs, password-based SSH can work, but for production, you should set up SSH key-based authentication with <code>ssh-keygen<\/code> and <code>ssh-copy-id user@host<\/code>. Note that Ansible does not require a database or a daemon; it is a completely stateless tool. This simplicity is one of its greatest strengths.<\/p>\n<h3>Step 2: Defining Your Inventory<\/h3>\n<p>Ansible needs to know which machines it should manage. This information is stored in an inventory file, which can be static (a simple INI or YAML file) or dynamic (a script that queries cloud providers, LDAP, or CMDB). By default, Ansible looks for <code>\/etc\/ansible\/hosts<\/code>, but you can specify any file with the <code>-i<\/code> flag. Let\u2019s create a basic static inventory file named <code>inventory.ini<\/code>:<\/p>\n<pre><code>[webservers]\nweb1.example.com ansible_user=ubuntu\nweb2.example.com ansible_user=ubuntu\n\n[dbservers]\ndb1.example.com ansible_user=centos\n\n[all:vars]\nansible_ssh_private_key_file=\/home\/me\/.ssh\/id_rsa<\/code><\/pre>\n<p>Here, we define two groups: <code>webservers<\/code> and <code>dbservers<\/code>. Each host entry can have variables like <code>ansible_user<\/code> (the SSH username). The <code>[all:vars]<\/code> section sets variables for every host. You can also use YAML inventory format for more complex structures. To verify connectivity, run <code>ansible all -i inventory.ini -m ping<\/code>. The <code>ping<\/code> module does not test ICMP; it attempts an SSH connection and runs a small Python script, returning \u201cpong\u201d on success. This confirms that your control node can reach and authenticate with each managed host. For larger environments, consider a dynamic inventory plugin (e.g., <code>aws_ec2<\/code> for Amazon EC2) that automatically populates host information from cloud APIs.<\/p>\n<h3>Step 3: Executing Ad-Hoc Commands<\/h3>\n<p>Before diving into playbooks, you should become comfortable with ad-hoc commands\u2014one-liners that run a single Ansible module against a set of hosts. Ad-hoc commands are perfect for quick tasks like checking disk space, restarting a service, or copying a file. The syntax is: <code>ansible &lt;pattern&gt; -i &lt;inventory&gt; -m &lt;module&gt; -a &lt;module arguments&gt;<\/code>. For example, to check the uptime of all web servers:<\/p>\n<pre><code>ansible webservers -i inventory.ini -m shell -a \"uptime\"<\/code><\/pre>\n<p>The <code>shell<\/code> module executes arbitrary commands on the remote host. However, it is not idempotent; for idempotency, use specialized modules. To install the latest version of Nginx on all Ubuntu machines:<\/p>\n<pre><code>ansible all -i inventory.ini -m apt -a \"name=nginx state=latest\" --become<\/code><\/pre>\n<p>The <code>--become<\/code> flag escalates privileges (sudo) to install packages. Other useful ad-hoc commands include <code>ansible webservers -m copy -a \"src=\/local\/file dest=\/remote\/path\"<\/code> to copy files, and <code>ansible all -m service -a \"name=sshd state=started enabled=yes\"<\/code> to manage services. Ad-hoc commands are great for one-off operations, but for repeatable automation, you will need playbooks.<\/p>\n<h3>Step 4: Writing Your First Playbook<\/h3>\n<p>A playbook is a YAML file containing one or more plays. Each play targets a specific group of hosts and defines a list of tasks to execute. Let\u2019s create a simple playbook <code>setup_webserver.yml<\/code> that installs Apache, ensures it is running, and deploys a custom index.html file:<\/p>\n<pre><code>---\n- name: Configure web server\n  hosts: webservers\n  become: yes\n  tasks:\n    - name: Install Apache\n      apt:\n        name: apache2\n        state: present\n\n    - name: Enable and start Apache\n      service:\n        name: apache2\n        state: started\n        enabled: yes\n\n    - name: Deploy custom index.html\n      copy:\n        src: .\/files\/index.html\n        dest: \/var\/www\/html\/index.html\n        owner: www-data\n        group: www-data\n        mode: '0644'<\/code><\/pre>\n<p>Run it with <code>ansible-playbook -i inventory.ini setup_webserver.yml<\/code>. Notice the use of the <code>copy<\/code> module to push a local file. The <code>service<\/code> module ensures the service is running and will start on boot (<code>enabled: yes<\/code>). Each task includes a <code>name<\/code> that describes its purpose\u2014this appears in the output and helps with readability and debugging. Ansible executes tasks in order, stopping the play on any failure unless you specify <code>ignore_errors: yes<\/code> or use error handling patterns. Playbooks are the heart of Ansible automation; they are idempotent, so running the same playbook multiple times will not change the system if it is already in the desired state.<\/p>\n<h3>Step 5: Leveraging Variables and Facts<\/h3>\n<p>Variables in Ansible allow you to parameterize your playbooks, making them reusable across different environments (dev, staging, production). You can define variables in multiple places with a defined precedence order (e.g., extra vars > playbook vars > inventory group vars > host vars > role defaults). For example, in your playbook you can add a <code>vars<\/code> section:<\/p>\n<pre><code>vars:\n  app_port: 8080\n  log_level: info<\/code><\/pre>\n<p>Then use them in tasks with Jinja2 syntax: <code>{{ app_port }}<\/code>. You can also use <code>vars_files<\/code> to pull variables from external YAML files, which is excellent for keeping sensitive data separate (and later encrypted with Ansible Vault). Additionally, Ansible gathers system information called <em>facts<\/em> about each managed host before running tasks (by default). These facts include IP addresses, OS distribution, memory, disk sizes, and more. You can access facts as variables, e.g., <code>{{ ansible_facts['default_ipv4']['address'] }}<\/code>. To disable fact gathering for performance, set <code>gather_facts: no<\/code> in your play. Another powerful feature is <code>set_fact<\/code> to create derived variables during execution. For example:<\/p>\n<pre><code>- name: Set fact based on condition\n  set_fact:\n    web_root: \"\/var\/www\/{{ app_name }}\"\n  when: app_name is defined<\/code><\/pre>\n<p>Mastering variables and facts is crucial for writing flexible, environment-agnostic automation.<\/p>\n<h3>Step 6: Structuring Playbooks with Roles<\/h3>\n<p>As your automation grows, a single flat playbook becomes unwieldy. Ansible roles provide a way to organize tasks, variables, handlers, templates, and defaults into a reusable directory structure. A typical role looks like this:<\/p>\n<pre><code>roles\/\n  nginx\/\n    tasks\/\n      main.yml\n    handlers\/\n      main.yml\n    templates\/\n      nginx.conf.j2\n    files\/\n      static.html\n    vars\/\n      main.yml\n    defaults\/\n      main.yml\n    meta\/\n      main.yml<\/code><\/pre>\n<p>To use a role, include it in your playbook: <code>roles: - nginx<\/code>. Roles can be shared on Ansible Galaxy (community repository). You can also create roles that accept parameters using <code>role_name: { param1: value1 }<\/code>. Inside a role, the <code>tasks\/main.yml<\/code> file contains the main work, while <code>handlers<\/code> are special tasks that run only when notified (typically restarting services after configuration changes). Templates allow dynamic configuration files using Jinja2. For instance, a template <code>nginx.conf.j2<\/code> might contain <code>server_name {{ nginx_hostname }};<\/code>. When you run the playbook, Ansible fills in the variable. Roles make your code modular, testable, and easily shareable. For larger projects, use <code>ansible-galaxy init<\/code> to scaffold a new role.<\/p>\n<h3>Step 7: Advanced Playbook Patterns \u2013 Loops, Conditionals, and Blocks<\/h3>\n<p>To handle repetitive tasks or make decisions, Ansible supports loops, conditionals, and blocks. For example, to install multiple packages:<\/p>\n<pre><code>- name: Install required packages\n  apt:\n    name: \"{{ item }}\"\n    state: present\n  loop:\n    - git\n    - curl\n    - htop<\/code><\/pre>\n<p>Conditionals use the <code>when<\/code> clause, allowing tasks to run only when certain conditions are met, such as the OS family. You can also use <code>block<\/code> to group tasks with shared error handling:<\/p>\n<pre><code>- name: Upgrade system\n  block:\n    - name: Run update\n      apt:\n        update_cache: yes\n        upgrade: dist\n  rescue:\n    - name: Send email on failure\n      mail:\n        to: admin@example.com\n        subject: \"Upgrade failed\"\n  always:\n    - name: Log completion\n      debug:\n        msg: \"Block finished\"<\/code><\/pre>\n<p>This structure allows you to run a rescue block if any task in the block fails, and an always block that runs regardless. These patterns are essential for robust production playbooks that handle errors gracefully and adapt to different environments.<\/p>\n<h3>Step 8: Working with Templates and Handlers<\/h3>\n<p>Dynamic configuration files are created using Ansible\u2019s template module, which processes Jinja2 templates. For example, to generate an Nginx site configuration with variables, create <code>templates\/site.conf.j2<\/code>:<\/p>\n<pre><code>server {\n    listen {{ http_port }};\n    server_name {{ domain_name }};\n    root \/var\/www\/{{ app_name }};\n    ...\n}<\/code><\/pre>\n<p>In your task, use <code>template<\/code> instead of <code>copy<\/code>:<\/p>\n<pre><code>- name: Deploy site configuration\n  template:\n    src: site.conf.j2\n    dest: \/etc\/nginx\/sites-available\/{{ app_name }}\n  notify: restart nginx<\/code><\/pre>\n<p>The <code>notify<\/code> directive triggers a handler\u2014a task defined in <code>handlers\/main.yml<\/code> that runs only at the end of a play and only if notified. This ensures that Nginx is restarted only when the configuration file actually changes, not every time the play runs. Handlers are powerful for minimizing downtime.<\/p>\n<h2>Best Practices and Pro Tips for Ansible Automation<\/h2>\n<h3>1. Embrace Idempotency and Dry Runs<\/h3>\n<p>One of Ansible\u2019s core principles is idempotency: running the same playbook multiple times should produce the same result without unintended side effects. Always use modules that support idempotency (e.g., <code>copy<\/code> with <code>checksum<\/code>, <code>yum<\/code>, <code>apt<\/code>) rather than the <code>shell<\/code> module for system modification. Before applying changes, use the <code>--check<\/code> flag to perform a dry run: <code>ansible-playbook playbook.yml --check<\/code>. This simulates the run and shows what would change without actually making modifications. Combine with <code>--diff<\/code> to see the exact differences in files. This practice helps catch errors early and ensures your automation is safe.<\/p>\n<h3>2. Secure Sensitive Data with Ansible Vault<\/h3>\n<p>Never store passwords, API keys, or private SSH keys in plaintext inside your playbooks or variables. Ansible Vault encrypts your sensitive data so that only authorized users can decrypt it on demand. Create an encrypted file with <code>ansible-vault create secrets.yml<\/code>, then set a vault password. You can then include this file in your playbook via <code>vars_files<\/code>. To run a playbook with vault, pass the password via <code>--ask-vault-pass<\/code> or use a password file. You can also embed vault-encrypted variables directly in YAML using <code>!vault |<\/code>. For team environments, consider using a vault password stored in a secret management tool like HashiCorp Vault or a password manager. Avoid hardcoding passwords even in encrypted files; use dynamic lookups where possible.<\/p>\n<h3>3. Structure Your Project for Scalability<\/h3>\n<p>For any non-trivial project, organize your repository with a standard layout. Use <code>ansible.cfg<\/code> to set defaults (inventory path, roles path, SSH settings). Separate inventories by environment (e.g., <code>inventories\/production<\/code>, <code>inventories\/staging<\/code>). Keep playbooks at the top level, possibly grouped by application or tier. Create a <code>group_vars\/<\/code> and <code>host_vars\/<\/code> directory to store variables that apply to entire groups or specific hosts. Use <code>requirements.yml<\/code> to manage roles from Ansible Galaxy. Adopt a consistent naming convention for roles (e.g., <code>role_application<\/code>). This structure makes your automation accessible to new team members and easy to version control.<\/p>\n<h2>Reference Tables for Common Ansible Modules and Comparison<\/h2>\n<table border=\"1\" cellpadding=\"8\">\n<caption>Table 1: Comparison of Ansible with Other Automation Tools<\/caption>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Ansible<\/th>\n<th>Puppet<\/th>\n<th>Chef<\/th>\n<th>SaltStack<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Architecture<\/td>\n<td>Agentless (push via SSH)<\/td>\n<td>Agent-based (pull)<\/td>\n<td>Agent-based (pull)<\/td>\n<td>Hybrid (agentless or agent)<\/td>\n<\/tr>\n<tr>\n<td>Language<\/td>\n<td>YAML (playbooks)<\/td>\n<td>DSL (Puppet DSL)<\/td>\n<td>Ruby DSL<\/td>\n<td>YAML + Python<\/td>\n<\/tr>\n<tr>\n<td>Ease of Learning<\/td>\n<td>Very high<\/td>\n<td>Moderate<\/td>\n<td>Moderate<\/td>\n<td>Moderate<\/td>\n<\/tr>\n<tr>\n<td>Idempotency<\/td>\n<td>Yes (built-in)<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Windows Support<\/td>\n<td>Yes (WinRM)<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Orchestration<\/td>\n<td>Built-in (playbooks)<\/td>\n<td>Additional tools<\/td>\n<td>Additional tools<\/td>\n<td>Built-in<\/td>\n<\/tr>\n<tr>\n<td>Community &amp; Ecosystem<\/td>\n<td>Excellent (Ansible Galaxy)<\/td>\n<td>Good<\/td>\n<td>Good<\/td>\n<td>Good<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table border=\"1\" cellpadding=\"8\">\n<caption>Table 2: Essential Ansible Modules for Everyday Automation<\/caption>\n<thead>\n<tr>\n<th>Module Name<\/th>\n<th>Purpose<\/th>\n<th>Common Options<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>copy<\/code><\/td>\n<td>Copy files from control node to remote host<\/td>\n<td>src, dest, owner, group, mode<\/td>\n<\/tr>\n<tr>\n<td><code>template<\/code><\/td>\n<td>Process Jinja2 template and deploy<\/td>\n<td>src, dest, owner, mode, vars<\/td>\n<\/tr>\n<tr>\n<td><code>apt<\/code> \/ <code>yum<\/code> \/ <code>dnf<\/code><\/td>\n<td>Package management for Linux<\/td>\n<td>name, state (present\/absent\/latest), update_cache<\/td>\n<\/tr>\n<tr>\n<td><code>service<\/code> \/ <code>systemd<\/code><\/td>\n<td>Manage services (start\/stop\/restart\/enable)<\/td>\n<td>name, state, enabled<\/td>\n<\/tr>\n<tr>\n<td><code>user<\/code><\/td>\n<td>Manage user accounts<\/td>\n<td>name, groups, shell, state (present\/absent)<\/td>\n<\/tr>\n<tr>\n<td><code>file<\/code><\/td>\n<td>Manage files, directories, and symlinks<\/td>\n<td>path, state (directory\/file\/touch\/absent), owner, mode<\/td>\n<\/tr>\n<tr>\n<td><code>lineinfile<\/code><\/td>\n<td>Ensure a line exists or is absent in a file<\/td>\n<td>path, line, regexp, state<\/td>\n<\/tr>\n<tr>\n<td><code>debug<\/code><\/td>\n<td>Print messages or variable values during execution<\/td>\n<td>msg, var, verbosity<\/td>\n<\/tr>\n<tr>\n<td><code>wait_for<\/code><\/td>\n<td>Wait for a port or file to become available<\/td>\n<td>host, port, timeout<\/td>\n<\/tr>\n<tr>\n<td><code>uri<\/code><\/td>\n<td>Make HTTP\/HTTPS requests (API integration)<\/td>\n<td>url, method, headers, body<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Frequently Asked Questions (FAQ) About Ansible Automation<\/h2>\n<ol>\n<li><strong>What is the difference between Ansible and Ansible Tower\/AWX?<\/strong><br \/>\nAnsible is the command-line tool for automation. Ansible Tower is Red Hat\u2019s web-based UI, RBAC, and job scheduling layer. AWX is the upstream open-source project that Tower is based on. For most beginners, the command-line Ansible is sufficient. Tower\/AWX becomes valuable when you need centralized management, API access, and delegation in larger teams.<\/li>\n<li><strong>How do I debug a playbook that isn\u2019t working as expected?<\/strong><br \/>\nStart by using <code>-v<\/code> (verbose) flags: <code>-vvv<\/code> provides extensive output, including SSH commands and module results. Add the <code>debug<\/code> module to print variable values at specific points. Use <code>--syntax-check<\/code> to catch YAML errors. For complex issues, run the playbook on a single host first and check the remote host\u2019s logs. Also, ensure that your inventory and SSH connectivity are correct by running <code>ansible all -m ping<\/code>.<\/li>\n<li><strong>Can Ansible manage Windows machines?<\/strong><br \/>\nYes. For Windows hosts, Ansible communicates via WinRM instead of SSH. You must install PowerShell 3.0+ and configure WinRM. Ansible provides Windows-specific modules (like <code>win_package<\/code>, <code>win_service<\/code>, <code>win_file<\/code>). You can mix Linux and Windows hosts in the same inventory using different connection methods.<\/li>\n<li><strong>How do I handle secrets like API tokens or database passwords?<\/strong><br \/>\nUse Ansible Vault to encrypt the variable values. Alternatively, you can fetch secrets from a vault service (like HashiCorp Vault, CyberArk) using the <code>hashi_vault<\/code> lookup plugin, or from environment variables with the <code>env<\/code> lookup. Never commit unencrypted secrets to version control. For CI\/CD pipelines, inject secrets via extra vars from the CI system\u2019s secret store.<\/li>\n<li><strong>What is the best way to test Ansible playbooks before production?<\/strong><br \/>\nUse <code>--check<\/code> and <code>--diff<\/code> for dry runs. For more thorough testing, use Molecule, a testing framework that provisions container or VM instances, applies roles, and runs verification tests (with Testinfra or Goss). You can also set up a staging environment that mirrors production, or use local Docker containers for rapid iteration.<\/li>\n<li><strong>Can Ansible work in a pull-based setup?<\/strong><br \/>\nWhile Ansible is primarily push-based, you can achieve pull-based behavior using <code>ansible-pull<\/code>. This command, run on managed nodes via cron, fetches a playbook from a git repository and applies it locally. However, this forfeits the \u201creal-time\u201d push aspect and requires SSH keys on every node to access the repository. For most teams, the push model is simpler and more controllable.<\/li>\n<li><strong>How do I manage multiple environments (dev, staging, prod) with one playbook?<\/strong><br \/>\nUse separate inventory files or inventory directories, each with its own <code>group_vars<\/code> and <code>host_vars<\/code>. Define environment-specific variables (e.g., <code>app_version: \"1.2.3\"<\/code>, <code>db_host: \"prod-db.example.com\"<\/code>). In your playbook, you can conditionally include tasks based on the environment variable. Avoid hardcoding environment names inside roles; instead, pass them as variables from the inventory or extra vars.<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>Ansible has revolutionized the way IT professionals approach automation by making it accessible, scalable, and reliable. From the simplicity of ad-hoc commands to the power of role-based playbooks and dynamic inventories, Ansible provides all the tools needed to automate virtually any aspect of infrastructure and application management. In this guide, we walked through the complete workflow\u2014installing Ansible, defining your inventory, writing and structuring playbooks, using variables and facts, creating reusable roles, and implementing advanced patterns like loops, conditionals, and error handling. We also covered essential best practices such as idempotency, secure secrets management, and project organization, which will help you avoid common pitfalls as your automation grows. By now, you should be equipped to tackle real-world automation challenges with confidence. Remember that the Ansible community is vast and supportive; take advantage of Ansible Galaxy for pre-built roles, and always test your playbooks in safe environments before rolling them out to production. Automation is not a one-time effort but a continuous journey of improvement. As you build more sophisticated automation, you will find that Ansible becomes an indispensable part of your operational toolkit\u2014freeing you to focus on innovation rather than repetitive tasks.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Comprehensive Guide to Using Ansible for IT Automation: From Beginner to Advanced In today\u2019s fast-paced IT landscape, manual server configuration, application deployment, and repetitive system administration tasks are not only inefficient but also error-prone. Automation has become a non-negotiable requirement for organizations that want to scale reliably, reduce human error, and free up their &hellip; <\/p>\n","protected":false},"author":2716,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-874","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/users\/2716"}],"replies":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/comments?post=874"}],"version-history":[{"count":0,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/874\/revisions"}],"wp:attachment":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/media?parent=874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/categories?post=874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/tags?post=874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}