序章

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

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

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

前提条件

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

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

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

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

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

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

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

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

このハンドブックの使い方

最初に行う必要があるのは、 do-community /ansible-playbooksリポジトリからDockerプレイブックとその依存関係を取得することです。 このリポジトリをAnsibleコントロールノード内のローカルフォルダーに複製する必要があります。

別のガイドに従って以前にこのリポジトリのクローンを作成したことがある場合は、既存のansible-playbooksコピーにアクセスし、git pullコマンドを実行して、内容が更新されていることを確認してください。

  1. cd ~/ansible-playbooks
  2. git pull

do-community/ansible-playbooksリポジトリを初めて使用する場合は、次のコマンドを使用してリポジトリをホームフォルダに複製することから始める必要があります。

  1. cd ~
  2. git clone https://github.com/do-community/ansible-playbooks.git
  3. cd ansible-playbooks

関心のあるファイルは、docker_ubuntu1804フォルダー内にあります。このフォルダーの構造は次のとおりです。

docker_ubuntu1804
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

これらの各ファイルは次のとおりです。

  • vars/default.yml:プレイブックの設定をカスタマイズするための可変ファイル。
  • playbook.yml:リモートサーバーで実行されるタスクを含むプレイブックファイル。
  • readme.md:このハンドブックに関する情報を含むテキストファイル。

プレイブックの変数ファイルを編集して、Dockerのセットアップをカスタマイズします。 docker_ubuntu1804ディレクトリにアクセスし、選択したコマンドラインエディタを使用してvars/default.ymlファイルを開きます。

  1. cd docker_ubuntu1804
  2. nano vars/default.yml

このファイルには、注意が必要ないくつかの変数が含まれています。

vars / default.yml
---
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d

次のリストには、これらの各変数の簡単な説明と、それらを変更する方法が含まれています。

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

vars/default.yml内の変数の更新が完了したら、このファイルを保存して閉じます。 nanoを使用した場合は、CTRL + XYENTERの順に押してください。

これで、このプレイブックを1つ以上のサーバーで実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように構成されています。 -lフラグを使用して、サーバーのサブセットまたは単一のサーバーのみがプレイブックの影響を受けるようにすることができます。 -uフラグを使用して、リモートホストでPlaybookコマンドに接続して実行するために使用しているリモートサーバー上のユーザーを指定することもできます。

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

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

次のような出力が得られます。

Output
... TASK [Add Docker GPG apt Key] ******************************************************************************************************************** changed: [server1] TASK [Add Docker Repository] ********************************************************************************************************************* changed: [server1] TASK [Update apt and install docker-ce] ********************************************************************************************************** changed: [server1] TASK [Install Docker Module for Python] ********************************************************************************************************** changed: [server1] TASK [Pull default Docker image] ***************************************************************************************************************** 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によってプロビジョニングされたサーバーにログインし、docker ps -aを実行して、コンテナーが正常に作成されたかどうかを確認します。

  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サーバーのセットアップは、 DigitalOcean CommunityPlaybooksリポジトリ内のdocker_ubuntu1804フォルダーにあります。 スクリプトの内容を直接コピーまたはダウンロードするには、各スクリプトの上部にあるRawボタンをクリックします。

プレイブックの全内容とそれに関連するファイルも、便宜上ここに含まれています。

vars / default.yml

default.yml変数ファイルには、サーバーでDockerをセットアップするときに使用される値が含まれています。

vars / default.yml
---
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d

playbook.yml

playbook.ymlファイルは、このセットアップのすべてのタスクが定義されている場所です。 まず、このセットアップのターゲットとなるサーバーのグループ(all)を定義し、その後、become: trueを使用して、特権昇格( [ X197X])デフォルトで。 次に、構成オプションをロードするためのvars/default.yml変数ファイルが含まれています。

playbook.yml
---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  tasks:
    - name: Install aptitude using apt
      apt: name=aptitude state=latest update_cache=yes force_apt_get=yes

    - name: Install required system packages
      apt: name={{ item }} state=latest update_cache=yes
      loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']

    - 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: update_cache=yes name=docker-ce state=latest

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

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

    # Creates the number of containers defined by the variable create_containers, using values from vars file
    - name: Create default containers
      docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ create_containers }}

独自のワークフロー内で個々のニーズに最も合うように、このプレイブックを自由に変更してください。 たとえば、 docker_image モジュールを使用して、イメージをDocker Hubまたは[docker_container]( https://docs.ansible.com/ansible/2.6/modules)にプッシュできます。 /docker_container_module.html#docker-container-module )モジュールを使用してコンテナネットワークを設定します。

結論

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

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

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