序章

最新のアプリケーション環境は使い捨てであるため、サーバーの自動化はシステム管理において重要な役割を果たしています。 構成管理ツール( Ansible など)は通常、新しいサーバーの標準手順を確立することでサーバーセットアップを自動化するプロセスを合理化すると同時に、手動セットアップに関連する人的エラーを減らします。

Ansibleは、ノードに特別なソフトウェアをインストールする必要のないシンプルなアーキテクチャを提供します。 また、自動化スクリプトの作成を容易にする堅牢な機能セットと組み込みモジュールも提供します。

このガイドでは、Ansibleを使用して、 Ubuntu20.04にDockerをインストールして使用する方法に関するガイドに含まれている手順を自動化する方法について説明します。 Docker は、コンテナの管理プロセスを簡素化するアプリケーションです。これは、仮想マシンと同じように動作するが、より移植性が高く、リソースに優しく、依存するリソース分離プロセスです。ホストオペレーティングシステムにより多くの負荷がかかります。

前提条件

このガイドのプレイブックで提供されている自動セットアップを実行するには、次のものが必要です。

  • 1つのAnsibleコントロールノード:SSHキーを使用してAnsibleホストに接続するようにAnsibleがインストールおよび構成されたUbuntu20.04マシン。 サーバーの初期設定ガイドで説明されているように、コントロールノードにsudo権限とファイアウォールが有効になっている通常のユーザーがいることを確認してください。 Ansibleをセットアップするには、 Ubuntu20.04にAnsibleをインストールして構成する方法に関するガイドに従ってください。
  • 1つ以上のAnsibleホストUbuntu20.04でAnsibleを使用して初期サーバーセットアップを自動化する方法のガイドに従って以前にセットアップされた1つ以上のリモートUbuntu20.04サーバー。

先に進む前に、まず、AnsibleコントロールノードがAnsibleホストに接続してコマンドを実行できることを確認する必要があります。 接続テストについては、 Ubuntu20.04にAnsibleをインストールして構成する方法のステップ3を確認してください。

このハンドブックは何をしますか?

このAnsibleプレイブックは、 Ubuntu20.04にDockerをインストールして使用する方法に関するガイドで概説されている手順を手動で実行する代わりの方法を提供します。 プレイブックを一度設定し、その後のすべてのインストールに使用します。

このプレイブックを実行すると、Ansibleホストで次のアクションが実行されます。

  1. aptitudeをインストールします。これは、aptパッケージマネージャーの代わりにAnsibleで推奨されています。
  2. 必要なシステムパッケージをインストールします。
  3. DockerGPGAPTキーをインストールします。
  4. 公式のDockerリポジトリをaptソースに追加します。
  5. Dockerをインストールします。
  6. pipを介してPythonDockerモジュールをインストールします。
  7. default_container_imageで指定されたデフォルトのイメージをDockerHubからプルします。
  8. container_count変数で定義された数のコンテナーを作成し、それぞれdefault_container_imageで定義されたイメージを使用して、default_container_commandで定義されたコマンドを新しいコンテナーごとに実行します。

プレイブックの実行が完了すると、構成変数内で定義したオプションに基づいて多数のコンテナーが作成されます。

まず、Ansibleコントロールノードサーバーでsudoが有効なユーザーにログインします。

ステップ1—プレイブックの準備

playbook.ymlファイルには、すべてのタスクが定義されています。 タスクは、Ansibleプレイブックを使用して自動化できるアクションの最小単位です。 ただし、最初に、好みのテキストエディタを使用してプレイブックファイルを作成します。

  1. nano playbook.yml

これにより、空のYAMLファイルが開きます。 プレイブックにタスクを追加する前に、以下を追加することから始めます。

playbook.yml
---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1

あなたが出くわすほとんどすべてのプレイブックは、これに似た宣言で始まります。 hostsは、Ansibleコントロールノードがこのプレイブックでターゲットとするサーバーを宣言します。 becomeは、すべてのコマンドがエスカレートされたroot特権で実行されるかどうかを示します。

varsを使用すると、データを変数に格納できます。 将来これらを変更する場合は、ファイル内のこれらの1行を編集するだけで済みます。 各変数の簡単な説明は次のとおりです。

  • container_count:作成するコンテナーの数。
  • default_container_name:デフォルトのコンテナ名。
  • default_container_image:コンテナーの作成時に使用されるデフォルトのDockerイメージ。
  • default_container_command:新しいコンテナで実行するデフォルトのコマンド。

注:プレイブックファイルを最終的な完成状態で表示する場合は、ステップ5にジャンプします。 YAMLファイルはインデント構造に特化している可能性があるため、すべてのタスクを追加したら、プレイブックを再確認することをお勧めします。

ステップ2—Playbookへのパッケージインストールタスクの追加

デフォルトでは、タスクはプレイブックの上から下に順番にAnsibleによって同期的に実行されます。 これは、タスクの順序が重要であることを意味し、次のタスクが開始する前に1つのタスクの実行が終了すると安全に想定できます。

このプレイブックのすべてのタスクはスタンドアロンで、他のプレイブックで再利用できます。

Linuxパッケージマネージャーとインターフェイスするためのツールであるaptitudeをインストールし、必要なシステムパッケージをインストールするという最初のタスクを追加します。 Ansibleは、これらのパッケージが常にサーバーにインストールされるようにします。

playbook.yml
  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

