{"id":6118,"date":"2019-07-04T07:19:57","date_gmt":"2019-07-04T07:19:57","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=6118"},"modified":"2021-11-16T11:30:00","modified_gmt":"2021-11-16T11:30:00","slug":"order-of-operations-during-ansible-playbook-parsing-explained","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/order-of-operations-during-ansible-playbook-parsing-explained\/","title":{"rendered":"Order of operations during Ansible playbook parsing explained!"},"content":{"rendered":"\n<p>We will delve into some specifics of how a playbook is parsed for Order of operations.<\/p>\n\n\n\n<p>Ansible can be assumed to be executed in a top to bottom order; that is the operation listed at the top of a file will be accomplished before the operation listed at the bottom of a file. Having said that, there are a few caveats and even a few ways to influence the order of operations.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"849\" height=\"479\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2019\/07\/Order-of-operations-during-playbook.jpg\" alt=\"\" class=\"wp-image-6119\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2019\/07\/Order-of-operations-during-playbook.jpg 849w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2019\/07\/Order-of-operations-during-playbook-300x169.jpg 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2019\/07\/Order-of-operations-during-playbook-768x433.jpg 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2019\/07\/Order-of-operations-during-playbook-660x372.jpg 660w\" sizes=\"auto, (max-width: 849px) 100vw, 849px\" \/><\/figure>\n\n\n\n<p>A playbook has only two main operations it can accomplish. It can either run a play, or it can include another playbook from somewhere on the filesystem. The order in which these are accomplished is simply the order in which they appear in the playbook file, from top to bottom. It is important to note that while the operations are executed in order, the entire playbook, and any included playbooks, is completely parsed before any executions. This means that any included playbook file has to exist at the time of the playbook parsing. They cannot be generated in an earlier operation.<\/p>\n\n\n\n<p>Here is an example play with most of these operations shown:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">---\n- hosts: localhost\n  <span class=\"hljs-attr\">gather_facts<\/span>: <span class=\"hljs-literal\">false<\/span>\n\n  <span class=\"hljs-attr\">vars<\/span>:\n    - a_var: derp\n\n  <span class=\"hljs-attr\">pre_tasks<\/span>:\n    - name: pretask\n      <span class=\"hljs-attr\">debug<\/span>: msg=<span class=\"hljs-string\">\"a pre task\"<\/span>\n      <span class=\"hljs-attr\">changed_when<\/span>: <span class=\"hljs-literal\">true<\/span>\n      <span class=\"hljs-attr\">notify<\/span>: say hi\n\n  <span class=\"hljs-attr\">roles<\/span>:\n    - role: simple\n      <span class=\"hljs-attr\">derp<\/span>: newval\n\n  <span class=\"hljs-attr\">tasks<\/span>:\n    - name: task\n      <span class=\"hljs-attr\">debug<\/span>: msg=<span class=\"hljs-string\">\"a task\"<\/span>\n      <span class=\"hljs-attr\">changed_when<\/span>: <span class=\"hljs-literal\">true<\/span>\n      <span class=\"hljs-attr\">notify<\/span>: say hi\n\n  <span class=\"hljs-attr\">post_tasks<\/span>:\n    - name: posttask\n      <span class=\"hljs-attr\">debug<\/span>: msg=<span class=\"hljs-string\">\"a post task\"<\/span>\n      <span class=\"hljs-attr\">changed_when<\/span>: <span class=\"hljs-literal\">true<\/span>\n      <span class=\"hljs-attr\">notify<\/span>: say hi<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Reference<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/subscription.packtpub.com\/book\/networking_and_servers\/9781784395483\/1\/ch01lvl1sec10\/playbook-parsing\" target=\"_blank\" rel=\"noopener\">Playbook parsing<\/a><\/li><\/ul>\n\n\n<div class=\"epyt-gallery\" data-currpage=\"1\" id=\"epyt_gallery_44762\"><iframe loading=\"lazy\"  id=\"_ytid_18814\"  width=\"760\" height=\"427\"  data-origwidth=\"760\" data-origheight=\"427\" src=\"https:\/\/www.youtube.com\/embed\/?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=0&#038;cc_lang_pref=&#038;iv_load_policy=1&#038;loop=0&#038;rel=1&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;theme=dark&#038;color=red&#038;controls=1&#038;disablekb=0&#038;\" class=\"__youtube_prefs__  no-lazyload\" title=\"YouTube player\"  data-epytgalleryid=\"epyt_gallery_44762\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe><div class=\"epyt-gallery-list\"><div>Sorry, there was a YouTube error.<\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>We will delve into some specifics of how a playbook is parsed for Order of operations. Ansible can be assumed to be executed in a top to bottom order; that&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5038],"tags":[],"class_list":["post-6118","post","type-post","status-publish","format-standard","hentry","category-ansible"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/6118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=6118"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/6118\/revisions"}],"predecessor-version":[{"id":25508,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/6118\/revisions\/25508"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=6118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=6118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=6118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}