Ansible - 版本文件检查

问题描述 投票:0回答:1

我想能够读取一个版本文件,如果它存在,并检查其内容。如果版本已更改或文件不存在,则返回True;如果存在版本文件且版本与内容匹配,则返回False。

基本上这个:


    # 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

我的问题是:这有点难看,在我的角色中变得非常多余。有没有更优雅的方式来做到这一点?可能有一个模块吗? (虽然我没有找到)或者我应该为此写一个模块?

最好的问候,2d4r

编辑:

im仅表示“检查版本更改”块,周围的代码仅用于调试。更具体地说,我想下载服务器二进制文件,但前提是我的expectet版本与versionfile的内容不同。我想将新版本写入文件,如果(并且仅当)下载成功,但这不是我的问题的一部分。

Aaditi:

我现在得到了这个:

# 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')) }}"

像这样使用:

# /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}}"

它会破坏冗余,但仍然不是我想要的。可悲的是,我无法从角色注册返回值。

file ansible version
1个回答
1
投票

删除除write file任务以外的所有内容并删除条件。

Ansible会自动为您完成此操作。

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

在您更改问题后,根据提供的信息,我唯一可以指出的是使用slurp模块而不是查找,因为查找插件在控制机器中本地工作。

使用您的逻辑或内置version_compare过滤器/测试比较版本。

© www.soinside.com 2019 - 2024. All rights reserved.