首页 > 解决方案 > 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"

标签: windowsansible

解决方案


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

推荐阅读