Ubuntuでシステム構成を自動化するAnsibleプレイブックを作成する方法
ステータス:非推奨
この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。
理由:
Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.
代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。
序章
Ansibleは、コンピューターの大規模ネットワークのシステム構成タスクを自動化および整理するために使用できる簡単な構成管理システムです。 他のいくつかの構成管理システムでは、サーバーとクライアントシステムに多くの異なるパッケージをインストールする必要がありますが、Ansibleでは、サーバーコンポーネントをインストールし、クライアントマシンにSSHでアクセスするだけで済みます。
以前のガイドでは、Ansibleソフトウェアのインストール方法と基本的なコマンドについて説明しました。 このガイドでは、 Ansibleプレイブックについて説明します。これは、クライアントコンピューターを構成するための自動スクリプトを作成するAnsibleの方法です。
前回のチュートリアルで中断したように、構成済みのAnsibleサーバーといくつかのクライアントがあることを前提としています。 このガイドでは、サーバーはUbuntu 12.04マシンであり、説明を簡単にするために、構成するクライアントもUbuntu12.04マシンです。
Ansible Playbookとは何ですか?
Ansible Playbookは、スクリプト化された方法でリモートコンピューターにコマンドを送信する方法です。 Ansibleコマンドを個別に使用してコマンドラインからコンピューターをリモートで構成する代わりに、スクリプトを1つ以上のシステムに渡すことで複雑な環境全体を構成できます。
Ansible Playbookは、YAMLデータシリアル化形式で記述されています。 データのシリアル化形式がわからない場合は、プログラムによるデータ構造(リスト、配列、辞書など)をディスクに簡単に保存できる形式に変換する方法と考えてください。 このファイルを使用して、後で構造を再作成できます。 JSONも人気のあるデータシリアル化形式ですが、YAMLの方がはるかに読みやすくなっています。
各プレイブックには、ホストを特定の機能にマップする1つ以上のプレイが含まれています。 Ansibleは、基本的にモジュール呼び出しであるタスクと呼ばれるものを介してこれを行います。
基本的なプレイブックを探す
基本的なプレイブックを見てみましょう。
---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started
これらのファイルがどのように構築され、各部分が何を意味するのかを理解できるように、これをセクションに分けてみましょう。
ファイルは次で始まります:
---
これは、YAMLがファイルを適切なドキュメントとして解釈するための要件です。 YAMLでは、複数の「ドキュメント」を1つのファイルに存在させ、それぞれを---
で区切ることができますが、Ansibleではファイルごとに1つしか必要ないため、これはファイルの先頭にのみ存在する必要があります。
YAMLは空白に非常に敏感であり、それを使用してさまざまな情報をグループ化します。 タブではなくスペースのみを使用する必要があります。ファイルを正しく読み取るには、一定のスペースを使用する必要があります。 同じレベルのインデントのアイテムは、兄弟要素と見なされます。
-
で始まるアイテムは、リストアイテムと見なされます。 key: value
の形式のアイテムは、ハッシュまたは辞書として機能します。 基本的なYAMLについてはこれでほぼすべてです。
YAMLドキュメントは基本的に、階層ツリー構造を定義し、その左側に要素が含まれています。
2行目には、次のようなものがあります。
---
- hosts: droplets
これは、上記で学習したYAMLのリスト項目ですが、左端のレベルにあるため、Ansibleの「プレイ」でもあります。 プレイは基本的に、特定のホストセットで実行されるタスクのグループであり、ホストに割り当てたい機能を実行できるようにします。 ここで行うように、各プレイではホストまたはホストのグループを指定する必要があります。
次に、一連のタスクがあります。
---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
トップレベルには、「hosts:」と同じレベルの「tasks:」があります。 これには、キーと値のペアを含むリストが含まれています(「-」で始まるため)。
最初の「名前」は、名前というよりも説明です。 これは好きなように呼び出すことができます。
次の鍵は「apt」です。 これは、ansibleコマンドを使用して次のように入力する場合と同様に、Ansibleモジュールへの参照です。
ansible -m apt -a 'whatever' all
このモジュールを使用すると、パッケージとその状態(この場合は「インストール済み」)を指定できます。 update-cache=true
の部分は、ソフトウェアをインストールする前に、リモートマシンにパッケージキャッシュを更新するように指示します(apt-getupdate)。
「notify」アイテムには、「startnginx」と呼ばれる1つのアイテムを含むリストが含まれています。 これは内部のAnsibleコマンドではなく、タスク内から呼び出されたときに特定の機能を実行できるハンドラーへの参照です。 以下で「startnginx」ハンドラーを定義します。
---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started
「ハンドラー」セクションは、「ホスト」および「タスク」と同じレベルにあります。 ハンドラーはタスクと同じですが、クライアントシステムで変更が発生したことがタスクから通知された場合にのみ実行されます。
たとえば、パッケージのインストール後にNginxサービスを開始するハンドラーがここにあります。 「nginxWebサーバーのインストール」タスクによってシステムが変更されない限り、ハンドラーは呼び出されません。つまり、パッケージをインストールする必要があり、まだそこにありませんでした。
このプレイブックを「nginx.yml」のようなファイルに保存できます。
コンテキストによっては、これと同じファイルをJSONで作成すると、次のようになります。
[
{
"hosts": "droplets",
"tasks": [
{
"name": "Installs nginx web server",
"apt": "pkg=nginx state=installed update_cache=true",
"notify": [
"start nginx"
]
}
],
"handlers": [
{
"name": "start nginx",
"service": "name=nginx state=started"
}
]
}
]
ご覧のとおり、YAMLははるかにコンパクトで、ほとんどの人が読みやすいと言っています。
AnsiblePlaybookの実行
プレイブックを作成したら、次の形式を使用して簡単に呼び出すことができます。
ansible-playbook playbook.yml
たとえば、すべてのドロップレットにNginxをインストールして起動する場合は、次のコマンドを発行できます。
ansible-playbook nginx.yml
プレイブック自体が実行対象のホスト(つまり、前回のチュートリアルで作成した「ドロップレット」グループ)を指定しているため、実行対象のホストを指定する必要はありません。
ただし、ホストリストをフィルタリングしてこれらのホストの1つにのみ適用する場合は、ファイル内のホストのサブセットを指定するフラグを追加できます。
ansible-playbook -l host_subset playbook.yml
したがって、「host3」にNginxをインストールして実行するだけの場合は、次のように入力できます。
ansible-playbook -l host3 nginx.yml
プレイブックへの機能の追加
現在、プレイブックは次のようになっています。
---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started
シンプルで機能しますが、ソフトウェアをインストールして起動するだけです。 それ自体はあまり有益ではありません。
プレイブックにタスクを追加することで、機能の拡張を開始できます。
デフォルトのインデックスファイルを追加する
次のような行を追加することで、Ansibleサーバーからホストにファイルを転送するように指示できます。
- ホスト:ドロップレットタスク:
- 名前:nginx Webサーバーをインストールしますapt:pkg = nginx state = installed update_cache = true notify:start nginx
-名前:ホストコピーのデフォルトのindex.htmlをアップロードします:src = static_files / index.html dest = / usr / share / nginx / www / mode = 0644
ハンドラー:-名前:nginxサービスを開始します:name = nginxstate = start