Поиск файла с конкретной датой для копирования с помощью Ansible - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно, чтобы Ansible мог получить N-1 DIR, т.е. текущую дату -1 (вчерашний файл), и забрать эти файлы, чтобы скопировать данные в целевое местоположение.

Я написал что-то вроде ниже, но оно не работает на latest_file:

  - name: List
    command: "hdfs dfs -ls /data/files"
    register: hdfs_dir_list
  - debug: var=hdfs_dir_list.stdout_lines
  - name: Retrieve
    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}}"

Не уверен, что не так. Не могли бы вы помочь, что отсутствует в этом коде для достижения моей цели?

1 Ответ

0 голосов
/ 30 октября 2019

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...