Ответ 1
Измените первый шаг на следующем:
- name: copy local filetocopy.zip to remote if exists
local_action: stat path="../filetocopy.zip"
register: result
Я работаю над проектом, и мы используем возможность создания развернуть кластер серверов. Одна из задач, которую я должен выполнить, - скопировать локальный файл на удаленный хост, только если этот файл существует локально. Теперь я пытаюсь решить эту проблему, используя этот
- 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, есть только образцы команды, и ни у кого из них нет ничего, кроме команды. Есть ли способ выполнить эту задачу, используя недоступную?
Измените первый шаг на следующем:
- 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
Путь относится к каталогу воспроизведения, поэтому использование магической переменной role_path рекомендуется, если вы ссылаетесь на файлы внутри каталога ролей.
Ссылка: 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
Это скопирует файл в цель, если он существует локально. Если он не существует, он просто ничего не делает, поскольку ошибка игнорируется.