Answers:
文件模块的文档说
如果为
state=file
,则如果文件不存在,则不会创建该文件,如果需要该行为,请参见副本或模板模块。
因此,我们使用复制模块,force=no
仅当文件不存在时才使用它创建一个新的空文件(如果文件存在,则保留其内容)。
- name: ensure file exists
copy:
content: ""
dest: /etc/nologin
force: no
group: sys
owner: root
mode: 0555
这是一个声明式的优雅解决方案。
这样的事情(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
'creates'参数确保如果文件存在,则不执行此操作。
如果希望在每次运行时检查文件的权限,并且在文件存在时进行相应的更改,或者在不存在时直接创建文件,则以接受的答案为基础,可以使用以下命令:
- 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"}}
文件模块提供了无需修改文件时间即可触摸文件的方法。
- 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
事实证明,我没有足够的声誉来将此评论作为评论,这将是一个更合适的地方:
回覆。AllBlackt的答案,如果您喜欢Ansible的多行格式,则需要调整报价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"
两个答案的组合,略有不同。创建文件或更新权限后,将检测到代码已更改。
- 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
force: no
。