{"id":135,"date":"2019-07-10T11:41:16","date_gmt":"2019-07-10T03:41:16","guid":{"rendered":"http:\/\/mayanknauni.com\/?p=135"},"modified":"2019-07-10T11:42:39","modified_gmt":"2019-07-10T03:42:39","slug":"network-automation-with-ansible-part-3-generating-device-configuration-with-jinja2-templates","status":"publish","type":"post","link":"https:\/\/mayanknauni.com\/?p=135","title":{"rendered":"Network Automation with Ansible &#8211; Part 3 &#8211; Generating Device Configuration with Jinja2 Templates"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">In this example I generated configuration for two switches, where I configured few VLANs and their interfaces and some DHCP Pools.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Jinja2 Template<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">I am using Jinja2 templating module to generate the configuration. I am using a tree structure of directory and files to pass the configuration commands and variable required to generate the configuration. I create a role named <strong><em>switch<\/em><\/strong> which I called in my playbook.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"> <strong><em>The directories are structured as<\/em><\/strong> <\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1253\" height=\"795\" src=\"https:\/\/i1.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/tree-structure.png?fit=604%2C383&amp;ssl=1\" alt=\"\" class=\"wp-image-138\" srcset=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/tree-structure.png?w=1253&amp;ssl=1 1253w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/tree-structure.png?resize=300%2C190&amp;ssl=1 300w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/tree-structure.png?resize=768%2C487&amp;ssl=1 768w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/tree-structure.png?resize=1024%2C650&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption><em>Role &#8211; Switch<\/em><br><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Playbook<\/em><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1376\" height=\"604\" src=\"https:\/\/i2.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Playbook.png?fit=604%2C265&amp;ssl=1\" alt=\"\" class=\"wp-image-139\" srcset=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Playbook.png?w=1376&amp;ssl=1 1376w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Playbook.png?resize=300%2C132&amp;ssl=1 300w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Playbook.png?resize=768%2C337&amp;ssl=1 768w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Playbook.png?resize=1024%2C449&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption><em>Playbook<\/em><br><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><em>Task\/main.yml<\/em><\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1819\" height=\"366\" src=\"https:\/\/i1.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Task.png?fit=604%2C122&amp;ssl=1\" alt=\"\" class=\"wp-image-140\" srcset=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Task.png?w=1819&amp;ssl=1 1819w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Task.png?resize=300%2C60&amp;ssl=1 300w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Task.png?resize=768%2C155&amp;ssl=1 768w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Task.png?resize=1024%2C206&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption><em>Task<\/em><br><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><em>Templates\/switch. j2<\/em><\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1340\" height=\"1036\" src=\"https:\/\/i1.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Template.png?fit=604%2C467&amp;ssl=1\" alt=\"\" class=\"wp-image-141\" srcset=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Template.png?w=1340&amp;ssl=1 1340w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Template.png?resize=300%2C232&amp;ssl=1 300w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Template.png?resize=768%2C594&amp;ssl=1 768w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Template.png?resize=1024%2C792&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption><em>Template<\/em><br><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><em>Vars\/main.yml<\/em><\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1734\" height=\"666\" src=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Variables.png?fit=604%2C232&amp;ssl=1\" alt=\"\" class=\"wp-image-142\" srcset=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Variables.png?w=1734&amp;ssl=1 1734w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Variables.png?resize=300%2C115&amp;ssl=1 300w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Variables.png?resize=768%2C295&amp;ssl=1 768w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Variables.png?resize=1024%2C393&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption><em>Variables<\/em><br><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><em>Sample Configuration Generated by Playbook, Template and Variables<\/em><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">I generated configuration for two switches, as I passed the variables for two switches.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Switch 1<\/em><\/strong><br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"797\" height=\"932\" src=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Configuration-Switch1.png?resize=797%2C932&#038;ssl=1\" alt=\"\" class=\"wp-image-143\" srcset=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Configuration-Switch1.png?w=797&amp;ssl=1 797w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Configuration-Switch1.png?resize=257%2C300&amp;ssl=1 257w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Configuration-Switch1.png?resize=768%2C898&amp;ssl=1 768w\" sizes=\"auto, (max-width: 797px) 100vw, 797px\" \/><figcaption><em>Configuration &#8211; Switch 1<\/em><br><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Switch 2<\/em><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"951\" src=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Configuration-Switch2.png?resize=752%2C951&#038;ssl=1\" alt=\"\" class=\"wp-image-144\" srcset=\"https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Configuration-Switch2.png?w=752&amp;ssl=1 752w, https:\/\/i0.wp.com\/mayanknauni.com\/wp-content\/uploads\/2019\/07\/Configuration-Switch2.png?resize=237%2C300&amp;ssl=1 237w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><figcaption><em>Configuration &#8211; Switch2<\/em><br><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this example I generated configuration for two switches, where I configured few VLANs and their interfaces and some DHCP Pools. Jinja2 Template I am using Jinja2 templating module to generate the configuration. I am using a tree structure of&#46;&#46;&#46;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-135","post","type-post","status-publish","format-standard","hentry","category-netdevops"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mayanknauni.com\/index.php?rest_route=\/wp\/v2\/posts\/135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mayanknauni.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mayanknauni.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mayanknauni.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mayanknauni.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=135"}],"version-history":[{"count":3,"href":"https:\/\/mayanknauni.com\/index.php?rest_route=\/wp\/v2\/posts\/135\/revisions"}],"predecessor-version":[{"id":147,"href":"https:\/\/mayanknauni.com\/index.php?rest_route=\/wp\/v2\/posts\/135\/revisions\/147"}],"wp:attachment":[{"href":"https:\/\/mayanknauni.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=135"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mayanknauni.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=135"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mayanknauni.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}