Ansibleを使用してUbuntu 18.04にDockerをインストールおよびセットアップする方法

前書き

コンテナ化されたアプリケーションとマイクロサービスの普及により、サーバー自動化はシステム管理において重要な役割を果たしています。 また、新しいサーバーの標準手順を確立し、人的エラーを減らす方法でもあります。

このガイドでは、Ansibleを使用して、How To Install and Use Docker on Ubuntu 18.04に関するガイドに含まれている手順を自動化する方法について説明します。 Dockerは、containersの管理プロセスを簡素化するアプリケーションです。これは、仮想マシンと同様に動作するが、より移植性が高く、リソースに優しく、より大きく依存するリソース分離プロセスです。ホストオペレーティングシステム。

このセットアップは手動で完了できますが、Ansibleなどの構成管理ツールを使用してプロセスを自動化すると、時間を節約し、数十から数百のノードで繰り返すことができる標準手順を確立できます。 Ansibleは、特別なソフトウェアをノードにインストールする必要のないシンプルなアーキテクチャを提供し、自動化スクリプトの作成を容易にする堅牢な機能セットと組み込みモジュールを提供します。

飛行前チェック

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

  • Ansibleは、ローカルマシンまたはAnsible Control Nodeとして設定したリモートサーバーのいずれかにインストールされます。 チュートリアルHow to Install and Configure Ansible on Ubuntu 18.04のステップ1に従って、これを設定できます。

    • リモートサーバーをAnsible Control Nodeとして使用する場合は、sudo特権を持つ非ルートユーザーと、Ansibleをインストールする前に設定された基本的なファイアウォールが必要です。 これを設定するには、Initial Server Setup Guide for Ubuntu 18.04に従ってください。

  • Ansible hostsとして使用される1つ以上のUbuntu18.04サーバーへのアクセス。 それぞれに、sudo特権を持つ非rootユーザーと、基本的なファイアウォールが構成されている必要があります。 これを自動的に設定するには、Automating Initial Server Setup with Ansible on Ubuntu 18.04に関するガイドに従ってください。 または、各AnsibleホストでInitial Server Setup Guide for Ubuntu 18.04を使用して、これを手動で設定することもできます。

ノードへの接続のテスト

Ansibleがノードでコマンドを実行できることを確認するには、Ansible Control Nodeから次のコマンドを実行します。

ansible -m ping all

このコマンドは、Ansibleの組み込みのpingモジュールを使用して、デフォルトのインベントリファイルからすべてのノードで接続テストを実行し、現在のシステムユーザーとして接続します。 pingモジュールは、次のことをテストします。

  • Ansibleホストにアクセスできます。

  • Ansible Control Nodeには有効なSSH認証情報があります。

  • ホストはPythonを使用してAnsibleモジュールを実行できます。

Ansibleを正しくインストールして構成すると、次のような出力が得られます。

Outputserver1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

ホストからpongの応答が返されると、そのサーバーでAnsibleコマンドとプレイブックを実行する準備ができたことを意味します。

[.note]#Note:サーバーから正常な応答を返すことができない場合は、カスタム接続オプションを使用してAnsibleコマンドを実行する方法の詳細についてAnsible Cheat Sheet Guideを確認してください。

このPlaybookの機能

このAnsibleプレイブックは、How To Install and Use Docker on Ubuntu 18.04に関するガイドで概説されている手順を手動で実行する代わりの方法を提供します。

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

  1. aptパッケージマネージャーの代わりにAnsibleが推奨するaptitudeをインストールします。

  2. 必要なシステムパッケージをインストールします。

  3. Docker GPG APTキーをインストールします。

  4. 公式のDockerリポジトリをaptソースに追加します。

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

  6. pipを介してPythonDockerモジュールをインストールします。

  7. Docker Hubからdefault_container_imageで指定されたデフォルトのイメージをプルします。

  8. それぞれdefault_container_imageで定義されたイメージを使用して、create_containersフィールドで定義されたコンテナーの数を作成し、新しい各コンテナーでdefault_container_commandで定義されたコマンドを実行します。

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

このプレイブックの使用方法

開始するには、playbookのコンテンツをAnsibleコントロールノードにダウンロードします。 便宜上、プレイブックの内容もthe next section of this guideに含まれています。

curlを使用して、コマンドラインからこのプレイブックをダウンロードします。

curl -L https://raw.githubusercontent.com/do-community/ansible-playbooks/master/docker/ubuntu1804.yml -o docker_ubuntu.yml

これにより、プレイブックの内容が現在の作業ディレクトリのdocker_ubuntu.ymlという名前のファイルにダウンロードされます。 選択したコマンドラインエディタでファイルを開くと、プレイブックの内容を調べることができます。

nano docker_ubuntu.yml

プレイブックファイルを開くと、注意が必要な変数を含むvarsという名前のセクションが表示されます。

docker_ubuntu.yml

. . .
vars:
  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:新しいコンテナで実行するデフォルトのコマンド。

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

これで、1つ以上のサーバーでこのプレイブックを実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリからallサーバーで実行されるように構成されています。 -lフラグを使用して、サーバーのサブセットまたは単一のサーバーのみがプレイブックの影響を受けるようにすることができます。 server1でのみプレイブックを実行するには、次のコマンドを使用できます。

ansible-playbook docker_ubuntu.yml -l server1

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

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

[.note]#Note:Ansibleプレイブックの実行方法の詳細については、Ansible Cheat Sheet Guide
#を確認してください。

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

sudo docker ps -a

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

OutputCONTAINER 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 Community GitHub organization内のansible-playbooks repositoryにあります。 スクリプトの内容を直接コピーまたはダウンロードするには、スクリプトの上部にあるRawボタンまたはclick here to view the raw contents directlyをクリックします。

便宜上、すべての内容もここに含まれています。

docker_ubuntu.yml

---
- hosts: all
  become: true
  vars:
    create_containers: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1d

  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

    # Pull image specified by variable default_image from the Docker Hub
    - 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 default values
    - 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モジュールを使用してコンテナーネットワークをセットアップしたりできます。

結論

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

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

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

Related