如何使用 Ansible 截断现有和打开的文件?

How to truncate an existing and opened file using Ansible?

我喜欢截断或调整由其他应用程序打开和使用的现有文件。例如,随着时间的推移,磁盘可能会被占用大量 space 的日志文件弄得乱七八糟,例如 /var/log/secure.

简单来说 Linux 相当于

truncate -s 0 /var/log/secure
dd if=/dev/zero of=/var/log/secure bs=1M count=0
echo > /var/log/secure

根据

并通过 tail -F /var/log/secure 每个都会​​导致

==> /var/log/secure <==
tail: /var/log/secure: file truncated
tail: /var/log/secure: file truncated
tail: /var/log/secure: file truncated

而不是

==> /var/log/secure <==
tail: ‘/var/log/secure’ has been replaced;  following end of new file

经过一些测试,Ansible v2.9 中的所有可用模块(filelineinfilecopy 等)似乎都用新的空文件替换了现有文件,但不会截断或调整大小并导致已经提到的

==> /var/log/secure <==
tail: ‘/var/log/secure’ has been replaced;  following end of new file

我知道通过 logrotate 旋转、压缩和删除日志文件可能是更好的解决方案。

似乎 Ansible 问题 #902 没有以那种方式实现。

但是,从 Ansible v3.0.0 开始,随着 filesize_module,引入了一个围绕 dd 的简单包装器,用于根据文件的大小创建、扩展或截断文件。

它可用于管理交换文件(需要连续块)或巨大的稀疏文件。

有关详细信息,请参阅 /ansible-collections/community.general/blob/main/plugins/modules/files/ 下的 filesize.py