Скопируйте локальный файл, если он существует, используя ansible

Я работаю в проекте, и мы используем ansible для создания развертывания кластера серверов. Одна из задач, которую я должен выполнить, чтобы скопировать локальный файл на удаленный хост, только если этот файл существует локально. Сейчас я пытаюсь решить эту проблему, используя этот

- hosts: 127.0.0.1 
  connection: local
  tasks:
    - name: copy local filetocopy.zip to remote if exists
    - shell: if [[ -f "../filetocopy.zip" ]]; then /bin/true; else /bin/false; fi;
      register: result    
    - copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip
      when: result|success

Bu это не удается со следующим сообщением: Ошибка: атрибут "действие" или "local_action" отсутствует в задаче " копировать локальную filetocopy.zip к удаленному, если существует"

Я попытался создать это, если с командная задача. Я уже пытался создать эту задачу с помощью local_action, но не смог заставить ее работать. Все образцы, которые я нашел, не рассматривают оболочку в local_action, есть только образцы команды, и ни один из них не имеет ничего другого, кроме команды. Есть ли способ выполнить эту задачу с помощью ansible?

5 ответов


измените свой первый шаг на следующий на

- name: copy local filetocopy.zip to remote if exists
  local_action: stat path="../filetocopy.zip"
  register: result    

Я знаю, что на этот вопрос уже ответили, но сегодня утром я наткнулся на тот же вопрос и подумал, что могу опубликовать более полный ответ для дальнейшего использования.

Если вы хотите проверить наличие локального файла перед выполнением какой-либо задачи, вот полный фрагмент:

- name: get file stat to be able to perform a check in the following task
  local_action: stat path=/path/to/file
  register: file

- name: copy file if it exists
  copy: src=/path/to/file dest=/destination/path
  when: file.stat.exists

редактировать : если вы хотите проверить существование пульт ДУ файл (как и я), это путь:

- name: get file stat to be able to perform check in the following task
  stat: path=/path/to/file
  register: file

- name: copy file if it exists
  copy: src=/path/to/file dest=/destination/path
  when: file.stat.exists

Если вы не хотите настраивать две задачи, вы можете использовать is_file для проверки наличия локальных файлов:

tasks:
- copy: src=/a/b/filetocopy.zip dest=/tmp/filetocopy.zip
  when: '/a/b/filetocopy.zip' | is_file

путь относительно каталога playbook, поэтому рекомендуется использовать переменную magic role_path, если вы ссылаетесь на файлы внутри каталога ролей.

Ref:http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-paths


Fileglob разрешает поиск в конечном итоге существующего файла.

- name: copy file if it exists
  copy: src="{{ item }}" dest=/destination/path
  with_fileglob: "/path/to/file"

Как насчет этого?

tasks:
- copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip
  failed_when: false

это скопирует файл в целевой объект, если он существует локально. Если он не существует, он просто ничего не делает, так как ошибка игнорируется.