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サーバーからホストにファイルを転送するように指示できます。
- ホスト:ドロップレットタスク:
-名前:ホストコピーのデフォルトのindex.htmlをアップロードします:src = static_files / index.html dest = / usr / share / nginx / www / mode = 0644
ハンドラー:-名前:nginxサービスを開始します:name = nginxstate = start
次に、現在のディレクトリにstatic_files
というディレクトリを作成し、その中にindex.htmlファイルを配置します。
mkdir static_files nano static_files/index.html
このファイルの中に、基本的なhtml構造を作成しましょう。
<html> <head> <title>This is a sample page</title> </head> <body> <h1>Here is a heading!</h1> <p>Here is a regular paragraph. Wow!</p> </body> </html>
ファイルを保存して閉じます。
これで、プレイブックを再実行すると、Ansibleが各タスクをチェックします。 Nginxがすでにホストにインストールされていることがわかるので、そのままにしておきます。 新しいタスクセクションが表示され、デフォルトのindex.htmlファイルがサーバーのものに置き換えられます。
結果の登録
サービスを手動でインストールおよび構成する場合、ほとんどの場合、アクションが成功したかどうかを知る必要があります。 「登録」を使用して、この機能をプレイブックに組み込むことができます。
タスクごとに、オプションでその結果(失敗または成功)を変数に登録して、後で確認することができます。
この機能を使用する場合は、Ansibleにそのタスクのエラーを無視するように指示する必要があります。これは、通常、問題が発生した場合にそのホストのプレイブックの実行を中止するためです。
したがって、タスクが失敗したかどうかを確認して後続のステップを決定する場合は、登録機能を使用できます。
たとえば、プレイブックにindex.php
ファイルが存在する場合はアップロードするように指示できます。 そのタスクが失敗した場合は、代わりにindex.html
ファイルのアップロードを試みることができます。 PHPファイルが失敗した場合にのみHTMLファイルをアップロードしたいので、他のタスクで失敗状態をチェックします。
ホスト:液滴タスク:
- 名前:nginx Webサーバーをインストールしますapt:pkg = nginx state = installed update_cache = true notify:
-名前:ホストコピーのデフォルトのindex.phpをアップロードします:src = static_files / index.php dest = / usr / share / nginx / www / mode = 0644 register:php ignore_errors:True
-名前:ホストコマンドのindex.htmlを削除します:rm /usr/share/nginx/www/index.html when:php | success
- 名前:ホストコピーのデフォルトのindex.htmlをアップロードします:src = static_files / index.html dest = / usr / share / nginx / www / mode = 0644 when:php | failed
ハンドラー:
- 名前:nginxサービスを開始します:name = nginxstate = start
- 名前:nginx Webサーバーをインストールしますapt:pkg = nginx state = installed update_cache = true notify:
注:現時点では、PHPファイルを処理するようにホストを構成していないため、PHPファイルをアップロードしても、正しく処理されません。
この新しいバージョンは、PHPインデックスファイルをホストにアップロードしようとします。 操作の成功を「php」と呼ばれる変数に登録します。
この操作が成功した場合は、次にindex.htmlファイルを削除するタスクが実行されます。
操作が失敗した場合は、代わりにindex.htmlファイルがアップロードされます。
結論
これで、Ansibleを使用して複雑なタスクを自動化する方法をうまく理解できるはずです。 これは、構成ライブラリの構築を開始する方法の基本的な例です。
最初のチュートリアルで学習したホストとグループの定義を組み合わせ、利用可能な変数を使用して情報を入力することで、相互に作用する複雑なコンピューターシステムを組み立て始めることができます。 今後の記事では、変数をプレイブックに実装し、複雑なタスクの管理に役立つ役割を作成する方法について説明します。