Как можно переместить/переименовать файл/каталог с помощью модуля Ansible в удаленной системе? Я не хочу использовать задачи command/shell, и я не хочу копировать файл из локальной системы в удаленную систему.
Как перемещать/переименовывать файл с помощью задачи Ansible в удаленной системе
Ответ 1
Файловый модуль не копирует файлы в удаленной системе. Параметр src используется только файловым модулем при создании символической ссылки на файл.
Если вы хотите полностью переместить/переименовать файл в удаленной системе, лучше всего использовать командный модуль, чтобы просто вызвать соответствующую команду:
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
Если вы хотите получить фантазию, вы можете сначала использовать модуль stat, чтобы проверить, действительно ли существует foo:
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
Ответ 2
Начиная с версии 2.0, в модуле копирования вы можете использовать параметр remote_src
.
Если True
он перейдет на удаленный/целевой компьютер для src.
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
Если вы хотите переместить файл, вам нужно удалить старый файл с помощью файлового модуля
- name: Remove old files foo
file: path=/path/to/foo state=absent
Начиная с версии 2.8 модулькопирования remote_src
поддерживает рекурсивное копирование.
Ответ 3
Я нашел параметр create в командном модуле полезным. Как насчет этого:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Раньше я использовал 2 подхода к задаче с использованием статистики, такой как Bruce P. Теперь я делаю это, как одна задача с создает. Я думаю, что это намного яснее.
Ответ 4
Еще один вариант, который мне пригодился, - это использование модуля синхронизации. Затем удалите исходный каталог с помощью файлового модуля.
Вот пример из документации:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
Ответ 5
Другим способом достижения этого является использование file
с state: hard
.
Это пример, который я получил:
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
Проверено только на localhost (OSX), но должно работать и на Linux. Я не могу сказать для Windows.
Обратите внимание, что необходимы абсолютные пути. Иначе это не позволит мне создать ссылку. Также вы не можете перекрещивать файловые системы, поэтому работа с любым смонтированным носителем может завершиться неудачей.
Жесткая ссылка очень похожа на перемещение, если впоследствии удалить исходный файл:
- name: Remove old file
file:
path: /path/to/source/file
state: absent
Другим преимуществом является то, что изменения сохраняются, когда вы находитесь в середине игры. Поэтому, если кто-то меняет источник, любое изменение отражается в целевом файле.
Вы можете проверить количество ссылок на файл через ls -l
. Число жестких ссылок показано рядом с режимом (например, rwxr-xr-x 2, когда файл имеет 2 ссылки).
Ответ 6
Брюс не пытался установить место назначения, чтобы проверить, следует ли перемещать файл, если он уже был там; он убедился, что файл, который нужно переместить, фактически существовал до попытки mv.
Если ваш интерес, как и Том, должен двигаться только в том случае, если файл еще не существует, я думаю, что мы должны по-прежнему интегрировать проверку Брюса в микс:
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
Ответ 7
Вот как я заработал у меня:
Tasks:
- name: checking if the file 1 exists
stat:
path: /path/to/foo abc.xts
register: stat_result
- name: moving file 1
command: mv /path/to/foo abc.xts /tmp
when: stat_result.stat.exists == True
в плеере выше, проверьте, существует ли файл abc.xts, прежде чем переместить файл в папку tmp.
Ответ 8
Это может показаться излишним, но если вы хотите избежать использования командного модуля (который я делаю, потому что он использует команду не идемпотент), вы можете использовать комбинацию копирования и разблокировки.
- Используйте tar для архивирования файлов, которые вам понадобятся. Если вы думаете, что это действительно имеет смысл. Возможно, вам понадобится серия файлов в данном каталоге. Создайте этот каталог со всеми файлами и сохраните их в tar.
- Используйте модуль unarchive. Когда вы это сделаете вместе с ключевым словом destination: и remote_src: вы можете скопировать все свои файлы во временную папку, чтобы начать, а затем распаковать их точно там, где вы хотите.
Ответ 9
Вы можете сделать это с помощью -
Использование специальной команды
ansible all -m command -a" mv /path/to/foo /path/to/bar"
Или Вы, если хотите сделать это с помощью playbook
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar