Answers:
您可以首先检查目标文件是否存在,然后根据其结果输出做出决定:
tasks:
- name: Check that the somefile.conf exists
stat:
path: /etc/file.txt
register: stat_result
- name: Create the file, if it doesnt exist already
file:
path: /etc/file.txt
state: touch
when: not stat_result.stat.exists
stat_result
将具有stat_result.state.exists
False(即第二个任务运行时)。您可以在此处查看stat模块的详细信息:docs.ansible.com/ansible/stat_module.html
when: stat_result.stat.exists == False
至,when: not stat_result.stat.exists
如果您希望它阅读得更自然。
该统计模块将做到这一点,以及获得许多其他信息的文件。从示例文档中:
- stat: path=/path/to/something
register: p
- debug: msg="Path exists and is a directory"
when: p.stat.isdir is defined and p.stat.isdir
通常,您可以使用stat模块执行此操作。但是命令模块具有creates
使此操作非常简单的选项:
- name: touch file
command: touch /etc/file.txt
args:
creates: /etc/file.txt
我想您的触摸命令只是一个例子?最佳实践是根本不检查任何东西,而让ansible进行工作-使用正确的模块。因此,如果要确保文件存在,可以使用文件模块:
- name: make sure file exists
file:
path: /etc/file.txt
state: touch
state: file
不创建文件。参见docs.ansible.com/ansible/file_module.html
vars:
mypath: "/etc/file.txt"
tasks:
- name: checking the file exists
command: touch file.txt
when: mypath is not exists
when: mypath is not exists
在这种情况下是什么意思?这不是mypath
一个简单的字符串吗?
我发现这样做很多.stat.exists
类型检查可能很烦人并且容易出错。例如,他们需要格外小心才能使检查模式(--check
)工作。
这里有很多答案建议
但是,有时这是一种代码味道,因此始终寻找使用Ansible的更好方法,特别是使用正确的模块有很多优点。例如
- name: install ntpdate
package:
name: ntpdate
要么
- file:
path: /etc/file.txt
owner: root
group: root
mode: 0644
但是,当不可能使用一个模块时,还要调查是否可以注册并检查上一个任务的结果。例如
# jmeter_version: 4.0
- name: Download Jmeter archive
get_url:
url: "http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-{{ jmeter_version }}.tgz"
dest: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
checksum: sha512:eee7d68bd1f7e7b269fabaf8f09821697165518b112a979a25c5f128c4de8ca6ad12d3b20cd9380a2b53ca52762b4c4979e564a8c2ff37196692fbd217f1e343
register: download_result
- name: Extract apache-jmeter
unarchive:
src: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
dest: "/opt/jmeter/"
remote_src: yes
creates: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}"
when: download_result.state == 'file'
请注意when:
,但也creates:
因此--check
不会报错了
我之所以这样说是因为这些不理想的做法通常成对出现,即没有apt / yum包,因此我们必须1)下载和2)解压缩
希望这可以帮助
发现调用stat
速度很慢,并且会收集很多文件存在检查不需要的信息。
花了一些时间寻找解决方案之后,我发现了以下解决方案,它的运行速度更快:
- raw: test -e /path/to/something && echo true || echo false
register: file_exists
- debug: msg="Path exists"
when: file_exists == true
您可以使用Ansible stat模块注册文件,以及使用when模块应用条件。
- name: Register file
stat:
path: "/tmp/test_file"
register: file_path
- name: Create file if it doesn't exists
file:
path: "/tmp/test_file"
state: touch
when: file_path.stat.exists == False
**
**
以下是当文件存在于操作系统端时用于删除文件的ansible播放。
- name: find out /etc/init.d/splunk file exists or not'
stat:
path: /etc/init.d/splunk
register: splunkresult
tags:
- always
- name: 'Remove splunk from init.d file if splunk already running'
file:
path: /etc/init.d/splunk
state: absent
when: splunkresult.stat.exists == true
ignore_errors: yes
tags:
- always
我已经使用了如下的播放条件
when: splunkresult.stat.exists == true --> Remove the file
您可以根据需要提供对/错
when: splunkresult.stat.exists == false
when: splunkresult.stat.exists == true
如果您只是想确保某个文件存在(例如,因为应该以不同于通过ansible的方式创建文件)并且如果没有则失败,则可以执行以下操作:
- name: sanity check that /some/path/file exists
command: stat /some/path/file
check_mode: no # always run
changed_when: false # doesn't change anything