bugcy013
6/14/2015 - 2:32 AM

ansible_conditionals_examples.yaml

---
# The "" makes this evaluate to a string. Which is good in some cases and bad in other...
is_mgmt: "'$inventory_hostname' == 'webmgmt'"
is_live: "'$inventory_hostname' == 'weblive1' or '$inventory_hostname' == 'weblive2'"
---
# This has been tested with ansible 1.3 with these commands:
#   ansible-playbook -i hosts ansible_conditionals_examples.yaml --extra-vars="hosts=myhosts isFirstRun=false"
#   ansible-playbook -i hosts ansible_conditionals_examples.yaml --extra-vars="hosts=myhosts isFirstRun=true"
#   ansible-playbook -i hosts ansible_conditionals_examples.yaml --extra-vars="hosts=myhosts"
# NB: The type of the variable is crucial!

- name: Ansible Conditionals Examples
  hosts: $hosts
  vars_files:
    - vars.yml
  tasks:
########### Correct COMPLEX expressions ###################
    # Need parentheses around $is_live, because it (may) contain an _or_, and _and_ has higher prio than _or_;
    - name: ($is_live) and (isFirstRun == 'true')  # OK only if isFirstRun is defined. 
      command: echo hello
      when: ($is_live) and (isFirstRun == 'true')

    # isFirstRun is a string var, whereas is_mgmt is an expression evaluating to a string, so it seems we need the $ to dereference it
    - name: $is_mgmt and (isFirstRun == 'true')       # OK only if isFirstRun is defined
      command: echo hello
      when: $is_mgmt and (isFirstRun == 'true')
      
    - name: $is_mgmt and (isFirstRun != 'false')      # OK only if isFirstRun is defined
      command: echo hello
      when: $is_mgmt and (isFirstRun != 'false')
      
    - name: $is_mgmt and (not isFirstRun == 'false')  # OK only if isFirstRun is defined
      command: echo hello
      when: $is_mgmt and (not isFirstRun == 'false')
########### SIMPLE expressions ############################
    - name: is_mgmt     # OK
      command: echo hello
      when: is_mgmt
      
    - name: $is_mgmt    # OK
      command: echo hello
      when: $is_mgmt

    - name: ($is_mgmt)  # OK
      command: echo hello
      when: ($is_mgmt)

    - name: (is_mgmt)   # WRONG - Always runs
      command: echo hello
      when: (is_mgmt)
######
    - name: isFirstRun == 'true'      # OK
      command: echo hello
      when: isFirstRun == 'true'
      
    - name: not isFirstRun != 'true'  # OK
      command: echo hello
      when: not isFirstRun != 'true'
      
    - name: not isFirstRun == 'false' # OK
      command: echo hello
      when: not isFirstRun == 'false'

    - name: isFirstRun != 'false'     # OK
      command: echo hello
      when: isFirstRun != 'false'
      
    - name: $isFirstRun == 'true'     # WRONG - $isFirstRun is interpreted as true and true is not equal to 'true' so only works for negative match
      command: echo hello
      when: $isFirstRun == 'true'
########### All wrong #####################################
    - name: ($is_live == True) and (isFirstRun == 'true')  # WRONG - Only first live node on true (none of false (correct))
      command: echo hello
      when: ($is_live == True) and (isFirstRun == 'true')

    - name: $is_live and (isFirstRun == 'true')  # WRONG - Correct when true, but only first live when false
      # ['$inventory_hostname' == 'tsrvuweblive71' or '$inventory_hostname' == 'tsrvuweblive72' and (isFirstRun == 'true')] 
      command: echo hello
      when: $is_live and (isFirstRun == 'true')
      
    - name: is_live and (isFirstRun == 'true')   # WRONG - All nodes run on true (none of false (correct))
      command: echo hello
      when: is_live and (isFirstRun == 'true')
      
    - name: ($is_live == 'True') and (isFirstRun == 'true')  # WRONG - Only first live node on true (none on false (correct)) 
      command: echo hello
      when: ($is_live == 'True') and (isFirstRun == 'true')
      
    - name: (is_live == 'True') and (isFirstRun == 'true')   # WRONG - No nodes run on niether true nor false - is_live not dereferenced
      command: echo hello
      when: (is_live == 'True') and (isFirstRun == 'true')
######
    - name: is_mgmt and (isFirstRun == 'true')
      # WRONG - All run on true
      command: echo hello
      when: is_mgmt and (isFirstRun == 'true')
      
    - name: is_mgmt and (isFirstRun != 'false')
      # WRONG - All run on true
      command: echo hello
      when: is_mgmt and (isFirstRun != 'false')
      
    - name: is_mgmt and (not isFirstRun == 'false')
      # WRONG - All run on true
      command: echo hello
      when: is_mgmt and (not isFirstRun == 'false')

    - name: mgmt and isFirstRun equal true with ()
      # WRONG - Does not run when isFirstRun is 'false' (which is correct), but runs all nodes when 'true'  
      command: echo hello
      when: ((is_mgmt) and (isFirstRun == 'true'))
      
    - name: mgmt and isFirstRun not_equal true with $
      # WRONG - Always runs mgmt irrespective of value of isFirstRun 
      command: echo hello
      when: $is_mgmt and $isFirstRun != 'true'
      
    - name: mgmt and not isFirstRun equal true with $
      # # WRONG - Always runs mgmt irrespective of value of isFirstRun
      command: echo hello
      when: $is_mgmt and not $isFirstRun == 'true'
      
    - name: mgmt and isFirstRun equal true with $
      # WRONG - Never runs any node
      command: echo hello
      when: $is_mgmt and $isFirstRun == 'true'
      
    - name: mgmt and not isFirstRun equal true with only_if and $
      # WRONG - All nodes run
      command: echo hello
      only_if: "'$is_mgmt' and not '$isFirstRun' == 'true'"
      
    - name: mgmt and isFirstRun not_equal true with only_if and $
      # WRONG - All nodes run
      command: echo hello
      only_if: "'$is_mgmt' and '$isFirstRun' != 'true'"
      
    - name: mgmt and isFirstRun not_equal true with ()
      # WRONG - All nodes run when isFirstRun is false and no nodes run when isFirstRun is true
      command: echo hello
      when: ((is_mgmt) and (isFirstRun != 'true'))

    - name: mgmt and isFirstRun not_equal true
      # WRONG - All nodes run when isFirstRun is false and no nodes run when isFirstRun is true
      command: echo hello
      when: is_mgmt and isFirstRun != 'true'
      
    - name: mgmt and not isFirstRun equal true
      # WRONG - All nodes run when isFirstRun is false and no nodes run when isFirstRun is true
      command: echo hello
      when: is_mgmt and not isFirstRun == 'true'

    - name: mgmt and not isFirstRun equal true with ()
      # WRONG - All nodes run when isFirstRun is false and no nodes run when isFirstRun is true
      command: echo hello
      when: ((is_mgmt) and (not isFirstRun == 'true'))

    - name: mgmt and not isFirstRun equal true with only_if, $ and ()
      # ERROR Conditional expression must evaluate to True or False: ($is_mgmt) and (not '$isFirstRun' == 'true')
      command: echo hello
      only_if: "($is_mgmt) and (not '$isFirstRun' == 'true')"