anchor.diff:    * Start the node
   3. *In Parallel*: finish applying settings on running cluster and remove old files and binaries.
   
  -Each step is described in its own YAML file: `before.yml`, `stop_start.yml` and `after.yml`.
  -The role entry point routes to the appropriate step using role variable named `elasticsearch_step`:
  +Then descibe each step in its own YAML file: `before.yml`, `stop_start.yml` and `after.yml`.
  +Finally, the role entry point `main.yml` will include the appropriate step using a variable named `elasticsearch_step`:
   
   .roles/elasticsearch/tasks/main.yml
   [source,yaml]
   ----
  -  - name: "Running step {{ elasticsearch_step }}"
  -    include: "{{ elasticsearch_step }}.yml"
  +- name: "Running step {{ elasticsearch_step }}"
  +  include: "{{ elasticsearch_step }}.yml"
  +----
  +
  +We can also create a fake step including all the steps (more on that later):
  +
  +.roles/elasticsearch/tasks/all.yml
  +[source,yaml]
  +----
  +- include: "before.yml"
  +- include: "stop_start.yml"
  +- include: "after.yml"
   ----
   
   == Refactoring the playbook
   
  -Now in the playbook we will call the role 3 times, each step being called independently.
  +Now in the playbook we will call the role 3 times, each individual step being called independently.
   
   .playbook.yml
   [source,yaml]
  
positive.code: :image_dir: 2017-07-05-Ansible-and-rolling-upgrades
  :published_at: 2017-01-15
  
  Ansible is a nice tool to deploy software associated configuration for distributed systems like Elasticsearch, Kafka, Cassandra and the like.
  These distributed systems are built to avoid downtime and allow partial failures.
  Upgrading these softwares or updating their configuration requires restarting each member of the cluster.
  
  The aim of the this article is to explain an Ansible pattern I discovered deploying trying to improve deployment speed
  and yet being able to guarantee availability during the upgrade process.
  To improve deployment, you need to deploy all hosts in parallel.
  To guarantee availability, you can't stop all host at the same: you must deploy each host one after the other.
  
  == The problem
  
  Let's take the Elasticsearch example.
  The tasks required to deploy Elasticsearch on each host of the cluster are gather in an `elasticsearch` role.
  Then this role is applied to all hosts belonging to the `elasticsearch` group in the Ansible playbook.
  
  .playbook.yml
  
negative.code:     - role: elasticsearch
        elasticsearch_step: "after"
  ----
  
  Or even simpler, we can use `all` step:
  
  .playbook.yml
  [source,yaml]
  ----
  # New cluster
  - hosts: elasticsearch
    any_errors_fatal: true
    roles:
      - role: elasticsearch
        elasticsearch_step: "all"
  ----
  
  == Hot configuration
  
  Most of the time, I am running my Ansible playbook only to change settings that don't need nodes to be restarted.
  The trick is here to detect in the `before` step whether nodes should be restarted or not:
  Version upgrade? Configuration that can not be hot reloaded?
  On lucky days, you can skip the expensive `stop_start` step and have a quick deploy.
  