Ansible Copy モジュール

AnsibleAnsibleBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Ansible Copy モジュールを調べます。このモジュールを使うと、リモートホストにファイルやディレクトリをコピーできます。Copy モジュールは、Ansible の自動化タスクの一部としてファイルを転送するための、柔軟で効率的な方法を提供します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible(("Ansible")) -.-> ansible/PlaybookEssentialsGroup(["Playbook Essentials"]) ansible/ModuleOperationsGroup -.-> ansible/copy("Transfer Files") ansible/ModuleOperationsGroup -.-> ansible/file("Manage Files/Directories") ansible/ModuleOperationsGroup -.-> ansible/shell("Execute Shell Commands") ansible/ModuleOperationsGroup -.-> ansible/template("Generate Files from Templates") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("Execute Playbook") subgraph Lab Skills ansible/copy -.-> lab-289653{{"Ansible Copy モジュール"}} ansible/file -.-> lab-289653{{"Ansible Copy モジュール"}} ansible/shell -.-> lab-289653{{"Ansible Copy モジュール"}} ansible/template -.-> lab-289653{{"Ansible Copy モジュール"}} ansible/playbook -.-> lab-289653{{"Ansible Copy モジュール"}} end

リモートホストにファイルをコピーする

このステップでは、Ansible Copy モジュールを使ってコントロールマシンからリモートホストにファイルをコピーします。

まず、/home/labex/project/copy-module-playbook.yaml という名前の新しい Ansible プレイブックファイルを作成し、テキストエディタで開きます。
プレイブックファイルに以下の内容を追加します。

- hosts: localhost
  tasks:
    - name: Copy a file to remote host
      copy:
        src: /home/labex/file.txt
        dest: /home/labex/project/file.txt
  • copy:Ansible の copy モジュールを利用して、コントロールノード(ローカルホスト)からリモートホストにファイルをコピーするために使用されます。
  • src:ソースファイルパスを指定し、ローカルホスト上でコピーするファイルのパスを示します。
  • dest:宛先ファイルパスを指定し、リモートホスト上のどこにファイルをコピーするかを示します。

このプレイブックタスクを通じて、/home/labex/file.txt ファイルがリモートホスト上の /home/labex/project/file.txt パスにコピーされます。Ansible の copy モジュールは、ファイルのコピープロセスを効率的に支援します。

次に、/home/labex ディレクトリに file.txt という名前のファイルを作成します。

echo "This is the content of the file." > /home/labex/file.txt

その後、以下のコマンドを使ってプレイブックを実行します。

ansible-playbook copy-module-playbook.yaml

実行結果の例:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Copy a file to remote host] **********************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最後に、リモートホスト上の指定された宛先パスに file.txt ファイルが存在することを確認します。

cat /home/labex/project/file.txt

実行結果の例:

This is the content of the file.

ここで "This is the content of the file."/home/labex/file.txt ファイルの内容と同じであり、これは /home/labex/file.txt ファイルが /home/labex/project/file.txt に正常にコピーされたことを意味します。

リモートホストにディレクトリをコピーする

このステップでは、Ansible Copy モジュールを使ってコントロールマシンからリモートホストにディレクトリをコピーします。

まず、既存のプレイブックファイルの内容をすべて削除し、以下の内容を追加して修正します。

- hosts: localhost
  tasks:
    - name: Copy a directory to remote host
      copy:
        src: /home/labex/directory
        dest: /home/labex/project/

ステップ 1 のタイプでは、src がディレクトリに設定されている場合、この Playbook タスクは /home/labex/directory ディレクトリをリモートホスト上の /home/labex/project/ パスにコピーします。

次に、/home/labex ディレクトリに directory という名前のディレクトリを作成し、directory ディレクトリ内に file2.txt という名前のファイルを作成します。

mkdir /home/labex/directory
touch /home/labex/directory/file2.txt

その後、以下のコマンドを使ってプレイブックを実行します。

ansible-playbook copy-module-playbook.yaml

実行結果の例:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Copy a directory to remote host] *****************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最後に、リモートホスト上の指定された宛先パスに directory ディレクトリとその内容が存在することを確認します。

tree /home/labex/project

期待される出力:

/home/labex/project
├── copy-module-playbook.yaml
├── directory
│   └── file2.txt
└── file.txt

1 directory, 3 files

directoryfile2.txt ファイルが対象ホスト上の /home/labex/project ディレクトリに正常にコピーされたことがわかります。

ファイル属性を保持する

このステップでは、Ansible Copy モジュールを使用する際に、ファイルの属性(パーミッションやタイムスタンプなど)をどのように保持するか学びます。

まず、既存のプレイブックファイルの内容をすべて削除し、以下の内容を追加して修正します。

- hosts: localhost
  tasks:
    - name: Preserve file attributes
      copy:
        src: /home/labex/file.txt
        dest: /tmp/file.txt
        mode: preserve
  • mode: preserve:このパラメータは、コピープロセス中にソースファイルのモード(パーミッション)を保持し、宛先ファイルがソースファイルと同じパーミッションを維持するようにします。

