Search code examples
linuxansibleredhat

How to include special characters in the 'when' module?


The variable error_code below contains this string:

"failed": true

How can I use this string as the trigger for the 'when module? I am not sure how to escape these special characters so the playbook interprets them correctly. Here's what I have tried but it is not working:

  - name: copying index
    copy: 
      src: /tmp/index.html
      dest: /var/www/html/
    notify: reloadone
    register: error_code
  - name: verify content
    fail:
      msg: There has been an error with the index file
    when: " \"failed\"\: true in error_code"
  handlers:
  - name: reloadone
    systemd:
      state: restarted
      name: httpd

Solution

  • Put the string into the single-guotes, e.g.

    - hosts: localhost
      gather_facts: false
      vars:
        error_code: '"failed": true'
      tasks:
        - debug:
            var: error_code
        - name: verify content
          fail:
            msg: There has been an error with the index file
          when: error_code == result
          vars:
            result: '"failed": true'
    

    gives

    TASK [debug] ******************************************************
    ok: [localhost] => 
      error_code: '"failed": true'
    
    TASK [verify content] *********************************************
    fatal: [localhost]: FAILED! => changed=false 
      msg: There has been an error with the index file
    

    The next option is to convert the string to a dictionary and test the Boolean value of the attribute failed, e.g.

    - hosts: localhost
      gather_facts: false
      vars:
        error_code: '"failed": true'
      tasks:
        - debug:
            var: error_code|from_yaml
        - name: verify content
          fail:
            msg: There has been an error with the index file
          when: result.failed
          vars:
            result: "{{ error_code|from_yaml }}"
    

    gives

    TASK [debug] ****************************************************
    ok: [localhost] => 
      error_code|from_yaml:
        failed: true
    
    TASK [verify content] *******************************************
    fatal: [localhost]: FAILED! => changed=false 
      msg: There has been an error with the index file
    

    If the code doesn't fail

        error_code: '"failed": false' 
    

    the condition will be skipped

    TASK [debug] *****************************************************
    ok: [localhost] => 
      error_code|from_yaml:
        failed: false
    
    TASK [verify content] ********************************************
    skipping: [localhost]