使用Ansible stat模块检查目录是否存在或者是否为一个目录还是文件
理论知识
在Ansible中,你可以使用stat
模块来检查一个目录是否存在。stat
模块可以用来获取文件或目录的状态信息,包括它是否存在。下面是一个简单的例子,说明如何使用stat
模块来检查一个目录是否存在:
yaml
- name: Check if a directory exists
stat:
path: /path/to/directory
register: directory_stat
- name: Print a message depending on the existence of the directory
debug:
msg: "Directory exists"
when: directory_stat.stat.exists and directory_stat.stat.isdir
- name: Print an alternative message if the directory does not exist
debug:
msg: "Directory does not exist or is not a directory"
when: not directory_stat.stat.exists or not directory_stat.stat.isdir
在这个例子中:
stat
模块被用来获取指定路径的状态。- 使用
register
关键字将结果存储到directory_stat
变量中。 - 在第一个
debug
任务中,我们检查目录是否存在并且是一个目录(isdir
为True
)。 - 在第二个
debug
任务中,如果目录不存在或者不是一个目录,则打印一条消息。
这个方法确保了不仅检查路径的存在性,还确认了该路径确实是一个目录。如果需要进一步确认目录的状态(例如权限、所有者等),可以通过directory_stat.stat
访问更多的属性。
记得将/path/to/directory
替换为你想要检查的实际目录路径。
例子懂得多
在使用中遇到了一下问题,记录一下:
playbook包含一下内容:
yaml
---
- name: test how 'stat' work here
hosts: webservers
tasks:
- name: Check ssl cert dir
stat:
path: /etc/httpd/conf.d/ssl
register: dir_status
- name: The status of dir
ansible.builtin.debug:
var: dir_status
- name: If Directory not exist
ansible.builtin.file:
path: "{{ ssl_cert_dir }}"
state: directory
when: not dir_status.stat.isdir
比如检查此目录/etc/httpd/conf.d/ssl
是否存在于server上,当这个目录不存在的时候,
执行playbook这个会有下面的错误:
TASK [Check ssl cert dir] ******************************************************
ok: [serverb.lab.example.com]
TASK [If Directory not exist] **************************************************
fatal: [serverb.lab.example.com]: FAILED! => {"msg": "The conditional check 'not dir_status.stat.isdir' failed. The error was: error while evaluating conditional (not dir_status.stat.isdir): 'dict object' has no attribute 'isdir'\n\nThe error appears to be in '/home/student/control-review/playbook.yml': line 37, column 11, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: If Directory not exist\n ^ here\n"}
按照理论来说xx.stat.isdir应该是没语法问题可以正常使用的,但是这个确保错了,说'dict object' has no attribute 'isdir'...
然后从debug中我们就知道问题了, 确实dir_status的stat中没有isdir
属性,只有一个exists
为false
当我们创建一个对应的ssl
目录出来时:
再次运行playbook,会看到
这里可以看到exists
变为了true
,并且我们有了更多的属性,其中就包括了isdir
,这就得出了一个小结论:
不要上来就直接用 dir_status.stat.isdir
, 而应该用dir_status.stat.exists
先判断一下文件/目录是否存在,然后再来判断是否为目录。