前書き

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

このガイドでは、https://ansible.com [Ansible]を使用して、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-dockerのガイドに含まれる手順を自動化する方法について説明します。 -on-ubuntu-18-04 [Ubuntu 18.04にDockerをインストールして使用する方法]。 Dockerは、_containers_の管理プロセスを簡素化するアプリケーションです。リソース分離プロセスは、仮想マシンと同様に動作しますが、より移植性が高く、リソースフレンドリーで、依存しますホストオペレーティングシステムにより重くなります。

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

飛行前チェック

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

  • Ansibleは、_Ansible Control Node_として設定したローカルマシンまたはリモートサーバーにインストールされます。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-18-04のステップ1に従うことができます[UbuntuでAnsibleをインストールおよび構成する方法18.04]この設定を取得します。

  • Ansible Control Nodeとしてリモートサーバーを使用する場合は、sudo特権を持つ非ルートユーザーと、Ansibleをインストールする前に設定された基本的なファイアウォールが必要です。 これを設定するには、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [Ubuntu 18.04の初期サーバーセットアップガイド]に従ってください。

  • _Ansible hosts_として使用される1つ以上のUbuntu 18.04サーバーへのアクセス。 それぞれにsudo特権を持つ非rootユーザーと基本ファイアウォールが設定されている必要があります。 Ubuntu 18.04でのAnsibleによる初期サーバー設定の自動化のガイドに従って設定してくださいこれは自動的にアップします。 または、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [Ubuntu 18.04の初期サーバーセットアップガイド]に従って、これを手動で設定することもできます。 Ansibleホスト。

ノードへの接続のテスト

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

ansible -m ping all

このコマンドは、Ansibleの組み込みhttps://docs.ansible.com/ansible/latest/modules/ping_module.html [+ 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コマンドとプレイブックを実行する準備ができていることを意味します。

このPlaybookの機能

このAnsibleプレイブックは、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04のガイドで説明されている手順を手動で実行する代わりに使用できます。 [Ubuntu 18.04にDockerをインストールして使用する方法]。

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

  1. `+ apt `パッケージマネージャーの代替としてAnsibleが好む ` aptitude +`をインストールします。

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

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

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

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

  6. `+ pip +`経由でPython Dockerモジュールをインストールします。

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

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

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

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

まず、https://github.com/do-community/ansible-playbooks/blob/master/docker/ubuntu1804.yml [playbook]のコンテンツをAnsible Control Nodeにダウンロードします。 便宜上、プレイブックの内容はlink:#the-playbook-contents [このガイドの次のセクション]にも含まれています。

コマンドラインからこのプレイブックをダウンロードするには、 `+ 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:
 default_container_name:
 default_container_image:
 default_container_command:
. . .

これらの変数の意味は次のとおりです。

  • + 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

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

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

プレイブックの実行が終了したら、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プレイブックは、https:// github内のhttps://github.com/do-community/ansible-playbooks/blob/master/docker/ubuntu1804.yml[ansible-playbooks repository]にあります。 .com / do-community [DigitalOcean Community GitHub組織]。 スクリプトの内容を直接コピーまたはダウンロードするには、スクリプトの上部にある* Raw *ボタンをクリックするか、https://raw.githubusercontent.com/do-community/ansible-playbooks/master/docker/ubuntu1804.yml [click生のコンテンツを直接表示するには、ここをクリックしてください]。

便利なように、すべての内容もここに含まれています。

docker ubuntu.yml

---
- hosts: all
 become: true
 vars:
   create_containers:
   default_container_name:
   default_container_image:
   default_container_command:

 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 }}

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

結論

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

このガイドでは、Ansibleを使用して、リモートサーバーにDockerをインストールおよびセットアップするプロセスを自動化する方法を示しました。 コンテナを操作するときは通常、個々のニーズが異なるため、https://docs.ansible.com/ansible/2.6/modules/docker_container_module.html#docker-container-module [Ansibleの公式ドキュメント]を確認することをお勧めします。 + docker_container + Ansibleモジュールの詳細とユースケース。

このプレイブックに他のタスクを含めてサーバーの初期セットアップをさらにカスタマイズする場合は、Ansibleの入門ガイドhttps://www.digitalocean.com/community/tutorials/configuration-management-101-writing-ansibleを参照してください-playbooks [構成管理101:Ansible Playbookの作成]。