Скопируйте локальный файл, если он существует, используя 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
это скопирует файл в целевой объект, если он существует локально. Если он не существует, он просто ничего не делает, так как ошибка игнорируется.