Как переместить / переименовать файл с помощью задачи 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

начиная с версии 2.0, в модуль копирования можно использовать


Я нашел опцию 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.

  1. использовать tar в архив файл(ы) вам нужно. Если вы думаете вперед, это действительно имеет смысл. Вы можете файлы в заданной директории. Создайте этот каталог со всеми файлами и архивируйте их в tar.
  2. используйте модуль unarchive. Когда ты это делаешь, вместе с ключевым словом destination: and remote_src: вы можете поместить копию всех своих файлов во временную папку для начала, а затем распаковать их именно там, где вы хотите.