ウェブサイト検索

複数のリモートサーバーで複雑なタスクを自動化するためのAnsibleプレイブックの使用方法 - 第2部


このAnsibleシリーズの前回の記事では、Ansibleがエージェントレスのツールであり、単一のシステムから複数のマシン(ノードとも呼ばれる)を迅速かつ効率的に管理し、デプロイメントを行うことができることを説明しました。

コントローラーマシンにソフトウェアをインストールし、パスワードなしでログインするためのキーを作成し、それらをノードにコピーした後は、Ansibleを使用してそのようなリモートシステムを管理するプロセスを最適化する方法を学ぶ時です。

この記事および次の記事では、以下のテスト環境を使用します。すべてのホストはCentOS 7ボックスです:


Controller machine (where Ansible is installed): 192.168.0.19
Node1: 192.168.0.29
Node2: 192.168.0.30

さらに、両方のノードがローカルの/etc/ansible/hostsファイルのウェブサーバーセクションに追加されたことにご注意ください。

それでは、さっそく本題に入りましょう。

Ansible プレイブックの紹介

前のガイドで説明したように、ansible ユーティリティを使用して、リモートノードでコマンドを実行することができます。次のように:


ansible -a "/bin/hostnamectl --static" webservers

上記の例では、node1とnode2でhostnamectl --staticを実行しました。このリモートコンピュータ上でのタスク実行方法は、短いコマンドには問題なく機能しますが、より複雑なタスクや他のサービスとの相互作用が必要な場合には、すぐに負担が大きくなったり、混乱を招いたりすることに気づくのに時間はかかりません。

例えば、複数のホストにWordPressを設定して構成すること – これはこのシリーズの次の記事で扱います。この場面でPlaybooksが登場します。

簡単に言うと、プレイブックはYAML形式で書かれたプレーンテキストファイルで、1つまたは複数のキー/値ペア(ハッシュまたは辞書としても知られています)を含む項目のリストが含まれています。

各プレイブックの中には、実行するべきタスクがあるホストのグループ(これらのグループはプレイとも呼ばれます)が1つ以上含まれています。

公式ドキュメントからの例が、私たちを説明するのに役立ちます:

1. ホスト: これは、次のタスクが実行されるマシンのリストです(/etc/ansible/hostsに従って)。

2. リモートユーザー: タスクを実行するために使用されるリモートアカウント。

3. vars: リモートシステムの動作を変更するために使用される変数。

4. タスクは、ホストに一致するすべてのマシンに対して、一度に1つずつ順番に実行されます。プレイ内では、すべてのホストが同じタスク指示を受け取ります。

特定のホストに対して異なる一連の関連タスクを実行する必要がある場合は、現在のプレイブック内に別のプレイを作成してください(言い換えれば、プレイの目的は特定のホストの選択を明確に定義されたタスクにマッピングすることです)。

その場合は、ホストのディレクティブを下部に追加してやり直すことで新しいプレイを始めてください:


---
- hosts: webservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
  remote_user: root
  tasks:
  - name: description for task1
    task1: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  - name: description for task1
    task2: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  handlers:
    - name: description for handler 1
      service: name=name_of_service state=service_status
- hosts: dbservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
…

5. ハンドラーは、各プレイのタスクセクションの最後でトリガーされるアクションであり、主にリモートシステムでサービスを再起動したり、再起動をトリガーしたりするために使用されます。


mkdir /etc/ansible/playbooks

そして、その中に以下の内容を持つapache.ymlという名前のファイルがあります:


---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: replace default index.html file
    copy: src=/static_files/index.html dest=/var/www/html/ mode=0644
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

次に、ディレクトリ /static_files を作成します:


mkdir /static_files

カスタム index.html ファイルを保存する場所:


<!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="utf-8"/>
 </script>
 </head>
 <body>
 <h1>Apache was started in this host via Ansible</h1><br>
<h2>Brought to you by linux-console.net</h2>
 </body>
 </html>

とはいえ、今はこのプレイブックを使用して、先に述べたタスクを実行する時です。Ansibleは各ホストごとにタスクを一つずつ処理し、そのタスクのステータスを報告します。


ansible-playbook /etc/ansible/playbooks/apache.yml

では、ブラウザを開いて192.168.0.29および192.168.0.30にアクセスするとどうなるか見てみましょう:

一歩進んで、node1とnode2でApacheを手動で停止して無効化しましょう:


systemctl stop httpd
systemctl disable httpd
systemctl is-active httpd
systemctl is-enabled httpd

もう一度実行してください、


ansible-playbook /etc/ansible/playbooks/apache.yml

今回は、各ホストでApacheウェブサーバーが起動され、有効化されたというタスクレポートです。

上記の例をAnsibleの力の一端として考えてください。少数のサーバーで実行する場合、これらは比較的簡単な作業ですが、数台(場合によっては何百台)のマシンで同じことを行う必要がある場合、非常に面倒で時間がかかることがあります。

要約

この記事では、Ansibleを使用して複数のリモートホストでコマンドを実行したり、複雑なタスクを同時に実行したりする方法について説明しました。公式ドキュメントやGitHubリポジトリには、ほぼ想像できるすべてのタスクを達成するためのAnsibleの使用方法に関する多くの例やガイドが提供されています。

リモートLinuxホストでAnsibleを使用してタスクを自動化し始めるにあたり、あなたの考えをお聞かせください。質問、コメント、提案も常に歓迎しますので、いつでも下のフォームを使ってご連絡ください。

関連記事: