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
このプレイブックは何をしますか? (Kono pureibukku wa nani o shimasu ka?)
このAnsibleのPlaybookは、Ubuntu 18.04でDockerをインストールして使用する手順を手動で実行する代わりとなります。プレイブックを1回セットアップすれば、その後のすべてのインストールに使用することができます。
このプレイブックを実行すると、Ansible ホストに対して以下のアクションが実行されます。
-
- Ansibleがaptパッケージマネージャーの代替として好むaptitudeをインストールしてください。
-
- 必要なシステムパッケージをインストールしてください。
-
- Docker GPG APTキーをインストールしてください。
-
- 公式のDockerリポジトリをaptソースに追加してください。
-
- Dockerをインストールしてください。
-
- Python Dockerモジュールをpipを使ってインストールしてください。
-
- default_container_imageで指定されたデフォルトのイメージをDocker Hubからプルしてください。
- container_count変数で定義された数のコンテナを作成し、各新しいコンテナでdefault_container_commandで定義されたコマンドを実行してください。
プレイブックが完了すれば、設定変数で定義したオプションに基づいて複数のコンテナが作成されます。
はじめに、Ansibleコントロールノードサーバーでsudo権限を持ったユーザーにログインしてください。
ステップ1:プレイブックの準備
playbook.ymlファイルは、すべてのタスクが定義されている場所です。タスクは、Ansible playbookを使用して自動化できる最小単位のアクションです。しかし、まずは好きなテキストエディタを使用して、プレイブックファイルを作成してください。
- nano playbook.yml
これにより、空のYAMLファイルが開かれます。プレイブックにタスクを追加する前に、以下の内容を追加して始めてください。
---
- 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
ステップ2−Playbookにパッケージのインストールタスクを追加します。
Ansibleでは、デフォルトでタスクはプレイブック内で上から下へと順番に同期的に実行されます。つまり、タスクの順序付けが重要であり、次のタスクが始まる前に1つのタスクが実行を完了することが安全に保証されます。
このプレイブックのすべてのタスクは単独で使用し、他のプレイブックでも再利用できます。
最初のタスクとして、Linuxパッケージマネージャーとのインターフェースツールであるaptitudeのインストールと、必要なシステムパッケージのインストールを追加してください。Ansibleはこれらのパッケージが常にサーバーにインストールされることを確認します。
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モジュールもインストールされます。
- 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から提供されます。このイメージを使用して、コンテナは、プレイブックの先頭で宣言された変数の指定に従って作成されます。
- 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 — 完成したプレイブックのレビュー
あなたのプレイブックは、独自のカスタマイズによってわずかに異なるかもしれませんが、大まかに以下のようなものになるべきです。
---
- 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
プレイブックに満足したら、テキストエディタを終了して保存することができます。
ステップ6 — プレイブックを実行する
今、このプレイブックを1つ以上のサーバーで実行する準備が整いました。ほとんどのプレイブックはデフォルトでインベントリ内のすべてのサーバーで実行されるように設定されていますが、今回は特定のサーバーを指定します。
サーバー1に接続するためのプレイブックを、サミーとして実行するには、以下のコマンドを使用することができます。
- ansible-playbook playbook.yml -l server1 -u sammy
-lフラグは自分のサーバーを指定し、-uフラグはリモートサーバーにログインするユーザーを指定します。以下のような出力が得られます。
. . . 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によって設定されたサーバーにSSHでログインし、コンテナが正常に作成されたかを確認します。
以下のコマンドでリモートサーバーにログインしてください:
「リモートサーバーにログインしてください。」
- ssh sammy@your_remote_server_ip
リモートサーバー上でDockerコンテナをリストアップしてください。
- sudo docker ps -a
これと似たような出力を見る必要があります。
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プレイブックの作成」を参照してください。