Ansible入門③：copyモジュール紹介

## 概要

Ansibleの`copy`モジュールは、ファイルをリモートホストのファイルに設定をデプロイする際に便利です。私の経験した現場ではこのcopyモジュールを多用していました。
この記事では、`copy`モジュールの2つの使い方を紹介します。

---

## 1. `copy`モジュールとは？

`copy`モジュールは、その名の通りファイルをコピーするために使われます。しかし、単にファイルを移すだけでなく、ファイルの所有者、グループ、パーミッションの設定や、上書き時のバックアップ取得といったこともできます。


---

## 2. コントロールノード上のファイルをコピーする (`src`パラメータ)

Ansibleを実行している**コントロールノード**に存在するファイルを、リモートホストの指定されたパスへコピーします。

### 記述例(Linux)

```
- name: Webサーバーのindex.htmlをデプロイする
  ansible.builtin.copy:
    src: "/home/ansible/web_contents/index.html" # コントロールノード上のファイルパス
    dest: "/usr/share/nginx/html/index.html"     # リモートホスト上のコピー先パス
    owner: "nginx"                               # コピー後のファイルの所有者
    group: "nginx"                               # コピー後のファイルのグループ
    mode: "0644"                                 # コピー後のファイルのパーミッション
```

### srcパラメータの特徴

- **既存ファイルの配布**: 既にファイルが存在し、それをそのままリモートホストに配布したい場合に最適です。

- **バイナリファイルのコピー**: テキストファイルだけでなく、実行形式のバイナリファイルや画像ファイルなどもコピーできます。

- **記述がシンプルになる**：ファイルパスを指定するだけなのでプレイブックの記述がシンプルになります。

---

## 3. ファイル内容を直接Playbookに記述してデプロイする (`content`パラメータ)

コピーしたいファイルの内容をPlaybookのYAML内に直接記述します。小さな設定ファイルや、動的に内容を生成するまでもない一時的なファイルを配置する際に便利です。

### 記述例(Linux)



```
- name: NginxのホームぺージをPlaybookから直接作成する
  ansible.builtin.copy:
    content: | 
      <!DOCTYPE html>
      <html lang="ja">
      <head>
          <meta charset="UTF-8">
          <title>AnsibleでデプロイされたNginx</title>
      </head>
      <body>
          <h1>Nginxへようこそ！</h1>
          <p>このページはAnsibleのcopyモジュールでデプロイされました。</p>
          <p>（学習用のサンプルページです）</p>
      </body>
      </html>
    dest: "/usr/share/nginx/html/index.html" # リモートホスト上の作成先パス
    owner: "nginx"
    group: "nginx"
    mode: "0644"
```

### contentパラメータ特徴

- **Playbook内で完結**: ファイルの内容がPlaybook内に含まれるため、外部ファイルを参照する必要がありません。

- **手軽な設定**: 単純な設定ファイルやスクリプトをその場で作成したい場合に適しています。

- 見ての通り情報が多くなりとても見づらくなるので私はあまり使用しないです、、

---

## 4. `src`と`content`の使い分けのポイント

どちらの方法を使うべきか迷った際は、以下の点を考慮してください。

- **ファイルのサイズと複雑さ**
    
    - **`src`**: 大きなファイル、バイナリファイル、複雑な設定ファイル
    
    - **`content`**: 小さなテキストファイル、Playbook内で完結させたいシンプルな設定やスクリプト。
    
- **バージョン管理**
    
    - **`src`**: Gitなどのバージョン管理システムでファイル自体を管理している場合。
    - **`content`**: Playbookと一緒にファイルの変更履歴を管理したい場合。
    
- **情的or動的**
    
    - **`copy`モジュール**: ファイル内容が静的である場合に適しています。
    - **`template`モジュール**: 変数などを使ってファイル内容を動的に生成したい場合は、`copy`モジュールではなく`template`モジュールを使ったほうがいい。

---

## 5. その他の便利なパラメータ

`copy`モジュールには、上記例以外にもパラメータがあるので紹介します。

|            |                                                       |                                        |
| ---------- | ----------------------------------------------------- | -------------------------------------- |
| **パラメータ**  | **説明**                                                | **例**                                  |
| `backup`   | `yes`に設定すると、ファイルを上書きする前に元のファイルのバックアップをリモートホスト上に作成します。 | `backup: yes`                          |
| `force`    | `no`に設定すると、コピー先のファイルが存在する場合、コピーを実行しません。デフォルトは`yes`です。 | `force: no`                            |
| `checksum` | コピー後にファイルのチェックサムを検証するかどうか。デフォルトは`yes`です。              | `checksum: no`                         |
| `validate` | コピー先のファイルが有効かどうかを検証するコマンドを指定します。検証失敗時はロールバックされます。     | `validate: "/usr/sbin/nginx -t -c %s"` |

### 応用例：設定ファイルをバックアップしつつ更新(Linux)



```
- name: Nginx設定ファイルを更新し、変更前にバックアップを取る
  ansible.builtin.copy:
    src: "/etc/ansible/files/nginx.conf" # コントロールノード上の新しい設定ファイル
    dest: "/etc/nginx/nginx.conf"       # リモートホスト上のNginx設定ファイル
    owner: "nginx"
    group: "nginx"
    mode: "0644"
    backup: yes                          # 上書き前に元のファイルをバックアップする
    validate: "/usr/sbin/nginx -t -c %s" # コピー後にNginxの設定構文をチェック
```

---

## 6. まとめ

以前の現場でこのモジュールがよく使われていたので記事にしてみました。

情的な内容をデプロイする際には最適ですが、動的の内容をデプロイする際は templateモジュールなんてもので動的な内容を生成し、リモートホストに廃止することが出るそうです。
いつか記事にしてみたいです！

Ansibleの公式ドキュメントでは、さらに詳しい情報や追加のパラメータが解説されていますので、ぜひ参照してみてください。

- [Ansible copy module — ansible.builtin.copy](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html)