Як можна переміщувати / перейменувати файл / каталог за допомогою модуля Ansible у віддаленій системі? Я не хочу використовувати завдання команд / оболонок і не хочу копіювати файл з локальної системи у віддалену систему.
Як можна переміщувати / перейменувати файл / каталог за допомогою модуля Ansible у віддаленій системі? Я не хочу використовувати завдання команд / оболонок і не хочу копіювати файл з локальної системи у віддалену систему.
Відповіді:
Файловий модуль не копіює файли у віддалену систему. Параметр 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
removes
параметр для command
модуля ( тут задокументовано )? Здається, що цей варіант спочатку зробить перевірку Ansible.
removes: /path/to/foo
та creates: /path/to/bar
. @Fonant вже згадував це як коментар до іншої відповіді, але оскільки це прийнято, я хочу його ще раз зазначити.
З версії 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
підтримує рекурсивне копіювання.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Я вважаю корисною опцію create у командному модулі. Як щодо цього:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Раніше я робив підхід із двома завданнями, використовуючи статистику, як пропонує Брюс П. Тепер я роблю це як одне завдання з create. Я думаю, це набагато зрозуміліше.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Інший варіант, який добре працював для мене, - це використання модуля синхронізації . Потім видаліть оригінальний каталог за допомогою модуля файлів.
Ось приклад із документів:
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
dest
доступ до нього здійснюється через SSH, навіть якщо каталог знаходиться на одній машині.
Ще одним способом досягти цього є використання за 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 посилання).
Брюс не намагався зафіксувати місце призначення, щоб перевірити, чи слід переміщувати файл, чи він уже є; він намагався перенести файл насправді, перш ніж спробувати 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
в ігровій книжці вище, перевірте, чи існує файл abc.xts, перш ніж перемістити файл у папку tmp
when: stat_result.stat.exists == True
. Просто використання when: stat_result.stat.exists
досить добре.
== True
тому що я завжди роблю що - то , коли файл не знайдений або == False
.
stat
модуля exists
повертає boolean
значення. Отже, якщо ви поставите лише те, when: stat_result.stat.exists
що буде задовольняти умові, якщо файл присутній, який також ідентичний, when: stat_result.stat.exists == True
але з більшою кількістю текстів та зайвою умовною перевіркою.
Це може здатися надмірним, але якщо ви хочете уникати використання командного модуля (що я роблю, тому що він за допомогою команди не є ідентичним), ви можете використовувати комбінацію копії та неархівації.
Ви можете це зробити:
Використання спеціальних команд
ansible all -m command -a" mv /path/to/foo /path/to/bar"
Або Ви, якщо хочете це зробити, скориставшись ігровою книжкою
- name: Move File foo to destination bar
command: mv /path/to/foo /path/to/bar
Я знаю, що це давня тема РОКІВ , але я розчарувався і створив для себе роль зробити саме це для довільного списку файлів. Розширити, як вважаєте за потрібне:
main.yml
- name: created destination directory
file:
path: /path/to/directory
state: directory
mode: '0750'
- include_tasks: move.yml
loop:
- file1
- file2
- file3
move.yml
- name: stat the file
stat:
path: {{ item }}
register: my_file
- name: hard link the file into directory
file:
src: /original/path/to/{{ item }}
dest: /path/to/directory/{{ item }}
state: hard
when: my_file.stat.exists
- name: Delete the original file
file:
path: /original/path/to/{{ item }}
state: absent
when: my_file.stat.exists
Зауважте, що жорстке посилання бажано скопіювати тут, оскільки воно по суті зберігає право власності та дозволи (крім того, що не витрачається більше місця на диску для другої копії файлу).