latest_file
не параметр уровня задачи, а параметр модуля set_fact
. Так что вам нужно сделать отступ правильно. Всегда помните, что yaml имеет синтаксически значимые новые строки и отступы, как объяснено в этом коротком простом уроке
[Yaml] является строгим надмножеством JSON с добавлением синтаксически значимогопереводы строки и отступы, такие как Python. Однако, в отличие от Python, YAML не допускает буквенных символов табуляции для отступа.
Более того, как указано в комментарии @Matt P, вы должны использовать синтаксис yaml only везде, где это возможно, и отбрасывать старый key=value
сокращенный синтаксис.
И наконец (пока я на нем), программа проверки хорошей практики ansible-lint
сообщит, что:
All tasks should be named
Commands should not change things if nothing needs doing
Variables should have spaces before and after: {{ var_name }}
Хотя впоследствии у вас могут возникнуть другие проблемы с логикой, но вы можете изменить примерные задачи, чтобы получить что-то синтаксически правильноеи с уважением относиться к новейшей добросовестной практике:
- name: List
command: "hdfs dfs -ls /data/files"
register: hdfs_dir_list
changed_when: false
- name: Debug registered var
debug:
var: hdfs_dir_list.stdout_lines
- name: Retrieve latest file from output
set_fact:
latest_file: "{{ hdfs_dir_list.files | sort(attribute='date -1') | last }}"
- name: Copy
command: hadoop distcp "hdfs:///data/{{ hdfs_dir_list }}" "/data/{{ hdfs_dir_list }}"
# Set the following if copying the file once is ok
creates: "/data/{{ hdfs_dir_list }}"
# If not set a changed_when rule bases on command result
register: copy_result
changed_when: <add a check on copy_result saying when command is in changed state>