HomeBlogAnsible gather_facts for Networking Devices
The purpose of this blog is to show some differences in how Ansible handled gathering facts from networking devices prior to version 2.9 and how they can be gathered in version 2.9.2. A main point to show here is how previously the gather_facts key was disabled when working with networking devices and now it can be enabled to gather device facts.
Gathering *_facts the “Old” way
Ansible core comes included with vendor specific *_facts modules. So normally to collect facts from devices the playbook was built using the vendor specific facts module and the needed key was used for any other particular task like asserting device versions, building reports, etc. The example below is a playbook used to gather facts from a Cisco device.
----name: GATHER FACTS FOR IOShosts: csr1connection: network_cligather_facts: no #<---Gather Facts Disabledtasks:-name: GATHER FACTS FOR IOS IN A TASKios_facts:-name: VIEW ALL ANSIBLE FACT KEYSdebug:var: ansible_facts.keys()-name: VIEW HOSTNAMEdebug:var: ansible_net_hostname-name: VIEW OS VERSIONdebug:var: ansible_net_version
Note: The first task is using the ios_facts module to gather all the data, the other three tasks are used to display the data returned from the facts module and keys inside ansible_facts can be accessed directly.
Notice how in the play definition the key gather_facts is set to no. Originally, Ansible was designed to work with Linux servers. Ansible focuses on collecting as much data as possible from the remote Linux servers and copying Python modules to the servers for automation tasks so they could be executed on the remote machines.
When working with networking devices Ansible does not copy Python modules to the remote devices to run an automation task. The Python module is executed in the local Ansible workstation and things like sending show commands or configuration changes are wrapped in the Python module and sent over through SSH. The gather_facts key was not designed to know the difference between a Linux server and a networking device, so by enabling the feature would end up gathering facts from the local Ansible workstation and not the remote networking device.
Running the Playbook with gather_facts disabled
The output of the current playbook would look like this:
The current output only displays facts that belong to the remote device. The keys seen in the output are the ones available from the ios_facts module.
Running the Playbook with gather_facts enabled
When the gather_facts key is enabled in the play definition (gather_facts: yes) the output will return not only data from the remote device but also from the Ansible workstation as seen below:
Another thing to point out is that when using the core *_facts modules if another vendor or platform needs to be added to the playbook another play would need to be built to gather facts from that vendor or platform. Without this addition, the module will fail because the ios_facts module is vendor specific and it will try to gather facts from any devices targeted in the scope of that play. The playbook would look something like this:
----name: GATHER FACTS FOR IOShosts: csr1connection: network_cligather_facts: notasks:-name: GATHER FACTS FOR IOSios_facts:-name: VIEW ALL ANSIBLE FACT KEYSdebug:var: ansible_facts.keys()-name: VIEW HOSTNAMEdebug:var: ansible_net_hostname-name: VIEW OS VERSIONdebug:var: ansible_net_version-name: GATHER FACTS FOR NXOShosts: nxosconnection: network_cligather_facts: notasks:-name: GATHER FACTS FOR NXOSnxos_facts:-name: VIEW ALL ANSIBLE FACT KEYSdebug:var: ansible_facts.keys()-name: VIEW HOSTNAMEdebug:var: ansible_net_hostname-name: VIEW OS VERSIONdebug:var: ansible_net_version
Gather Facts the “New” way
There have been a lot of changes with Ansible focused on improving how to manage networking devices. More and more the platform has been used in multi-vendor environments, meaning that the tool needs to be more robust and vendor neutral. Recent features and improvements are being built to be more “vendor neutral” – such as cli_config and cli_command (added in Ansilble version 2.7).
In Ansible version 2.9, gathering facts from devices from the play definition is now possible without having to build it as a task, like shown in the previous playbook. This time the key gather_facts can be enabled and not gather facts from the local workstation but from the devices targeted in the hosts key.
Note: The modules ios_facts and nxos_fact are still being used but are now being executed in the play definition.
----name: GATHER FACTShosts: csr1,nxosconnection: network_cligather_facts: yes #<----Gather Facts Enabled tasks: #NO VENDOR SPECIFIC MODULE LIKE ios_facts OR nxos_facts ANYMORE-name: VIEW ALL ANSIBLE FACT KEYSdebug:var: ansible_facts.keys()-name: VIEW HOSTNAMEdebug:var: ansible_net_hostname-name: VIEW OS VERSIONdebug:var: ansible_net_version
Take a look at the current playbook. The hosts key has two different operating systems which normally would require another play when trying to gather data from different platforms because of the vendor specific modules defined in the tasks. This time gathering facts is being done at the play definition level and at the tasks level only the debug modules are being used to display the available keys and variables to see hostname and version information.
Running the Playbook with gather_facts enabled the “New Way”
The output above shows the results of the playbook ran in the new version. This time only the device facts are gathered in a single play for two different platforms, rather than running vendor specific modules that have to run in two different plays.
Note: Now that gather_facts can be used with networking devices there are some configurations that can be changed in the ansible.cfg file that will affect how the gathering could behave.
Changing the settings below in the ansible.cfg file will affect how gathering facts from devices will be gathered.
# smart - gather by default, but don't regather if already gathered# implicit - gather by default, turn off withgather_facts: False# explicit -do not gather by default, must say gather_facts: True# gathering = implicit
For more information on what other new changes exist in Ansible 2.9 check out the link below:
Before this new update in Ansible 2.9.2, when building playbooks for networking devices the gather_facts key was always disabled and it almost seemed like an extra key that needed to be there for no good reason unless facts from the local machine needed to be added. In this new version of Ansible gathering facts from networking devices really makes things easier and more flexible in a structured way. I’m looking forward to test this out with the new rersource modules and showing this feature to more of my students from now on.
Does this all sound amazing? Want to know more about how Network to Code can help you do this, reach out to our sales team. If you want to help make this a reality for our clients, check out our careers page.
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept”, you consent to the use of ALL the cookies. In case of sale of your personal information, you may opt out by using the link Do not sell my personal information. Privacy | Cookies
This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
Cookie
Duration
Description
__hssc
30 minutes
HubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie.
__hssrc
session
This cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session.
cookielawinfo-checkbox-advertisement
1 year
Set by the GDPR Cookie Consent plugin, this cookie records the user consent for the cookies in the "Advertisement" category.
cookielawinfo-checkbox-analytics
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".
cookielawinfo-checkbox-functional
11 months
The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
cookielawinfo-checkbox-necessary
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-others
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.
cookielawinfo-checkbox-performance
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".
CookieLawInfoConsent
1 year
CookieYes sets this cookie to record the default button state of the corresponding category and the status of CCPA. It works only in coordination with the primary cookie.
viewed_cookie_policy
11 months
The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.
Cookie
Duration
Description
__cf_bm
30 minutes
Cloudflare set the cookie to support Cloudflare Bot Management.
li_gc
5 months 27 days
Linkedin set this cookie for storing visitor's consent regarding using cookies for non-essential purposes.
lidc
1 day
LinkedIn sets the lidc cookie to facilitate data center selection.
UserMatchHistory
1 month
LinkedIn sets this cookie for LinkedIn Ads ID syncing.
Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
Cookie
Duration
Description
__hstc
5 months 27 days
Hubspot set this main cookie for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session).
_ga
1 year 1 month 4 days
Google Analytics sets this cookie to calculate visitor, session and campaign data and track site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognise unique visitors.
_gat_gtag_UA_*
1 minute
Google Analytics sets this cookie to store a unique user ID.
_gid
1 day
Google Analytics sets this cookie to store information on how visitors use a website while also creating an analytics report of the website's performance. Some of the collected data includes the number of visitors, their source, and the pages they visit anonymously.
AnalyticsSyncHistory
1 month
Linkedin set this cookie to store information about the time a sync took place with the lms_analytics cookie.
CONSENT
2 years
YouTube sets this cookie via embedded YouTube videos and registers anonymous statistical data.
hubspotutk
5 months 27 days
HubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts.
ln_or
1 day
Linkedin sets this cookie to registers statistical data on users' behaviour on the website for internal analytics.
Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.
Cookie
Duration
Description
bcookie
1 year
LinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser IDs.
bscookie
1 year
LinkedIn sets this cookie to store performed actions on the website.
li_sugr
3 months
LinkedIn sets this cookie to collect user behaviour data to optimise the website and make advertisements on the website more relevant.
VISITOR_INFO1_LIVE
5 months 27 days
YouTube sets this cookie to measure bandwidth, determining whether the user gets the new or old player interface.
YSC
session
Youtube sets this cookie to track the views of embedded videos on Youtube pages.
yt-remote-connected-devices
never
YouTube sets this cookie to store the user's video preferences using embedded YouTube videos.
yt-remote-device-id
never
YouTube sets this cookie to store the user's video preferences using embedded YouTube videos.
yt.innertube::nextId
never
YouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.
yt.innertube::requests
never
YouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.