How to Copy files between remote hosts in ansible

  • 0

How to copy files between remote servers in Ansible? がこの記事の背景にある目的である。 私が行って読んだすべての記事は、私に提案を与えていましたが、何も実用的ではありませんでした。 私は、単に ansible rsync を作成したかったのです。 リモートホスト間でrsyncを実行し、リモートホスト間でファイルをコピーしたかったのですが、

そこで、例指向の記事を紹介します。 この投稿では、リモート サーバー間またはリモート間でファイルをコピーするために利用できる 2 つの主要なオプションについて説明します。

あるホストから別のホストにファイルをコピーしたい場合、一般に、最初に頭に浮かぶのは SCP で、Ansible には同じ名前の COPY

COPY (scp) モジュール専用のモジュールが用意されています。 しかし、リモート ホスト間でファイルをコピーしたり、リモート間でファイルをコピーしたりする場合は、さらに何かが必要です。

Ansible でホスト間でファイルをコピーするという要件を達成するために、copy、fetch、synchronize などのいくつかの ansible モジュールを使用するつもりです。

Ansible Copy モジュールが何に使用されるかはすでに知っていますが、ここでは Ansible Fetch と Ansible Synchronize について簡単に紹介します。

Ansible Fetch はリモートサーバーから制御マシンにファイルを取得するのに使用されます。 これは、Ansible の助けを借りて RSYNC を実行するのと同じです。

目次

インデックス

  1. 計画/要件
  2. 方法1: fetchモジュールを使用してリモートホスト間でファイルをコピーする
  3. Method2: synchronizeモジュールを使用してリモートホスト間でファイルをコピーする
    1. Synchronize Push
    2. Synchronize Pull
  4. 実行結果
  5. Reference and Other Related Articles.

The Plan / The Requirement

手始めに、いくつかの要件を定義して、同じページに関連付けることができるようにします。

私たちは、次のような名前の 2 つのサーバーを持っています

  1. mwiappi01
  2. mwiapp02

要件は、ファイルを mwiapp01 から mwiapp02 へコピーすることです。

マスターという名前に惑わされないでください。 これは単なるコントロール マシンです。 Ansible はエージェントレスなので、マスターとスレーブは存在しません。

Method1: fetch モジュールを使用して app01 から app02 にコピーする

この方法では、リモート ノード間で SSH 認証は必要ありません

これは、リモート ノード間で SSH 鍵ベースの認証が有効でない場合に、ファイルを転送する最適で最も簡単なオプションです。 ただし、最短経路(または)最短距離ではありません。 この方法に関しては、2 つのステップのプロセスがあります。

Step1: Fetch the file from the remote server (source) to the ansible master

Step2: Push (Copy) the file from the ansible master to the remote server ( destination)

ここでマスターはファイルを一時的に保存し転送するバッファとして動作するようになりました。

これらの上記のタスクを実行する次のプレイブックを考えてみましょう。

--- - hosts: app tasks: - name: Fetch the file from the mwiapp01 to master run_once: yes fetch: src=/tmp/app01-to-app02.jar dest=buffer/ flat=yes when: "{{ inventory_hostname == 'mwiapp01' }} " - name: マスターから mwiapp02 にファイルをコピーする copy: src=buffer/app01-to-app02.jar dest=/tmp/ when: "{{ inventory_hostname == 'mwiapp02' }}"

ここで、条件ベースの実行を行うために"when" を使い、inventory_hostnameは現在の実行リモートホスト名を指すansible組み込み変数となります。

inventory_hostname

の代わりにansible_hostnameを使用する必要がある場合もあります。

基本的には、mwiapp02 が現在のリモート実行ホストである場合にのみ mwiapp01 サーバ上で Fetch タスクとコピー タスクを実行するよう Ansible に指示しています。

Method 2: Copy from app01 to app02 using synchronize module

SSH Key based authentication must be enabled between remote hosts

For Synchronize module to work hassle-free, SSH Key-based authentication must be enabled between remote nodes.これはリモート ノードで SSH Key based authentication を使用する方法です。

言い換えると、リモート ノードは、パスワードを手動で入力することなく相互にログインできる必要があります。 私たちはこれをほとんどSSHキーの助けを借りて達成します。

先に述べたように。 Ansible Synchronize は Ansible RSYNC に似ています。Linux の典型的な rsync 機能です。

わずか数秒でキーベース認証を有効にする方法については、次の記事を参照してください

Enable SSH Key based authentication using Ansible

The SSH Key-based authentication で準備ができたら、次はその認証の方法です。 プレイの準備ができました。 ( playbook).

Synchronize モジュールを使用してファイルをコピーする方法は 2 つあります

  1. Synchronize Pull
  2. Synchronize Push

Synchronize Pull と Synchronize Push 方法の両方を使用して mwiapp01 から mwiapp02 へファイルをコピーする次の playbook を考えてみましょう

Synchronize Pull

ターゲットは、次のとおりです。 ソースサーバー(mwiapp01)

Delegated to and Executed on: デスティネーションサーバー(mwiapp02)

説明します。 ファイルが到着する先のサーバーで実行されているため。

以下は、デリゲーションの助けを借りて、mwiapp02宛先サーバーで実行され、pullsファイルをmwiapp01からmwiapp02

---- name: Sync Pull task - Executed on the Destination host "{{groups}}" hosts.を実行する。 "{{groups}}" user: wlsusr tasks: - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull tags: sync-pull synchronize: src: "{{ item }}" dest: "{{ item }}" mode: pull delegate_to.PWM を実行。 "{{groups}}" register: syncfile run_once: true with_items: - "/tmp/app01-to-app02.jar"

hostsディレクティブがファーストサーバーを対象にしているので、playbookはファーストサーバーで実行するように設定されていると思われるかもしれません。 hosts: "{{group}}" mwiapp01

しかし、実際には、delegate_to

の助けを借りて、2 番目のサーバーmwiapp02 でこのタスクを実行していることに気づかなければなりません。 送信先サーバー(mwiapp02)

Delegated to and Executed on: 送信元サーバー(mwiapp01)

説明します。 すでにファイルが存在するソースサーバーで実行されているため。 タスクは、ファイルを宛先サーバーにプッシュすることです

以下、ソースサーバーで実行されるプレイブックですmwiapp01pushes01から02までのファイル

- name: Sync Push task - Executed on source host "{{groups}}" hosts.このタスクは、ソースサーバーで実行され、

以下は、ソースサーバーで実行されるプレイブックです。 "{{groups}}" user: wlsusr tasks: - name: Copy the file from mwiapp01 to mwiapp02 using Method Push tags: sync-push synchronize: src: "{{ item }}" dest: "{{ item }}" mode: push delegate_to.PWT, "{{ item }}" mode: PWT, "{{ groups}}", "{{groups}}", "{{ Group}}", "push "タスク。 "{{groups}}" register: syncfile with_items: - "/tmp/app01-to-app02.jar"

hostsディレクティブがファーストサーバーを対象にしているので、playbookはセカンドサーバーで実行するように設定されていると思われるかもしれませんね。 hosts: "{{group}}" mwiapp02

しかし、実際には delegate_to

の助けにより、最初のサーバーmwiapp01でこのタスクを実行していることに気付かなければなりません。 最初のタスクは Synchronize Pull を使用してmwiapp02で実行され、2 番目のタスクは Synchronize Push を使用してmwiapp01で実行されるのですが、プレイブックは分かりやすい(理解しやすい)ものになっています。"{{groups}}"

ホストグループの最初の要素(または)サーバーを配列のように表しています

以下の画像でわかりやすいと思います

ファイル内の他の2行は以下のように重要です

  • mode Synchronizeのモデルについて表しています。 Synchronize pull か Synchronize push
  • delegate_to タスク(またはコマンド)が実際に実行されるべき場所をansibleに伝えます。

    実行結果

    先のスクリーンショットでは、3つのコマンドを実行しました。 最初と最後は、mwiapp02server

    /tmp ディレクトリ下のファイルの可用性を確認する Ansible アドホック コマンドで、2 つのサーバーを含むホストグループを使用していますが、コマンドは 1 つのサーバーでのみ実行するために --limit を使用しています。

    Fetch と Synchronize モジュールの両方を使用して、mwiapp01 から mwiapp02 へのファイルのコピーに成功しました。

    結論

    この投稿では、Ansible Copy と fetch モジュールを使用してリモートホスト間でファイルをコピーする方法をうまく学習し実行しました。 ansible を使用してホスト間でファイルをコピーする 2 つの方法を学びました。

    この記事がお役に立つことを願っています。

    1. Ansible Copyモジュールリファレンス
    2. Ansible Fetchモジュールリファレンス
    3. Ansible Synchronizeモジュールリファレンス
    4. 複数のホスト間でSSHキーをコピーまたは交換する方法 – Ansible
    5. 複数のホストでIPを交換して /etc/hosts ファイルを更新する方法 – Ansible

    本記事が役立つことを願っています。 この記事が気に入ったら、ぜひシェアしてください