在为新的服务器环境编写 Ansible 剧本时,我想检查配置文件是否已由 Ansible 管理。如果不是,我想添加一个额外的步骤来备份当前配置文件,但我不想每次运行剧本时都进行备份。
这是我目前的角色,它包含file
和fact
变量:
---
- 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 来验证这一点)。因此 - 您的剧本的任何运行都不会生成新的备份文件。只有第一次。lineinfile
template
此后 - Ansible 不会生成备份,除非您手动更改文件(然后 Ansible 会覆盖它并复制旧文件作为备份)或更改模板(作为示例)。在这两种情况下,备份文件都是您可能需要的东西。