Question:
I’m working on automating a task which needs to append the latest version of software to a file. I don’t want it to do this multiple times for the same version.
It looks at the following example file:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var software releases = new Array( "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "4.11.0", "4.12.1", "4.14.0", "4.15.0", "4.16.0", ); |
the defaults main.yml would pass in something like
1 2 |
VERSION: 4.16.2 |
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
- name: register version check shell: cat /root/versions.js | grep -q {{VERSION}} register: current_version - debug: msg="The registered variable output is {{ current_version.rc }}" - name: append to versions.js lineinfile: dest: /root/versions.js regexp: '^\);' insertbefore: '^#\);' line: " \"{{VERSION}}\",\n);" owner: root state: present when: current_version.rc == 1 |
problem: the debug message is evaluating current_version.rc and showing me boolean values based on the grep commands output, but I can’t re-use this in the when
conditional to determine if the task should be run.
Edit: the output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
PLAY [localhost] ************************************************************** GATHERING FACTS *************************************************************** ok: [localhost] TASK: [test | register version check] ***************************************** failed: [localhost] => {"changed": true, "cmd": "cat /root/versions.js | grep -q 3.19.2", "delta": "0:00:00.003570", "end": "2015-12-17 00:24:49.729078", "rc": 1, "start": "2015-12-17 00:24:49.725508", "warnings": []} FATAL: all hosts have already failed -- aborting PLAY RECAP ******************************************************************** to retry, use: --limit @/root/site.retry localhost : ok=1 changed=0 unreachable=0 failed=1 |
Answer:
When grep
returns an exit code of 1 when it doesn’t match any lines. Ansible then interprets this (actually any status code other than 0 from a shell/command task) as an error and so promptly fails.
You can tell Ansible to ignore the response code from the shell/command task by using ignore_errors
. Although with grep
this will ignore actual errors (given by a return code of 2) so instead you might want to use failed_when
like this:
1 2 3 4 5 |
- name: register version check shell: cat /root/versions.js | grep -q {{VERSION}} register: current_version failed_when: current_version.rc == 2 |