ここでは、apt Ansible組み込みのモジュールを使用して、Ansibleにパッケージをインストールするように指示しています。 Ansibleのモジュールは、生のbashコマンドとして実行する必要がある操作を実行するためのショートカットです。 aptitudeが利用できない場合、Ansibleはパッケージをインストールするためにaptに安全にフォールバックしますが、Ansibleは歴史的にaptitudeを優先していました。

好みに応じてパッケージを追加または削除できます。 これにより、すべてのパッケージが存在するだけでなく、最新バージョンでも存在し、aptによる更新が呼び出された後に実行されます。

ステップ3—DockerインストールタスクをPlaybookに追加する

タスクは、公式リポジトリから最新バージョンのDockerをインストールします。 ダウンロードを確認するためにDockerGPGキーが追加され、公式リポジトリが新しいパッケージソースとして追加され、Dockerがインストールされます。 さらに、Python用のDockerモジュールもインストールされます。

playbook.yml
    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu focal stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

apt_keyおよびapt_repositoryの組み込みAnsibleモジュールが最初に正しいURLにポイントされ、次にそれらが存在することを確認するようにタスクが設定されていることがわかります。 これにより、pipを使用してPython用のモジュールをインストールするとともに、最新バージョンのDockerをインストールできます。

ステップ4—DockerイメージとコンテナタスクをPlaybookに追加する

Dockerコンテナーの実際の作成は、ここから目的のDockerイメージをプルすることから始まります。 デフォルトでは、これらの画像は公式の DockerHubから取得されます。 この画像を使用して、プレイブックの上部で宣言された変数によってレイアウトされた仕様に従ってコンテナが作成されます。

playbook.yml
    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

docker_imageは、コンテナーのベースとして使用するDockerイメージをプルするために使用されます。 docker_containerを使用すると、作成するコンテナーの詳細と、それらに渡すコマンドを指定できます。

with_sequenceは、ループを作成するAnsibleの方法であり、この場合、指定したカウントに従ってコンテナーの作成をループします。 これは基本的なカウントループであるため、ここでのitem変数は、現在のループの反復を表す数値を提供します。 この番号は、ここでコンテナに名前を付けるために使用されます。

ステップ5—完全なプレイブックを確認する

プレイブックはおおよそ次のようになりますが、カスタマイズによって若干の違いがあります。

playbook.yml
---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1d

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu focal stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

独自のワークフロー内で個々のニーズに最も合うように、このプレイブックを自由に変更してください。 たとえば、 docker_imageモジュールを使用してイメージをDockerHubにプッシュしたり、docker_containerモジュールを使用してコンテナーネットワークをセットアップしたりできます。

注:これは、くぼみに注意するための穏やかなリマインダーです。 エラーが発生した場合は、これが原因である可能性が非常に高くなります。 YAMLは、この例で行われたように、インデントとして2つのスペースを使用することを提案します。

プレイブックに満足したら、テキストエディタを終了して保存できます。

ステップ6—Playbookを実行する

これで、このプレイブックを1つ以上のサーバーで実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように構成されていますが、今回はサーバーを指定します。

server1でのみプレイブックを実行し、sammyとして接続するには、次のコマンドを使用できます。

  1. ansible-playbook playbook.yml -l server1 -u sammy

-lフラグはサーバーを指定し、-uフラグはリモートサーバーにログインするユーザーを指定します。 次のような出力が得られます。

Output
. . . changed: [server1] TASK [Create default containers] ***************************************************************************************************************** changed: [server1] => (item=1) changed: [server1] => (item=2) changed: [server1] => (item=3) changed: [server1] => (item=4) PLAY RECAP *************************************************************************************************************************************** server1 : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

:Ansibleプレイブックの実行方法の詳細については、Ansibleチートシートガイドを確認してください。

これは、サーバーのセットアップが完了したことを示しています。 出力は完全に同じである必要はありませんが、障害がゼロであることが重要です。

プレイブックの実行が終了したら、SSH経由でAnsibleによってプロビジョニングされたサーバーにログインして、コンテナーが正常に作成されたかどうかを確認します。

次のコマンドでリモートサーバーにログインします。

  1. ssh sammy@your_remote_server_ip

そして、リモートサーバー上のDockerコンテナを一覧表示します。

  1. sudo docker ps -a

次のような出力が表示されます。

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3fe9bfb89cf ubuntu "sleep 1d" 5 minutes ago Created docker4 8799c16cde1e ubuntu "sleep 1d" 5 minutes ago Created docker3 ad0c2123b183 ubuntu "sleep 1d" 5 minutes ago Created docker2 b9350916ffd8 ubuntu "sleep 1d" 5 minutes ago Created docker1

これは、プレイブックで定義されたコンテナが正常に作成されたことを意味します。 これはプレイブックの最後のタスクであったため、このサーバーでプレイブックが完全に実行されたことも確認します。

結論

インフラストラクチャのセットアップを自動化すると、時間を節約できるだけでなく、サーバーがニーズに合わせてカスタマイズできる標準構成に従うようにすることもできます。 最新のアプリケーションの分散性と異なるステージング環境間の一貫性の必要性により、このような自動化は多くのチームの開発プロセスの中心的なコンポーネントになっています。

このガイドでは、Ansibleを使用して、リモートサーバーにDockerをインストールしてセットアップするプロセスを自動化する方法を示しました。 通常、コンテナを操作する際のニーズは個人ごとに異なるため、docker_container Ansibleモジュールの詳細と使用例については、公式のAnsibleドキュメントを確認することをお勧めします。

サーバーの初期設定をさらにカスタマイズするためにこのプレイブックに他のタスクを含めたい場合は、Ansibleの紹介ガイド構成管理101:Ansibleプレイブックの作成を参照してください。