Search code examples
regexansibleconditional-statements

Ansible - How to do integer comparison in a conditional?


I am trying to do a simple integer comparison in a conditional but something is up, and it is not evaluating properly.

Code within playbook:

     - name: Check the version of the current sql database on both dispatchers and save that value.
       command: /usr/bin/mysql -V
       changed_when: false
       register: sqlversion

     - name: Print to the screen the current sql database version.
       debug:
         var: "{{ sqlversion.stdout.split()[4] | regex_search('[0-9]+\\.[0-9]+') | replace(\".\",'') }}"
       register: w

     - name: Show the value of the variable.
       debug:
         var: w

     - name: Test result
       command: w
       when: ( w | int < 55 )

The output of the command module (ultimately to get the 5.5 part of the 5.5.43 number:

mysql  Ver 14.14 Distrib 5.5.43, for Linux (x86_64) using readline 5.2

My actual run in which the Test result task "fails" as in it runs when it should not, because of the evaluation problem:

TASK [Check the version of the current sql database on both dispatchers and save that value.] ***********
ok: [server2]
ok: [server1]

TASK [Print to the screen the current sql database version.] ********************************************
ok: [server1] => {
    "55": "55"
}
ok: [server2] => {
    "55": "55"
}

TASK [Show the value of the variable.] ******************************************************************
ok: [server1] => {
    "w": {
        "55": "55",
        "changed": false,
        "failed": false
    }
}
ok: [server2] => {
    "w": {
        "55": "55",
        "changed": false,
        "failed": false
    }
}

TASK [Test result] **************************************************************************************
changed: [server1]
changed: [server2]

This is not right or expected, clearly the last task shows "changed" in that it ran, and evaluated the condition as true when it shouldn't be. Instead with how I coded the conditional, it should be skipped instead! Additionally, if I take away the " | int" then it always skips no matter what the number(s) are.

What's the issue here? There's got to be a way to make this work.


Solution

  • Simplify the parsing

    w: "{{ sqlversion.stdout|split(',')|first|split()|last }}"
    

    gives

    w: 5.5.43
    

    Use the test version. See Comparing versions. For example,

        - debug:
            msg: Version is lower than 5.6
          when: w is version('5.6', '<')
    

    Example of a complete playbook for testing

    - hosts: localhost
    
      vars:
    
        sqlversion:
          stdout: "mysql  Ver 14.14 Distrib 5.5.43, for Linux (x86_64) using readline 5.2"
        w: "{{ sqlversion.stdout|split(',')|first|split()|last }}"
    
      tasks:
    
        - debug:
            var: w
        - debug:
            msg: Version is lower than 5.6
          when: w is version('5.6', '<')
    

    If the filter split is not available use the method twice

    w: "{{ (sqlversion.stdout.split(',')|first).split()|last }}"