Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I check whether a given directory is empty with Ansible?

Tags:

yaml

ansible

I am trying to implement a role that checks whether a given directory is empty before proceeding with the rest of the playbook.

I have tried this code but I am getting an error and I am not sure about the correct implementation.

- name: Check if d folder is empty before proceeding
  find:
   paths: c/d/
   patterns: "*.*"
   register: filesFound

- fail:
     msg: The d folder is not empty. 
  when: filesFound.matched > 0

- debug:
    msg: "The d folder is empty. Proceeding."

This is the error that I am getting:

fatal FAILED! =>
{"changed": false,
"module_stderr": "Exception calling \"Create\" with \"1\" argument(s):
\"At line:4 char:21
def _ansiballz_main():
An expression was expected after '('.
At line:12 char:27
except (AttributeError, OSError):
Missing argument in parameter list.
At line:14 char:7
if scriptdir is not None:
Missing '(' after 'if' in if statement.
At line:21 char:7
if sys.version_info < (3,):
Missing '(' after 'if' in if statement.
At line:21 char:30
if sys.version_info < (3,):
Missing expression after ','.
At line:21 char:25
if sys.version_info < (3,):
The '<' operator is reserved for future use.
At line:23 char:32
MOD_DESC = ('.py', 'U', imp.PY_SOURCE)
Missing expression after ','.
At line:23 char:33
MOD_DESC = ('.py', 'U', imp.PY_SOURCE)                                 Unexpected token 'imp.PY_SOURCE' in expression or statement.
At line:23 char:32
MOD_DESC = ('.py', 'U', imp.PY_SOURCE)
Missing closing ')' in expression.
At line:23 char:46
MOD_DESC = ('.py', 'U', imp.PY_SOURCE)
Unexpected token ')' in expression or statement.
Not all parse errors were reported.  Correct the reported errors and try again.\"
At line:6 char:1
$exec_wrapper = [ScriptBlock]::Create($split_parts[0])
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo          : NotSpecified: (:) [], MethodInvocationException\r\n    + FullyQualifiedErrorId : ParseException\r\n \r\nThe expression after '&' in a pipeline element produced an object that was not valid. It must result in a command
name, a script block, or a CommandInfo object.
At line:7 char:2
&$exec_wrapper
~~~~~~~~~~~~~\
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : BadExpression
", "module_stdout": "", "msg": "MODULE FAILURE
See stdout/stderr for the exact error", "rc": 1}
like image 432
Camille1 Avatar asked Jun 06 '19 13:06

Camille1


2 Answers

You are on the right way, but as @HermanTheGermanHesse mentioned, there is an idention error, try this:

- name: Check if d folder is empty before proceeding
  find:
    paths: 'c/d/'
  register: filesFound

- fail:
     msg: 'The d folder is not empty.'
  when: filesFound.matched > 0

- debug:
    msg: 'The d folder is empty. Proceeding.'
like image 97
JGK Avatar answered Jan 03 '23 23:01

JGK


You could use the shell module.

- name: Register contents of /a/b/c
  shell: ls -lA # Thank you Life5ign
  args:
    chdir: /a/b/c
  register: contents

- name: do stuff when not empty
  debug:
    msg: "There are elements inside!"
  when: contents["stdout_lines"] | length > 0 # Thank you Life5ign
like image 33
HermanTheGermanHesse Avatar answered Jan 04 '23 01:01

HermanTheGermanHesse