Hey DevOps Team, In this post I would like to give you the knowledge on the special feature about Ansible Facts and we can also customize these facts as global variables to use in multiple playbooks.
What is ansible facts?
Ansible facts are just simple variables that are automatically discovered by ansible on a managed nodes.
such as system information disk info, os info, package info
IP Network and many more ...
when you run the above playbook it will automatically do this "Gathering Facts". This is done by a special built-in module called 'setup' module. What is this setup module does? Let's examine by executing the following ad-hoc command:
Why we manage facts?
Default these facts will be automatically collected exclusively we need to disable some times. - multiple play in a playbookHow can we use facts?
we want to run only when enough memory is available on the target machine then install the package. That is the smartest way to do the automation!--- # File : hello.yaml - name: Facts example hosts: "{{targets|default('localhost')}}" tasks: - name: prints details debug: msg: "Hello this machine have {{ ansible_memory_mb['real'] }}"
when you run the above playbook it will automatically do this "Gathering Facts". This is done by a special built-in module called 'setup' module. What is this setup module does? Let's examine by executing the following ad-hoc command:
ansible node1 -m setup # To know about node1 ansible localhost -m setup # To know about Ansible controller machinethe above will be printing lot of information in the JSON format thrown on to your monitor, look this is all under "ansible_facts"
To collect all these and displaying on the stdout will be time consuming process. We can skip this by saying I don't want to see!
To control this, disable collecting facts process you can inform in the playbook by saying
'gather_facts: false' this will not do automatic collection so that playbook will be executed faster.
Facts are like ansible_distribution ansible_hostname ansible_default_ipv4['address']
Facts are like ansible_distribution ansible_hostname ansible_default_ipv4['address']
--- # File : facts_ex.yaml - name: Facts example hosts: nodes gather_facts: false tasks: - name: collect facts setup: - name: prints details debug: msg: - "{{ ansible_distribution }}" - "{{ ansible_hostname }}" - "{{ ansible_default_ipv4['address'] }}"
Custom Facts
Let's go to the node1 and set the facts manually. ofcourse we can also set this with ansible file operation as well.sudo mkdir -p /etc/ansible/facts.d cd /etc/ansible/facts.dLet's create our facts file under the above created directory structure where ansible controller can look for and fetch the data1 `sudo vi local.fact`
[db_server] db_installer= Oracle 21c db_port= 1521 [bu] project=BankingNow let's run the fact collection from the ansible controller machine following command:
ansible node1 -m setup -a 'filter=ansible_local'Use Case 2: Accessing the local facts from the playbook as follows:
--- # File : localfacts_ex.yaml - name: Custom Facts example hosts: node1 tasks: - name: prints local facts details debug: msg: - "{{ ansible_local }}"execute the above example observe the output.
ansible-playbook localfacts_ex.yamlNow let's try to fetch those internal elements from custom facts, which are defined in the remote managed node 'node1' as dictionary of dictionaries.
--- # File : localfacts_ex1.yaml - name: Custom Facts in details example hosts: node1 tasks: - name: prints local facts details debug: msg: - "{{ ansible_facts['ansible_local']['local']['db_server'] }}" - "{{ ansible_facts['ansible_local']['local']['db_server']['db_installer'] }}"Run the above customized facts and retrieving is little complex as it requires little knowledge on the JSON form of data accessing method, but it's okay this is simple example used in the playbook.
ansible-playbook localfacts_ex1.yamlNow we can control the custom facts collection based on the availability as we know these facts are defined in node1 manage server only, when we pass hosts value as nodes it will be getting failed for node1 or localhost to suppress such cases we have option to use 'when' conditional check as shown below:
--- # File : localfacts_ex2.yaml - name: Custom Facts example hosts: nodes tasks: - name: prints local facts details debug: msg: - "{{ ansible_facts['ansible_local']['local']['db_server']['db_installer'] }}" when: ansible_local.local.db_server.db_installer is definedThe execution will be takes place as follows:
ansible-playbook localfacts_ex2.yamlKeep smiling 🤣 with rocking automation ideas you are learning with me!!
References:
Official Document
No comments:
Post a Comment