windows - Ansible 文件检查多个服务器和文件
问题描述
我有一个剧本,其中包含三个任务,检查文件是否存在,检查修改日期是否相同以及校验和是否相同。它适用于具有一个文件名、日期和校验和的服务器
Vars are serverA, file_name, time, chks1
但是我有很多服务器和不同的文件。我怎样才能做到这一点?
serverA,file1, dat1, chks1
serverA, file2, dat2, chks2
serverB, file3, dat3, chks3 etc…
部分剧本:
---
- name: Check if file exists
win_stat:
path: "{{file_name}}"
register: file
- name: Status
assert:
that: file.stat.exists
fail_msg: "Check failed"
success_msg: "Check PASSED"
- name: Status modification
assert:
that: file.stat.lastwritetime|int == time|int
fail_msg: "Check failed"
success_msg: "Check PASSED"
解决方案
解决方案 1:在您的库存中声明文件
如果这有点静态,您可以将此信息放入您的库存变量中。最简单的方法是在host_vars/<inventory_hostname>.yml
每个主机的文件中:
check_files:
- name: file1
time: date1
checksum: chcks1
- name: file2
time: date2
checksum: chks2
只需为库存中的每个服务器创建一个文件,并带有相应的声明。
然后您的任务将看起来像这样(改编自您的示例,未经测试)。
- name: Check if file exists
win_stat:
path: "{{ item.name }}"
register: files
loop: "{{ check_files }}"
- name: Status
assert:
that: item.stat.exists
fail_msg: "Check failed"
success_msg: "Check PASSED"
loop: "{{ files.results }}"
- name: Status modification
assert:
that: item.stat.lastwritetime | int == item.item.time | int
fail_msg: "Check failed"
success_msg: "Check PASSED"
loop: "{{ files.results }}"
解决方案2:在库存之外申报。
如果您真的想要/需要将这些文件声明保留在您的清单之外并在剧本/播放级别声明它们,您可以创建一个仍然引用服务器的清单名称的数据结构,例如:
check_files:
host1:
- name: file1
time: date1
checksum: chks1
- name: file2
time: date2
checksum: chks2
host2:
- name: filex
time: timex
checksum: chks
在这种情况下,前面的示例仍然有效。您只需稍微更改第一个任务中的循环元素:
- name: Check if file exists
win_stat:
path: "{{ item.name }}"
register: files
loop: "{{ check_files[inventory_hostname] }}"
笔记
- 我将它保留
checksum
在您的数据结构中,因为您提到了它,尽管目前在您的任何示例任务中都没有使用它。time
您可以按照与上述示例相同的方式使用它。 - 该符号
item.item.time
不是打字错误。循环结束results
了上一个win_stat
模块运行。因此item
引用当前循环的结果之一,同时item.item
引用运行该任务时实际使用的项目(即变量声明中的实际文件)
推荐阅读
- ios - 如何在 Xamarin iOS App 中启用定位服务
- c++ - 如何使用感知器对插值数据进行归一化?
- azure-pipelines - 为什么拉取请求构建验证中的路径过滤器不能按预期工作?
- mysql - 如何处理 mysql 结果查询以通过大查询表发送它们
- jquery - 如何检查是否所有兄弟姐妹(包括选定的)都用 jQuery 检查?
- browser - 当用户单击 LinkedIn 链接时,Google OAuth 不起作用
- c - 扩展后连接#define
- javascript - VoiceOver 无法对锚点做出反应,并且无法正确更改对 iOS 的关注
- javascript - Vue 在生产模式下不会更新 API 调用加载的组件属性,但在开发中会更新
- css - 如何在Angular 7中动态地将CSS应用于按钮