Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 针对多个服务器和文件的Ansible文件检查_Windows_Ansible - Fatal编程技术网

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
    引用运行该任务时实际使用的项目(即变量声明中的实际文件)
解决方案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
    引用运行该任务时实际使用的项目(即变量声明中的实际文件)

您好,请使用主机变量表示文件名、时间,chks1表示特定服务器。请使用主机变量表示文件名、时间,chks1表示特定服务器