Windows 针对多个服务器和文件的Ansible文件检查
我有一个剧本,它有三个任务,检查文件是否存在,检查修改日期是否相同,校验和是否相同。它适用于只有一个文件名、日期和校验和的服务器Windows 针对多个服务器和文件的Ansible文件检查,windows,ansible,Windows,Ansible,我有一个剧本,它有三个任务,检查文件是否存在,检查修改日期是否相同,校验和是否相同。它适用于只有一个文件名、日期和校验和的服务器 Vars are serverA, file_name, time, chks1 但是我有很多服务器和不同的文件。我怎样才能做到这一点 serverA,file1, dat1, chks1 serverA, file2, dat2, chks2 serverB, file3, dat3, chks3 etc… 剧本的一部分: --- - name: Check i
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"
最简单的答案是进行代码复制,并根据需要多次编写此检查。如果您想成为一个智能cookie并尝试干燥,您可能希望开始使用host_vars(以保持服务器之间的差异),或者,如果您需要为一台服务器的几个文件使用它,要使用任务的“vars”部分具有不同值的
import\u tasks
模块。最简单的答案是进行代码复制,并根据需要多次写入此检查。如果您想成为一个智能cookie并尝试干燥,您可能希望开始使用主机变量(以保持服务器之间的差异),或者,如果您需要为一台服务器的几个文件使用主机变量,则可以为任务的“变量”部分使用具有不同值的import\u tasks
模块。解决方案1:在资源清册中声明文件
如果这有点静态,您可以将此信息放入变量中。最简单的方法是在每个主机的host\u vars/.yml
文件中:
check_files:
- name: file1
time: date1
checksum: chcks1
- name: file2
time: date2
checksum: chks2
只需为清单中的每台服务器创建一个带有相应声明的文件
然后,您的任务看起来就是这样(根据您的示例改编,未经测试)
解决方案2:在库存之外申报。
如果您确实希望/需要将这些文件声明保留在资源清册之外,并在playbook/play级别进行声明,则可以创建一个仍然引用服务器资源清册名称的数据结构,如:
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] }}"
笔记
- 我在您的数据结构中保留了
,因为您提到了它,尽管目前在您的任何示例任务中都没有使用它。在上述示例中,您可以使用与时间相同的方法来使用它校验和
- 符号
不是打字错误。循环结束前一次item.item.time
模块运行的win_stat
结果。因此,
引用当前循环的结果之一,而item
引用运行该任务时实际使用的项目(即变量声明中的实际文件)item.item
host\u vars/.yml
文件中:
check_files:
- name: file1
time: date1
checksum: chcks1
- name: file2
time: date2
checksum: chks2
只需为清单中的每台服务器创建一个带有相应声明的文件
然后,您的任务看起来就是这样(根据您的示例改编,未经测试)
解决方案2:在库存之外申报。
如果您确实希望/需要将这些文件声明保留在资源清册之外,并在playbook/play级别进行声明,则可以创建一个仍然引用服务器资源清册名称的数据结构,如:
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] }}"
笔记
- 我在您的数据结构中保留了
,因为您提到了它,尽管目前在您的任何示例任务中都没有使用它。在上述示例中,您可以使用与时间相同的方法来使用它校验和
- 符号
不是打字错误。循环结束前一次item.item.time
模块运行的win_stat
结果。因此,
引用当前循环的结果之一,而item
引用运行该任务时实际使用的项目(即变量声明中的实际文件)item.item