如何用Ansible创build一个空文件?

使用Ansible创build空文件最简单的方法是什么? 我知道我可以将一个空文件保存到files目录中,然后将其复制到远程主机,但我觉得有些不尽人意。

另一种方法是触摸远程主机上的文件:

 - name: create fake 'nologin' shell file: path=/etc/nologin state=touch owner=root group=sys mode=0555 

但是这个文件每次都会被触动,在日志中显示为一个黄线,这也是不尽人意的。

有没有更好的解决这个简单的问题?

文件模块的文档说

如果state=file ,那么如果state=file不存在,文件将不会被创build,如果需要该行为,请参阅复制或模板模块。

所以我们使用copy模块,只有在文件不存在的情况下(如果文件存在,它的内容被保留),使用force=no来创build一个新的空文件。

 - name: ensure file exists copy: content: "" dest: /etc/nologin force: no group: sys owner: root mode: 0555 

这是一个声明和优雅的解决scheme。

像这样的东西(首先使用stat模块收集数据,然后使用条件过滤)应该可以工作:

 - stat: path=/etc/nologin register: p - name: create fake 'nologin' shell file: path=/etc/nologin state=touch owner=root group=sys mode=0555 when: p.stat.exists is defined and not p.stat.exists 

您可能也可以利用changed_whenfunction。

另一个选项,使用命令模块:

 - name: Create file command: touch /path/to/file args: creates: /path/to/file 

“创build”参数确保如果文件存在,则不执行此操作。

在接受的答案的基础上,如果要在每次运行时检查文件的权限,并且在文件存在的情况下相应地进行更改,或者只是在不存在的情况下创build文件,则可以使用以下命令:

 - stat: path=/etc/nologin register: p - name: create fake 'nologin' shell file: path=/etc/nologin owner=root group=sys mode=0555 state={{ "file" if p.stat.exists else "touch"}} 

file: path=/etc/nologin state=touch

完全相同的触摸(新的1.4+) – 使用统计如果你不想改变文件时间戳。