Ubuntu 22.04でDockerをインストールして設定する方法をAnsibleで使用する方法を説明してください。
イントロダクション
現在、サーバーの自動化はシステム管理において重要な役割を果たしています。現代のアプリケーション環境の使い捨て性により、Ansibleなどの構成管理ツールを使用して、新しいサーバーの標準手順を確立することで、サーバーセットアップのプロセスを効率化し、手動設定に関連するヒューマンエラーを減らすことが一般的です。
Ansibleは、ノードに特別なソフトウェアをインストールする必要がないシンプルなアーキテクチャを提供しています。さらに、自動化スクリプトの作成を容易にする頑丈な機能セットと組み込みモジュールも提供しています。
このガイドでは、Ansibleを使用して、Ubuntu 22.04でDockerをインストールして使用する方法に含まれる手順を自動化する方法について説明します。Dockerは、コンテナを管理するプロセスを簡素化するアプリケーションであり、仮想マシンと同様の動作をするリソース分離されたプロセスですが、よりポータブルでリソースに優しく、ホストオペレーティングシステムにより依存しています。
前提条件
このガイドに記載されているプレイブックによる自動設定を実行するためには、以下が必要です。
- One Ansible control node: an Ubuntu 22.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 22.04.
- One or more Ansible Hosts: one or more remote Ubuntu 22.04 servers previously set up following the guide on How to Use Ansible to Automate Initial Server Setup on Ubuntu 22.04.
Note
このプレイブックは何をしますか? (Kono pureibukku wa nani o shimasu ka?)
このAnsibleのプレイブックは、Ubuntu 22.04にDockerをインストールして使用する手順を手動で実行する代わりのオプションを提供します。プレイブックを一度設定すれば、その後のすべてのインストールに使用できます。
このプレイブックを実行すると、Ansibleホストに以下のアクションが実行されます。
-
- Ansibleによって、aptパッケージマネージャーの代替として好まれているaptitudeをインストールしてください。
-
- 必要なシステムパッケージをインストールしてください。
-
- DockerのGPG APTキーをインストールしてください。
-
- 公式のDockerリポジトリをaptソースに追加してください。
-
- Dockerをインストールしてください。
-
- pipを使用してPythonのDockerモジュールをインストールしてください。
-
- default_container_imageで指定されたデフォルトのイメージをDocker Hubからプルしてください。
- default_container_commandで指定されたコマンドを各新しいコンテナで定義されたcontainer_count変数の数だけ作成して実行してください。
プレイブックの実行が終了すると、設定変数で定義したオプションに基づいて、複数のコンテナが作成されます。
最初に、Ansibleコントロールノードサーバーでsudo権限を有効にしたユーザーにログインしてください。
ステップ1:プレイブックの準備
playbook.ymlファイルは、すべてのタスクが定義されている場所です。タスクは、Ansibleのプレイブックを使用して自動化できる最小のアクションの単位です。しかし、まず、お好みのテキストエディタを使用してプレイブックファイルを作成してください。
- 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は、すべてのコマンドが昇格されたroot権限で実行されるかどうかを示します。
変数を使用すると、データを変数に保存することができます。将来変更することになった場合、ファイル内のこれらの一行のみを編集するだけで済みます。以下に各変数の簡単な説明を示します。
- 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-プレイブックにパッケージインストールタスクを追加します。
デフォルトでは、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にフォールバックしますが、過去には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 jammy 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
以下の通り、native Japaneseでパラフレーズします(1つのオプションのみ):
Ansibleの組み込みモジュールであるapt_keyとapt_repositoryが、まず正しいURLに向けられ、その後存在することを確認するように指示されていることが分かります。これにより、最新バージョンのDockerのインストールと、Pythonのモジュールをpipを使用してインストールすることが可能となっています。
ステップ4−プレイブックにDockerイメージとコンテナーのタスクを追加します。
以下は、日本語で自然な言い方に言い換えたものです:
ここから、お望みのDockerイメージをプルすることで、Dockerコンテナの実際の作成が始まります。デフォルトでは、これらのイメージは公式のDocker Hubから提供されます。このイメージを使用して、コンテナはPlaybookの先頭で宣言された変数の仕様に従って作成されます。
- name: Pull default Docker image
community.docker.docker_image:
name: "{{ default_container_image }}"
source: pull
- name: Create default containers
community.docker.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 jammy 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
community.docker.docker_image:
name: "{{ default_container_image }}"
source: pull
- name: Create default containers
community.docker.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
以下の通り、日本語で述べます(ただし1つのオプションのみ):
あなたのサーバーのセットアップは完了しました!出力が完全に同じである必要はありませんが、ゼロの不具合が発生しないことが重要です。
プレイブックの実行が完了したら、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を使用して示しました。コンテナを使用する際には、個々のニーズが異なることが一般的ですので、公式のAnsibleドキュメンテーションにアクセスし、docker_container Ansibleモジュールの詳細や使用例を確認することをお勧めします。
もしこのプレイブックに他のタスクを含めて、初期サーバーのセットアップをさらにカスタマイズしたい場合は、当社のAnsibleガイド「Configuration Management 101: Writing Ansible Playbooks」を参照してください。