前書き
コンテナ化されたアプリケーションとマイクロサービスの普及により、サーバー自動化はシステム管理において重要な役割を果たしています。 また、新しいサーバーの標準手順を確立し、人的エラーを減らす方法でもあります。
このガイドでは、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ホストで次のアクションが実行されます。
-
apt
パッケージマネージャーの代わりにAnsibleが推奨するaptitude
をインストールします。 -
必要なシステムパッケージをインストールします。
-
Docker GPG APTキーをインストールします。
-
公式のDockerリポジトリを
apt
ソースに追加します。 -
Dockerをインストールしてください。
-
pip
を介してPythonDockerモジュールをインストールします。 -
Docker Hubから
default_container_image
で指定されたデフォルトのイメージをプルします。 -
それぞれ
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 + X
、Y
、ENTER
の順に押してください。
これで、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を参照してください。