I have a task to count how many files exist. Is there something wrong with the syntax?
task:
- name: "Getting Local File Count"
kubernetes.core.k8s_exec:
namespace: "{{namespace}}"
pod: "{{pod}}"
command: "find '{{local_dir}}' -type f | wc -l"
register: command_status
but after executing the playbook I get
"find: paths must precede expression: |",
CodePudding user response:
That's a common mistake coming from a world of CMD in docker, which has two forms: free text and exec -- but in kubernetes descriptors, it's always the exec form. If one wishes to have shell helpers, such as pipes or && or functions or redirection, one must do that explicitly via sh -c style constructs
The bad news is that the ansible module's command: argument doesn't accept a list[str] and instead they choose to use shlex.split so you have to either copy the complicated command into the pod and just use command: /path/to/my/script.sh or take your chances with shlex, which seems to understand sh -c quoting:
>>> shlex.split("""sh -c "find '{{local_dir}}' -type f | wc -l" """)
['sh', '-c', "find '{{local_dir}}' -type f | wc -l"]
making your ansible parameter look like:
command: >-
sh -ec "find '{{local_dir}}' -type f | wc -l"
as always when using jinja2 templates in a shell context, the safer choice is to use | quote versus just wrapping your thing in single-quotes and hoping no one uses a single-quote in local_dir, although in this case one will need to be extra cautious since it is a shell literal inside a shell literal :-(
