我使用 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