Как перемещать/переименовывать файл с помощью задачи Ansible в удаленной системе

Как можно переместить/переименовать файл/каталог с помощью модуля Ansible в удаленной системе? Я не хочу использовать задачи command/shell, и я не хочу копировать файл из локальной системы в удаленную систему.

Ответ 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