リモートシステムの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
コマンドモジュールの作成オプションが便利であることがわかりました。これはどう:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Bruce Pが示唆するように、私はstatを使用して2タスクアプローチを行っていました。これをcreateの1つのタスクとして実行します。これはもっとはっきりしていると思います。
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
私にとってうまくいったもう1つのオプションは、同期モジュールの使用です。次に、ファイルモジュールを使用して元のディレクトリを削除します。
これはドキュメントの例です:
- 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
もう1つの利点は、プレイの最中に変更が永続化されることです。したがって、誰かがソースを変更した場合、変更はすべてターゲットファイルに反映されます。
を介して、ファイルへのリンクの数を確認できますls -l
。モードの横にハードリンクの数が表示されます(たとえば、ファイルに2つのリンクがある場合、rwxr-xr-x 2)。
Bruceは、ファイルがすでにそこにある場合に、ファイルを移動するかどうかを確認するために宛先を統計することを試みていませんでした。彼は、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
これは私がそれを私のために機能させる方法です:
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が存在するかどうかを確認します。
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
ハードリンクは本質的に所有権とアクセス許可を保持するため、ここでコピーするよりもハードリンクの方が望ましいことに注意してください(ファイルの2番目のコピーにディスク領域を消費しないことに加えて)。