使用 ansible,如何检查某个文件是否由 ansible 管理?

使用 ansible,如何检查某个文件是否由 ansible 管理?

在为新的服务器环境编写 Ansible 剧本时,我想检查配置文件是否已由 Ansible 管理。如果不是,我想添加一个额外的步骤来备份当前配置文件,但我不想每次运行剧本时都进行备份。

这是我目前的角色,它包含filefact变量:

---
- name: Check if file exists
  stat:
    path: "{{file}}"
  register: filestat

- block:
    - command: "head -n1 {{file}}"
      check_mode: no
      changed_when: no
      when: file is defined
      register: ismanaged

    - set_fact: '{{fact}}={{"ansible" in ismanaged|lower}}'
  when: filestat.stat.exists


- set_fact: '{{fact}}=no'
  when: not filestat.stat.exists

- name: Clean up
  set_fact:
    filestat:
    ismanaged:

本质上,您传递要检查的文件名和要设置的事实变量名。它会检查文件的第一行是否包含“ansible”,然后将事实设置为“是”或“否”。这适用于{{ ansible_managed }}第一行包含标签的 Ansible 管理文件,但我确信这会遗漏一些。

有什么建议么?

答案1

使用 Ansible 时,你不应该这样想。如果你想用 Ansible 管理文件,那就去做吧。不要把手动和自动工作混在一起,因为这会使你的剧本变得更加复杂和难以阅读,而且没有必要。

如果您想要关注更改,请使用、等backup: true作为参数... 在这种情况下,Ansible 只会在文件更改时进行备份(它会调用 diff 来验证这一点)。因此 - 您的剧本的任何运行都不会生成新的备份文件。只有第一次。lineinfiletemplate

此后 - Ansible 不会生成备份,除非您手动更改文件(然后 Ansible 会覆盖它并复制旧文件作为备份)或更改模板(作为示例)。在这两种情况下,备份文件都是您可能需要的东西。

相关内容