2deep4real
2deep4real

Reputation: 11

Ansible - Versionfile check

I want to be able to read a versionfile if it exists, and check its contents. Then return True if the version changed or the file does not exists, False if versionfile exists and the version matches the content.

Basically this:


    # setup test data
    - set_fact:
        version_expected: "0001"
        version_path: "/path/to/version"
        version_owner: "root"
        version_group: "root"

    # this block is used to check for version changes
    - name: check version change
      block:
        - name: check version file
          stat:
            path: "{{version_path}}"
          register: version_file
        - set_fact:
            version_remote: "{{ lookup('file', version_path) | default('') }}"
          when: version_file.stat.exists
        - set_fact:
            version_changed: not version_file.stat.exists or version_remote != version_expected

    # test writing new version
    - name: write file
      copy:
        dest: "{{version_path}}"
        content: "{{version_expected}}"
        owner: "{{version_owner}}"
        group: "{{version_group}}"
      when: version_changed

My problem is: This is somewhat ugly and becoming quite redundant in my roles. Is there a more elegant way to do this? Is there maybe a module for this? (though I found none) Or should I just write a module for this?

Best regards, 2d4r

EDIT:

im only meaning the "check version change" block, the surrounding code is for debugging only. To be more specific, I want to download a server binary, but only if my expectet version differs from the content of the versionfile. I want to write the new version to file, if (and only if) the download was successfull, but that is not part of my question.

EDIT2:

I got this by now:

# roles/_helper/tasks/version_check.yml

- name: check if file exists
  stat:
    path: "{{version_path}}"
  register: version_file
- name: get remote version
  slurp:
    src: "{{version_path}}"
  register: version_changed
  when: version_file.stat.exists
# (False if versionfile exists and version is expected; True else)
- name: set return value
  set_fact:
    version_changed: "{{ not version_file.stat.exists or ((version_changed.content | b64decode) is version_compare(version_expected, 'ne')) }}"

used like this:

# /roles/example/tasks/main.yml

- include_role:
    name: _helper
    tasks_from: version_check
  vars:
    version_path: "{{file_version_path}}"
    version_expected: "{{file_version_expected}}"

- name: doing awesome things
  when: version_changed
  block:
    - name: download server
      [...]
    - name: write version
      copy:
        dest: "{{file_version_path}}"
        content: "{{file_version_expected}}"

It kills the redundancy, but is still not what I want. Sadly I can not register a return value from a role.

Upvotes: 1

Views: 439

Answers (1)

techraf
techraf

Reputation: 68489

Delete everything except for write file task and remove the condition.

Ansible does this automatically for you.

- name: write file
  copy:
    dest: "{{version_path}}"
    content: "{{version_expected}}" 
    owner: "{{version_owner}}" 
    group: "{{version_group}}"

After you changed the question, given the information provided, the only thing I can point to is to use slurp module instead of lookup, as an lookup plugins work locally in the control machine.

Compare versions using your logic or built-in version_compare filter/test.

Upvotes: 1

Related Questions