如何在不使用Ansible删除目录的情况下删除目录内的文件?
How to delete files inside a directory without deleting the directory with Ansible?
我正在尝试 2 种方法来删除目录 my_dir 中的所有文件。这是从另一个文件管理的参数。我的工作流程是先创建目录,然后复制该目录中的文件,然后删除其中的所有文件。所以这是我使用 loop_control:
的第一个解决方案
---
# tasks file for deploy_files
- name: Create model directory
file:
path: "{{ my_dir }}"
state: directory
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rwx,g=rX,o=rX
- name: Copy models
copy:
src: "{{ files_src_dir }}"
dest: "{{ my_dir }}"
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rw,g=r,o=r
- name: Get directory listing
find:
path: "{{ my_dir }}"
file_type: any
hidden: yes
register: directory_content_result
- name: Remove directory content
file:
path: "{{ item.path }}"
state: absent
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rw,g=r,o=r
with_items: "{{ directory_content_result.files }}"
loop_control:
label: "{{ item.path }}"
并且,这是没有 loop_control 的第二个解决方案:
---
# tasks file for deploy_files
- name: Create model directory
file:
path: "{{ my_dir }}"
state: directory
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rwx,g=rX,o=rX
- name: Copy models
copy:
src: "{{ files_src_dir }}"
dest: "{{ my_dir }}"
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rw,g=r,o=r
- name: Find files in directory
find:
path: "{{ my_dir }}"
register: files_to_delete
- name: Remove files in directory
file:
path: "{{ item.path }}"
state: absent
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rwx,g=rX,o=rX
with_items: "{{ files_to_delete.files }}"
None 它们的工作方式与我 运行 我的脚本时一样,我得到:
错误:由于以下任务,幂等性测试失败。
请注意,我的任务创建模型目录和复制模型工作得非常好,因为我已经对它们进行了测试。仅当我添加最后 2 个任务以删除文件时,我的脚本才失败。有人可以帮我我在这里做错了什么吗?谢谢。
你的剧本在技术上没有任何问题,它实际上完全按照你的要求去做。
我不得不猜测,因为你根本没有提到你 运行 你的剧本,但我很确定你正在使用 molecule
来测试你的 playbook/role (顺便说一句,这是个好主意)。你的问题中显示的是 molecule
未通过 idempotence
检查。
发生的事情是 molecule
第二次 运行 设置您的剧本,并期望远程目标没有任何变化,因为它应该已经与所需状态对齐(通过 运行更早的 converge
步骤)
由于您的剧本无条件地创建然后删除文件,它总是会更改目标上的某些内容并且该检查永远不会通过。您要么必须修改执行所有这些操作的方式,使其变得幂等,要么如果您知道这些任务不相关(即 changed_when: false
),则忽略这些任务的更改。
根据经验,最好的选择通常是尽可能做到幂等。
我正在尝试 2 种方法来删除目录 my_dir 中的所有文件。这是从另一个文件管理的参数。我的工作流程是先创建目录,然后复制该目录中的文件,然后删除其中的所有文件。所以这是我使用 loop_control:
的第一个解决方案---
# tasks file for deploy_files
- name: Create model directory
file:
path: "{{ my_dir }}"
state: directory
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rwx,g=rX,o=rX
- name: Copy models
copy:
src: "{{ files_src_dir }}"
dest: "{{ my_dir }}"
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rw,g=r,o=r
- name: Get directory listing
find:
path: "{{ my_dir }}"
file_type: any
hidden: yes
register: directory_content_result
- name: Remove directory content
file:
path: "{{ item.path }}"
state: absent
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rw,g=r,o=r
with_items: "{{ directory_content_result.files }}"
loop_control:
label: "{{ item.path }}"
并且,这是没有 loop_control 的第二个解决方案:
---
# tasks file for deploy_files
- name: Create model directory
file:
path: "{{ my_dir }}"
state: directory
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rwx,g=rX,o=rX
- name: Copy models
copy:
src: "{{ files_src_dir }}"
dest: "{{ my_dir }}"
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rw,g=r,o=r
- name: Find files in directory
find:
path: "{{ my_dir }}"
register: files_to_delete
- name: Remove files in directory
file:
path: "{{ item.path }}"
state: absent
owner: "{{ my_daemon_name }}"
group: "{{ my_daemon_name }}"
mode: u=rwx,g=rX,o=rX
with_items: "{{ files_to_delete.files }}"
None 它们的工作方式与我 运行 我的脚本时一样,我得到:
错误:由于以下任务,幂等性测试失败。
请注意,我的任务创建模型目录和复制模型工作得非常好,因为我已经对它们进行了测试。仅当我添加最后 2 个任务以删除文件时,我的脚本才失败。有人可以帮我我在这里做错了什么吗?谢谢。
你的剧本在技术上没有任何问题,它实际上完全按照你的要求去做。
我不得不猜测,因为你根本没有提到你 运行 你的剧本,但我很确定你正在使用 molecule
来测试你的 playbook/role (顺便说一句,这是个好主意)。你的问题中显示的是 molecule
未通过 idempotence
检查。
发生的事情是 molecule
第二次 运行 设置您的剧本,并期望远程目标没有任何变化,因为它应该已经与所需状态对齐(通过 运行更早的 converge
步骤)
由于您的剧本无条件地创建然后删除文件,它总是会更改目标上的某些内容并且该检查永远不会通过。您要么必须修改执行所有这些操作的方式,使其变得幂等,要么如果您知道这些任务不相关(即 changed_when: false
),则忽略这些任务的更改。
根据经验,最好的选择通常是尽可能做到幂等。