如何使用 ansible 检查同一主机上的两个文件是否相同?

如何使用 ansible 检查同一主机上的两个文件是否相同?

我使用 Ansible 来管理节点,并且我想检查节点上的时区。

我发现在 centos 上,我应该根据 /usr/share/zoneinfo/{{ timezone }} 文件替换 /etc/localtime。

我在我的 ansible 剧本中写了这个任务:

- name: sync timezone file if different
  command: "rsync --itemize-changes --checksum --copy-links /usr/share/zoneinfo/{{ timezone }} /etc/localtime"

有效。

我的目标是仅在必要时执行操作,因此,只有发生变化时才会写入本地时间。

但我的问题是,我还想使用 Ansible 检查我的节点上的任何更改。当 ansible 执行命令时,它总是在报告中标记为“changed=1”,即使没有更改。

我尝试使用 ansible 的文件模块,但无论是将远程复制到本地还是将本地复制到远程,都无法将远程复制到远程。

我还尝试在此任务中使用带有注册选项的检查:

- name: Copy timezone {{ timezone }} to /etc/localtime
  shell: "[[ $(md5sum /usr/share/zoneinfo/Europe/Paris | cut -d' ' -f1) = $(md5sum /etc/localtime | cut -d' ' -f1) ]]"
  register: timezone_check

但这是一个相同的问题,命令总是被执行,因此改变会增加。

知道如何执行此操作吗?

答案1

有可能覆盖已改变的结果。

就您而言,您可以检查 shell 命令的结果并根据需要覆盖更改的状态。

具有覆盖变更结果的完整任务:

- name: Check timezone conf
  command: "rsync --itemize-changes --checksum --copy-links /usr/share/zoneinfo/{{ timezone }} /etc/localtime"
  register: timezone_check
  changed_when: "timezone_check.stdout.find('>') != -1"
  become: yes

答案2

为什么不直接创建符号链接?

- name: Set timezone
  file: src=/usr/share/zoneinfo/{{ timezone }} dest=/etc/localtime state=link

相关内容