web-dev-qa-db-ja.com

リモートシステムでAnsibleタスクを使用してファイルを移動/名前変更する方法

リモートシステムでAnsibleモジュールを使用してファイル/ディレクトリを移動/名前変更するにはどうすればよいですか?コマンド/シェルタスクを使用したくないし、ファイルをローカルシステムからリモートシステムにコピーしたくない。

167

ファイルモジュールは、リモートシステム上のファイルをコピーしません。 srcパラメータは、ファイルへのシンボリックリンクを作成するときにファイルモジュールによってのみ使用されます。

あなたが完全にリモートシステム上でファイルを移動/名前変更したいなら、あなたの最善の策はちょうど適切なコマンドを呼び出すためにコマンドモジュールを使うことです:

- name: Move foo to bar
  command: mv /path/to/foo /path/to/bar

あなたが空想を得たいならば、あなたは最初にfooが実際に存在することをチェックするためにstatモジュールを使うことができます:

- 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
178
Bruce P

バージョン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
189
Alex

私は便利なコマンドモジュールの作成オプションを見つけました。これはどう:

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar

私はかつてBruce Pが示唆しているようにstatを使って2つのタスクからなるアプローチをとっていました。今、私はcreateのひとつのタスクとしてこれを行います。これはもっとはっきりしていると思います。

97
Tom Ekberg

私にとってうまくいったもう一つのオプションは 同期モジュール を使うことです。その後、ファイルモジュールを使用して元のディレクトリを削除します。

これはdocsからの例です:

- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
    archive: yes
  delegate_to: "{{ inventory_hostname }}"
6
Andrew Becker

これを実現するもう1つの方法は、filestate: 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でファイルへのリンク数を確認できます。ハードリンクの数は、モードの隣に表示されます(たとえば、ファイルに2つのリンクがある場合はrwxr-xr-x 2)。

5
martinczerwi

ブルースは、ファイルが既に存在する場合は移動先かどうかをチェックして移動先に通知しようとしていませんでした。彼は、移動しようとするファイルが実際に存在していることを確認してからMVを試みました。

Tomのように、ファイルがまだ存在しない場合にのみ移動することに興味があるのであれば、私たちはまだBruceのチェックをミックスに統合するべきだと思います。

- 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
4
gkedge

これは私がそれが私のために働いている方法です:

  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

上記のプレイブックは、ファイルをtmpフォルダに移動する前に、ファイルabc.xtsが存在するかどうかを確認します。

1
eduprado

あなたはそれをすることができます-

アドホックコマンドを使用

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
0
Dev pokhariya

これはやり過ぎに思えるかもしれませんが、コマンドモジュールの使用を避けたい場合(これはコマンドを使用するのと同じではないためです)、コピーとアーカイブ解除の組み合わせを使用できます。

  1. Tarを使用して必要なファイルをアーカイブします。あなたが先を考えるなら、これは実際には理にかなっています。特定のディレクトリに一連のファイルが必要な場合があります。そのディレクトリをすべてのファイルで作成し、それらをtarにアーカイブします。
  2. アーカイブ解除モジュールを使用してください。これを行うと、destination:およびremote_src:キーワードとともに、すべてのファイルのコピーを一時フォルダーに配置して、まず目的の場所に展開することができます。
0
Mark Chassy