A few years ago, Ansible introduced a very useful feature called --diff that has yet to be widely adopted in the network industry. If you are already using Ansible you are probably familiar with the default output that will indicate, per task, if something has changed (or if it will be changed if you are running in --check mode). --diff and --check are two completely different features, both features can work independently and they work also well together.
Standard Ansible output
While it’s useful to understand if a change will be made, it’s even more important to be able to see exactly what has/will change. When running in --diff mode, Ansible will show you which changes have been completed.
Some modules are returning this kind of information by default but to access it, you need to enable the verbose (-vv) output which will print a lot of additional information on the screen. The --diff mode provide a better experience with colors etc ..
Here is an example of diff created by Ansible when generating a configuration file with the template module. The diff is showing only the lines that will change, with a few lines of context before and after. The line(s) that will be added to the file are in green and the line(s) that will be removed/updated are in Red. It’s important to highlight that even if there is a large amount of content, the diff will only show the relevant lines associated with the current changes.
Ansible Diff output
This function needs to be supported per module, but fortunately many built in modules are already configured for support, including: ios_config, eos_config, junos_config, template, blockinfile, lineinfile, replace, etc …
I haven’t found a way yet to determine if a module supports it from the documentation but you can test by:
Giving it a try
Looking at the source code
Ansible Module development : How to add diff support to your module
To support and generate a --diff, a module needs to return a dictionary called diff with either:
Both versions of the content before and after the change (Ansible will generate the diff itself)
A summary of the change as it will be generated by the module: prepared
It’s useful to have both options available because some system like Junos will be able to generate the diff directly and it will usually be easier to understand than doing a line by line diff. For examle, Junos will always add the name of the section in the diff to help you understand where a change will happen where a generic line by line diff will usually only include few lines before and after the change to give some context but in some cases it might not be enough. In this case, you can provide the result directly using prepared instead of letting ansible generate the diff for you from the 2 versions of the content : before & after
{"diff": {"before":"<content before in string format>","after":"<content after in string format>",}}
or
{"diff": {"prepared":"<summary of the changes that has/will be applied>"}}
If you want to know if the module is running in diff mode, you can check the variable module._diff.
When you are providing both before and after, Ansible will do a comparison of the two strings and return a diff similar to what git will generate.
How to use the diff beyond text content
The diff has been designed to work on text content (string) but other types of variables generate good results as well. The best way to support all types of variables is to convert any variables in a string formatted with YAML. This way, Ansible will still get 2 strings to compare–it’s just that these strings will be the representation of structured data.
Ansible Diff applied to a variables represented in YAML
To generate this output from your module, you can dynamically convert your variable into a Yaml formatted string before exiting
The Network to Code team will be at Ansiblefest 2019 in Atlanta. Feel free to reach out about anything and everything Ansible-related or about network automation in general. We’re looking forward to meeting with everyone to discuss the latest Ansible news and trends.
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.