Ansible - 版本文件检查
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible - 版本文件检查相关的知识,希望对你有一定的参考价值。
我想能够读取一个版本文件,如果它存在,并检查其内容。如果版本已更改或文件不存在,则返回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}}"
它会破坏冗余,但仍然不是我想要的。可悲的是,我无法从角色注册返回值。
答案
删除除write file
任务以外的所有内容并删除条件。
Ansible会自动为您完成此操作。
- name: write file
copy:
dest: "{{version_path}}"
content: "{{version_expected}}"
owner: "{{version_owner}}"
group: "{{version_group}}"
在您更改问题后,根据提供的信息,我唯一可以指出的是使用slurp
模块而不是查找,因为查找插件在控制机器中本地工作。
使用您的逻辑或内置version_compare
过滤器/测试比较版本。
以上是关于Ansible - 版本文件检查的主要内容,如果未能解决你的问题,请参考以下文章
Ansible自动化运维实战在docker环境部署ansible管理平台awx