Как переместить / переименовать файл с помощью задачи Ansible в удаленной системе
Как можно переместить / переименовать файл / каталог с помощью модуля Ansible в удаленной системе? Я не хочу использовать задачи command/shell, и я не хочу копировать файл из локальной системы в удаленную систему.
8 ответов
файловый модуль не копирует файлы в удаленную систему. Параметр src используется модулем file только при создании символической ссылки на файл.
Если вы хотите переместить/переименовать файл полностью на удаленной системе, то лучше всего использовать командный модуль, чтобы просто вызвать соответствующую команду:
- 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
Я нашел опцию creates в командном модуле полезной. Как насчет этого:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
я использовал подход к задаче 2, используя stat, как предлагает Брюс П. Теперь я делаю это как одну задачу с creates. Я думаю, это намного яснее.
другой способ достичь этого-использовать 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 ссылки).
другой вариант, который хорошо работал для меня с помощью синхронизировать модуль . Затем удалите исходный каталог с помощью файла module.
вот пример из документации:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
Брюс не пытался установить место назначения, чтобы проверить, следует ли перемещать файл, если он уже там; он удостоверялся, что файл, который нужно переместить, действительно существует, прежде чем пытаться 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
вот как я заставил его работать на меня:
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
playbook выше, проверит, если файл abc.xts существует перед перемещением файла в папку tmp.
Это может показаться излишним, но если вы хотите избежать использования командного модуля (что я делаю, потому что он с помощью команды не является идемпотентным), вы можете использовать комбинацию copy и unarchive.
- использовать tar в архив файл(ы) вам нужно. Если вы думаете вперед, это действительно имеет смысл. Вы можете файлы в заданной директории. Создайте этот каталог со всеми файлами и архивируйте их в tar.
- используйте модуль unarchive. Когда ты это делаешь, вместе с ключевым словом destination: and remote_src: вы можете поместить копию всех своих файлов во временную папку для начала, а затем распаковать их именно там, где вы хотите.