Ubuntu 18.04にDockerをインストールし、セットアップするためのAnsibleの使い方

はじめに

現代のアプリケーション環境の使い捨て性により、サーバーの自動化はシステム管理において不可欠な役割を果たしています。Ansibleのような構成管理ツールは、新しいサーバーの標準手順を確立することでサーバーのセットアップを自動化するプロセスを効率化し、手動セットアップに関連する人為的なエラーを減らすために一般的に使用されています。

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

このガイドでは、Ansibleを使用して、Ubuntu 18.04でDockerをインストールして使用する方法の手順を自動化する方法を説明しています。Dockerはコンテナを管理するプロセスを簡素化するアプリケーションであり、仮想マシンと同様の動作をするリソース分離されたプロセスですが、よりポータブルでリソースを効率的に利用し、ホストオペレーティングシステムに依存します。

前提条件

このガイドによって提供されるプレイブックによる自動設定を実行するためには、次のものが必要です。

  • One Ansible control node: an Ubuntu 18.04 machine with Ansible installed and configured to connect to your Ansible hosts using SSH keys. Make sure the control node has a regular user with sudo permissions and a firewall enabled, as explained in our Initial Server Setup guide. To set up Ansible, please follow our guide on How to Install and Configure Ansible on Ubuntu 18.04.
  • One or more Ansible Hosts: one or more remote Ubuntu 18.04 servers previously set up following the guide on How to Use Ansible to Automate Initial Server Setup on Ubuntu 18.04.

Note

進む前に、まずAnsible制御ノードがAnsibleホストとの接続とコマンドの実行ができることを確認する必要があります。接続テストについては、「Ubuntu 18.04にAnsibleをインストールおよび設定する方法」のステップ3を確認してください。

このプレイブックは何をしますか? (Kono pureibukku wa nani o shimasu ka?)

このAnsibleのPlaybookは、Ubuntu 18.04でDockerをインストールして使用する手順を手動で実行する代わりとなります。プレイブックを1回セットアップすれば、その後のすべてのインストールに使用することができます。

このプレイブックを実行すると、Ansible ホストに対して以下のアクションが実行されます。

    1. Ansibleがaptパッケージマネージャーの代替として好むaptitudeをインストールしてください。

 

    1. 必要なシステムパッケージをインストールしてください。

 

    1. Docker GPG APTキーをインストールしてください。

 

    1. 公式のDockerリポジトリをaptソースに追加してください。

 

    1. Dockerをインストールしてください。

 

    1. Python Dockerモジュールをpipを使ってインストールしてください。

 

    1. default_container_imageで指定されたデフォルトのイメージをDocker Hubからプルしてください。

 

    container_count変数で定義された数のコンテナを作成し、各新しいコンテナでdefault_container_commandで定義されたコマンドを実行してください。

プレイブックが完了すれば、設定変数で定義したオプションに基づいて複数のコンテナが作成されます。

はじめに、Ansibleコントロールノードサーバーでsudo権限を持ったユーザーにログインしてください。

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

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

  1. nano playbook.yml

 

これにより、空のYAMLファイルが開かれます。プレイブックにタスクを追加する前に、以下の内容を追加して始めてください。

プレイブック.yml (Pureibukku.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は、全てのコマンドがスーパーユーザー特権で実行されるかを示します。

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

  • container_count: The number of containers to create.
  • default_container_name: Default container name.
  • default_container_image: Default Docker image to be used when creating containers.
  • default_container_command: Default command to run on new containers.

Note

注意:プレイブックファイルの最終的な完成形を確認したい場合は、ステップ5に移動してください。YAMLファイルはインデント構造に特定の規則があるため、すべてのタスクを追加した後にプレイブックを再確認することがおすすめです。

ステップ2−Playbookにパッケージのインストールタスクを追加します。

Ansibleでは、デフォルトでタスクはプレイブック内で上から下へと順番に同期的に実行されます。つまり、タスクの順序付けが重要であり、次のタスクが始まる前に1つのタスクが実行を完了することが安全に保証されます。

このプレイブックのすべてのタスクは単独で使用し、他のプレイブックでも再利用できます。

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

プレイブック.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

ここでは、適切なAnsibleの組み込みモジュールを使用して、Ansibleにパッケージのインストールを指示しています。Ansibleのモジュールは、通常は生のbashコマンドとして実行する必要がある操作を簡略化するものです。aptitudeが利用できない場合、Ansibleは安全にaptを使用してパッケージをインストールしますが、Ansibleは歴史的にaptitudeを優先して利用しています。

お好みに合わせてパッケージを追加または削除することができます。これにより、すべてのパッケージが最新バージョンであり、aptのアップデート後に実行されます。

ステップ3-プレイブックへのDockerインストールタスクの追加

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

プレイブック.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 bionic 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

以下の文を日本語で自然に言い換えます。複数の選択肢は必要ありません。

Ansibleの組み込みモジュールであるapt_keyおよびapt_repositoryが、まず正しいURLに指定され、その後存在することを確認するようにタスク化されていることがわかります。これにより、最新バージョンのDockerのインストールが可能になり、Pythonのモジュールをインストールするためにpipを使用することができます。

ステップ4 – Dockerイメージとコンテナタスクをプレイブックに追加します。

あなたのDockerコンテナの実際の作成は、ここから始まります。所望のDockerイメージを取得することで行われます。これらのイメージはデフォルトで公式のDocker Hubから提供されます。このイメージを使用して、コンテナは、プレイブックの先頭で宣言された変数の指定に従って作成されます。

プレイブック.yml
    - name: Pull default Docker image
      docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
     .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 — 完成したプレイブックのレビュー

あなたのプレイブックは、独自のカスタマイズによってわずかに異なるかもしれませんが、大まかに以下のようなものになるべきです。

プレイブック.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 bionic 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
      docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      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 Hubにイメージをプッシュしたり、docker_containerモジュールを使用してコンテナネットワークを設定したりすることができます。

Note

注意事項:インデントに注意してください。エラーが発生した場合、これが原因である可能性が非常に高いです。YAMLは、この例のように2スペースをインデントに使用することを推奨しています。

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

ステップ6 — プレイブックを実行する

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

サーバー1に接続するためのプレイブックを、サミーとして実行するには、以下のコマンドを使用することができます。

  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

Note

注意:Ansibleのプレイブックの実行方法に関する詳細な情報は、弊社のAnsibleチートシートガイドを参照してください。

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

プレイブックの実行が完了したら、Ansibleによって設定されたサーバーにSSHでログインし、コンテナが正常に作成されたかを確認します。

以下のコマンドでリモートサーバーにログインしてください:
「リモートサーバーにログインしてください。」

  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

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

結論

インフラストラクチャのセットアップを自動化することは、時間の節約になるだけでなく、サーバーがニーズに合わせてカスタマイズ可能な標準的な構成に従うことも保証します。現代のアプリケーションは分散しており、異なるステージング環境間での一貫性が求められるため、このような自動化は多くのチームの開発プロセスで中心的な役割を果たしています。

このガイドでは、リモートサーバーにDockerをインストールしてセットアップするプロセスをAnsibleを使用して自動化する方法を示しました。コンテナを使用する際には、個々のニーズが異なる場合があるため、docker_container Ansibleモジュールの公式ドキュメントを参照し、さらなる情報や使用例をご確認いただくことをおすすめします。

もし初期サーバーのセットアップをさらにカスタマイズするために他のタスクを含めたい場合は、当社のAnsibleガイド「構成管理101:Ansibleプレイブックの作成」を参照してください。

コメントを残す 0

Your email address will not be published. Required fields are marked *