如何创建一个与安赛尔空文件?

什么是最简单的方法来创建一个空文件使用安赛尔?我知道我可以将一个空文件保存到 files目录中,然后将其复制到远程主机,但是我发现这有点不令人满意。

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

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

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

对于这个简单的问题还有更好的解决办法吗?

139662 次浏览

像这样的东西(首先使用 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_when功能。

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

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

“ create”参数确保在文件存在的情况下不执行此操作。

在已接受答案的基础上,如果您希望每次运行都检查该文件的权限,并且如果该文件存在,这些权限将相应地进行更改,或者如果该文件不存在,则只创建该文件,您可以使用以下方法:

- 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"}}

文件模块的文档说明

如果 state=file,文件将不会被创建,如果它不存在,请参阅副本或模板模块,如果您想要的行为。

因此,我们使用 复制模块,仅在文件不存在时(如果文件存在,则保留其内容)使用 force=no创建一个新的空文件。

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

这是一个声明式的、优雅的解决方案。

file: path=/etc/nologin state=touch

完全相当于触摸(1.4 + 中新增)-如果不想更改文件时间戳,请使用 stat。

事实证明,我没有足够的名声来评论这个问题,这将是一个更合适的地方:

Re.AllBlackt 的回答是,如果你更喜欢安赛布尔的多行格式,你需要调整 state的报价(我花了几分钟来解决这个问题,所以希望这能加快其他人的速度) ,

- 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" }}'

以便使用 ad-hoc 命令在远程计算机中创建文件

ansible client -m file -a"dest=/tmp/file state=touch"

如果我说错了,请纠正我

如果文件不存在则更改。创建空文件。

- name: create fake 'nologin' shell
file:
path: /etc/nologin
state: touch
register: p
changed_when: p.diff.before.state == "absent"

只有2.7以上

可视化 file模块提供了一种无需修改文件时间即可触摸文件的方法。

- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
mode: u+rw,g-wx,o-rwx
modification_time: preserve
access_time: preserve


参考文献: Https://docs.ansible.com/ansible/latest/modules/file_module.html

两个答案的组合,加上一个转折。在创建文件或更新权限时,将检测到更改的代码。

- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
mode: 0644
modification_time: preserve
access_time: preserve
changed_when: >
p.diff.before.state == "absent" or
p.diff.before.mode|default("0644") != "0644"

以及一个版本,该版本还可以纠正所有者和组,并在纠正以下内容时检测到所更改的内容:

- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
state: touch
mode: 0644
owner: root
group: root
modification_time: preserve
access_time: preserve
register: p
changed_when: >
p.diff.before.state == "absent" or
p.diff.before.mode|default("0644") != "0644" or
p.diff.before.owner|default(0) != 0 or
p.diff.before.group|default(0) != 0