fetchモジュールは、リモートのファイルをローカルにフェッチ(取ってくる)するためのモジュールです。
fetchモジュールの特徴は次の通りです。
- 一度に1つのファイルしか取得できない。
- <ホスト名>/path/to/file のようにホスト名とファイル階層でバックアップする
- ファイル属性(権限、所有者など)は保持されない。
ファイル取得に関してあまり柔軟性がないので、大量のファイルを取得する場合は、ファイルをアーカイブしたり、ループ処理で実施したり工夫が必要かもしれません。ファイルの取得にはsynchronizeモジュールも使えますので、用途によって使い分けましょう。
パラメータの説明
ここでは有用なパラメータについて説明します。
- dest(必須)
-
フェッチしたファイルを保存するディレクトリを指定する。
例えば、destに「/backup」、srcに「/etc/profile」を指定した場合、「/backup/<ホスト名>/etc/profile」に保存されます。<ホスト名>はインベントリの名前で付けられます。
ただし、「flat: yes」を指定した場合、「/」で終わっているか・終わっていないかで動作が異なります(flatを参照)。
- fail_on_missing
-
「yes」の場合、何らかの理由でリモートのファイルが読めなかった場合、タスクは失敗する。
「yes(デフォルト)」または「no」を指定する。
- flat
-
destの指定が「/」で終わっている場合、ソースファイルのベースネームでdestディレクトリの下にコピーされる。
「/」で終わっていない場合、ソースファイルはdestの名前でコピーされる。
「yes(デフォルト)」または「no」を指定する。
「yes」をした場合、複数ホストで同じ名前のファイルをフェッチすると上書きする場合があるので、注意が必要です。詳細は「公式ドキュメントのサンプルの説明」を参照してください。
- src(必須)
-
フェッチするリモートのファイルを指定する。
指定できるのはファイルだけです。ディレクトリは指定できません。
- validate_checksum
-
フェッチ前のリモートファイルとフェッチした後のローカルファイルでチェックサムの検証をする。
「yes(デフォルト)」または「no」を指定する。
公式ドキュメントのサンプルの説明
公式ドキュメントのサンプルを元に、注意点などをコメントしていきます。
- name: Store file into /tmp/fetched/host.example.com/tmp/somefile fetch: src: /tmp/somefile dest: /tmp/fetched
これは最もシンプルなフェッチの方法です。somefileは「/tmp/fetched/<ホスト名>/tmp/somefile」にフェッチされます。
- name: Specifying a path directly fetch: src: /tmp/somefile dest: /tmp/prefix-{{ inventory_hostname }} flat: yes - name: Specifying a destination path fetch: src: /tmp/uniquefile dest: /tmp/special/ flat: yes
「flat: yes」が指定されているので、「<ホスト名>/path/to/file」のようにソースファイルの階層構造で保存されません。
1つ目の例はdestのパスの最後が「/」で終わっていないので、somefileが「prefix-<インベントリのホスト名>」と言う名前のファイルとして/tmpの下にフェッチされます。
2つ目の例はdestのパスの最後が「/」で終わっているので、「/tmp/special/uniqufile」にフェッチされます。
複数のホストから同じ名前のファイルをフェッチする場合、1つ目の例はホストごとにユニークなファイル名になるので、他のホストのファイルを上書きすることはありません。
2つ目の例はすべて/tmp/special/の下に「uniqufile」という名前で保存するため、他のホストのファイルを上書きしてしまいます。ここでサンプルにわざわざ「uniqufile」という名前を使っているのは、ホストごとにユニークなファイル名の場合、サンプルのような方法が使えますということを言いたいのだと思います。- name: Storing in a path relative to the playbook fetch: src: /tmp/uniquefile dest: special/prefix-{{ inventory_hostname }} flat: yes
この例はdestに相対パスを指定する例です。
まとめ
fetchモジュールは使い方は簡単ですが、複数ファイルをフェッチしたい場合には使い勝手が悪いです。また、ファイル属性は維持されないことは覚えておきましょう。