Exploring Ansible’s set_fact Module with Example

Ansible is an open-source automation tool widely used for configuration management, application deployment, and orchestration. It simplifies the process of managing IT infrastructure by allowing you to define desired state configurations in a declarative manner. One powerful feature of Ansible is the set_fact module, which enables you to create or modify variables dynamically during playbook execution. It is part of the ansible.builtin collection.

Join 50+ hours of courses in our exclusive community

Demo

In this article, we will explore the set_fact module and its usage through a practical example. We will Playbooknstrate how to retrieve the latest kernel package from a CentOS repository using Ansible’s uri module and store it in a variable called kernel. Let’s dive into the code example:

---
- name: Regex Playbook
  hosts: all
  vars:
    centos_repo: http://mirror.centos.org/centos/7/os/x86_64/Packages/
  tasks:
    - name: Get Latest Kernel
      ansible.builtin.uri:
        url: "{{ centos_repo }}"
        method: GET
        return_content: true
        body_format: json
      register: available_packages

    - name: Save
      ansible.builtin.set_fact:
        kernel: "{{ available_packages.content | ansible.builtin.regex_replace('<.*?>') | regex_findall('kernel-[0-9].*rpm') }}"

    - name: Print
      ansible.builtin.debug:
        var: kernel

Let’s break down this playbook step by step to understand its functionality:

  1. The name directive gives our playbook a descriptive title, “regex Playbook.”

  2. The hosts directive specifies the target hosts on which the playbook will be executed. In this case, it’s set to all, meaning it will apply to all hosts in the inventory.

  3. The vars section allows us to define variables used within the playbook. Here, we set the centos_repo variable to the URL of the CentOS 7 package repository.

  4. The tasks section contains the actual work to be performed. We have three tasks defined.

  5. The first task, named “Get Latest Kernel,” uses Ansible’s uri module to send an HTTP GET request to the centos_repo URL. It retrieves the content of the repository in JSON format and stores it in the available_packages variable using the register directive.

  6. The second task, named “Save,” utilizes the set_fact module. It takes the content stored in available_packages and applies two filters consecutively. First, it uses the regex_replace filter from the ansible.builtin plugin to remove any HTML tags from the content. Then, it applies the regex_findall filter from the same plugin to extract the kernel package names matching the pattern “kernel-[0-9].*rpm.” The resulting list of kernel package names is stored in the kernel variable using the ansible.builtin.set_fact module.

  7. The third task, named “Print,” uses Ansible’s debug module to display the value of the kernel variable.

By leveraging the set_fact module, we dynamically extract the kernel package names from the repository content and assign them to the kernel variable. This approach allows us to utilize the extracted data for further operations within our playbook or inventory.

Conclusion

In summary, the set_fact module is a powerful tool in Ansible for creating or modifying variables dynamically during playbook execution. It enables us to extract, transform, and store data from various sources, making it available for subsequent tasks or playbooks. In our example, we used set_fact to extract the latest kernel package name from a CentOS.

Subscribe to the YouTube channel, Medium, and Website, X (formerly Twitter) to not miss the next episode of the Ansible Pilot.

Academy

Learn the Ansible automation technology with some real-life examples in my Udemy 300+ Lessons Video Course.

BUY the Complete Udemy 300+ Lessons Video Course

My book Ansible By Examples: 200+ Automation Examples For Linux and AWX System Administrator and DevOps

BUY the Complete PDF BOOK to easily Copy and Paste the 250+ Ansible code

Want to keep this project going? Please donate

Patreon Buy me a Pizza