このプレイブックタスクを通じて、/home/labex/file.txt ファイルがリモートホスト上の /tmp/file.txt にコピーされると同時に、パーミッションなどのファイル属性が保持されます。

その後、以下のコマンドを使ってプレイブックを実行します。

ansible-playbook copy-module-playbook.yaml

実行結果の例:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Preserve file attributes] ************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最後に、file.txt ファイルがその属性を保持したままリモートホスト上の指定された宛先パスにコピーされたことを確認します。
ll を使って /home/labex/file.txt の詳細を表示します。

ll /home/labex/file.txt

実行結果の例:

-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt

ll を使って /tmp/file.txt の詳細を表示します。

ll /tmp/file.txt

実行結果の例:

-rw-rw-r-- 1 labex labex 33 Mar 9 09:00 /tmp/file.txt

この Ansible プレイブックは、複製プロセス中にパーミッションパターン(パーミッションビット)と所有者情報を保持するために使用できます。

パーミッションの設定

このステップでは、Ansible Copy モジュールを使用する際にファイルのパーミッションをどのように設定するかを調べます。リモートホスト上のコピー先ファイルに特定のパーミッションを設定する方法を学びます。

まず、既存のプレイブックファイルの内容をすべて削除し、以下の内容を追加して修正します。

- hosts: localhost
  tasks:
    - name: Handle permissions
      copy:
        src: /home/labex/file.txt
        dest: /tmp/file1.txt
        mode: "0644"
  • mode:ここで "0644" を、ファイルに希望するパーミッションモードに置き換えます。パーミッションモードに関する詳細は、chmod のドキュメントを参照してください。

このプレイブックタスクを通じて、/home/labex/file.txt ファイルがリモートホスト上の /tmp/file1.txt にコピーされ、指定された 0644 のパーミッションが設定されます。

その後、以下のコマンドを使ってプレイブックを実行します。

ansible-playbook copy-module-playbook.yaml

実行結果の例:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Handle permissions] ******************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最後に、file1.txt ファイルが設定されたパーミッションでリモートホスト上の指定された宛先パスにコピーされたことを確認します。
ll を使って /home/labex/file.txt の詳細を表示します。

ll /home/labex/file.txt

実行結果の例:

-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt

ll を使って /tmp/file1.txt の詳細を表示します。

ll /tmp/file1.txt

実行結果の例:

-rw-r--r-- 1 labex labex 33 Mar 9 09:11 /tmp/file1.txt

この Ansible プレイブックは、リモートホスト上のファイルに対して読み取り、書き込み、実行などの特定のパーミッションを設定するために使用できます。

冪等性を持つコピー

このステップでは、Ansible Copy モジュールを使ってコピー操作を冪等性にします。リモートホスト上にファイルが存在しない場合、またはソースファイルが変更されている場合にのみ、ファイルがコピーされることを確認します。

まず、既存のプレイブックファイルの内容をすべて削除し、以下の内容を追加して修正します。

- hosts: localhost
  tasks:
    - name: Idempotent copy
      copy:
        src: /home/labex/file.txt
        dest: /tmp/file2.txt
        remote_src: yes
  • remote_src: yes:このパラメータは、src パスがリモートホスト上にあることを指定し、Ansible にリモートホストから別の場所にファイルを転送させます。

このプレイブックタスクを通じて、リモートホスト上にある /home/labex/file.txt ファイルは、存在しない場合、またはソースファイルが変更されている場合にのみ、リモートホスト上の /tmp/file2.txt にコピーされます。

次に、/tmp/file2.txt ファイルが存在するかどうかを確認します。

ll /tmp/file2.txt

実行結果の例:

ls: cannot access '/tmp/file2.txt': No such file or directory

その後、以下のコマンドを使ってプレイブックを実行します。

ansible-playbook copy-module-playbook.yaml

実行結果の例:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Idempotent copy] *********************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最後に、file2.txt ファイルが存在しない場合、またはソースファイルが変更されている場合にのみ、リモートホスト上の指定された宛先パスにコピーされたことを確認します。

ll /tmp/file2.txt

実行結果の例:

-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /tmp/file2.txt

この時点で、もう一度プレイブックを実行します。

ansible-playbook copy-module-playbook.yaml

実行結果の例:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Idempotent copy] *********************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

changed=1changed=0 になることに注意してください。これは、この Ansible プレイブックが、リモートホスト上にファイルが存在しない場合、またはソースファイルが変更されている場合にのみ、ファイルをコピーすることができることを示しています。

まとめ

おめでとうございます!あなたは Ansible Copy モジュールの実験を成功裏に完了しました。ファイルやディレクトリをリモートホストにコピーする方法、ファイル属性を保持する方法、パーミッションを設定する方法、および冪等性を確保する方法を学びました。

Copy モジュールは、Ansible の自動化タスクでファイルを転送するための強力なツールです。必要に応じてコピー操作をカスタマイズするためのさまざまなパラメータを提供します。

これで Copy モジュールを十分に理解したので、Ansible のプレイブックでその機能を活用して、インフラストラクチャ全体で効率的にファイル転送と同期を管理することができます。Ansible で楽しくコピーを行いましょう!