0

I am trying 2 methods to delete all files inside a directory my_dir. This is a parameter managed from another file. My workflow is creating the directory first, then copy files in that directory, then delete all files in there. So here is my first solution using 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 }}" 

And, here is the 2nd solution without 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 of them work as when I ran my script, I got:

ERROR: Idempotence test failed because of the following tasks.

AnsibleERR1

Please, note that my tasks Create model directory and Copy models works perfectly fine as I already tested them. My script failed only when I added the last 2 tasks to delete the files. Could someone help me what I did wrong here please? Thank you.

1 Answer 1

1

There is nothing technically wrong with your playbook and it is actually doing exactly what you asked.

I have to take a guess since you did not mention how you run your playbook at all, but I'm pretty sure you are using molecule to test your playbook/role (which is a very good idea by the way). And what is shown in your question is molecule failing its idempotence check.

What happens is that molecule is running your playbook a second time and expects that nothing changes on the remote target since it is supposed to be already aligned to the desired state (by running the earlier converge step)

Since your playbook unconditionally creates then deletes files, it will always change something on the target and that check will never pass. You either have to modify the way you are doing all this so that it becomes idempotent or ignore the changes on those tasks if you know they are not relevant (i.e. changed_when: false).

From experience, the best option is usually to make things idempotent as far as possible.

Sign up to request clarification or add additional context in comments.

3 Comments

Hello @Zeitounator thank you very much for your reply. I am new to ansible so yes I forgot to mention how I executed the playbook. And, it is exactly what you said and the workaround you provided is really the correct workaround to resolve my issue :-)
Hello @Zeitounator I am interested to understand more about your comment above "the best option is usually to make things idempotent as far as possible". How do I try to do this? Is there a document somewhere I can follow? Thank you in advance.
Well, in the above case it would be pretty easy: don't delete the files. They will be copied only if needed (do not exist or changed).

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.