AnsiblePlaybookを使用して複数のリモートサーバー上の複雑なタスクを自動化する方法-パート2


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

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

この記事と次の記事では、次のテスト環境を使用します。すべてのホストはCentOS7ボックスです。

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

さらに、ローカルの/ etc/ansible/hostsファイルのwebserversセクションに両方のノードが追加されていることに注意してください。

そうは言っても、目前のトピックから始めましょう。

AnsiblePlaybookの紹介

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

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

上記の例では、node1とnode2で hostnamectl --static を実行しました。リモートコンピューターでタスクを実行するこの方法は、短いコマンドでは問題なく機能しますが、さらに適切に構造化された構成パラメーターや他のサービスとの相互作用を必要とするより複雑なタスクでは、すぐに負担になったり面倒になったりする可能性があることに気付くのにそれほど時間はかかりません。

たとえば、複数のホストでのWordPressのセットアップと構成–これについてはこのシリーズの次の記事で説明します)。ここでPlaybookが登場します。

簡単に言うと、PlaybookはYAML形式で記述されたプレーンテキストファイルであり、1つ以上のキーと値のペア(「ハッシュ」または「辞書」とも呼ばれます)を持つアイテムのリストが含まれています。

各プレイブック内には、目的のタスクを実行するホストの1つ以上のグループ(これらのグループのそれぞれはプレイとも呼ばれます)があります。

公式ドキュメントの例は、次のことを説明するのに役立ちます。

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

2. remote_user:タスクの実行に使用されるリモートアカウント。

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

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

特定のホストに関連付けられたタスクの異なるセットを実行する必要がある場合は、現在のプレイブックに別のプレイを作成します(つまり、プレイの目的は、ホストの特定の選択を明確に定義されたタスクにマップすることです)。

その場合、下部にhostsディレクティブを追加して最初からやり直すことにより、新しいプレイを開始します。

---
- 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 Tecmint.com</h2>
 </body>
 </html>

そうは言っても、今度はこのプレイブックを使用して前述のタスクを実行します。 Ansibleは、ホストごとに1つずつタスクを実行し、そのようなタスクのステータスを報告することに注意してください。

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

次に、ブラウザを開いて192.168.0.29と192.168.0.30をポイントするとどうなるか見てみましょう。

さらに一歩進んで、ノード1とノード2でApacheを手動で停止して無効にします。

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

その後、もう一度実行します。

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

今回、タスクは、Apache Webサーバーが開始され、各ホストで有効になったことを報告します。

上記の例をAnsibleのパワーを垣間見るものと考えてください。これらは少数のサーバーで実行する場合は比較的簡単なタスクですが、複数(おそらく数百)のマシンで同じことを実行する必要がある場合は、非常に面倒で時間がかかる可能性があります。

概要

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

Ansibleを使用してリモートLinuxホストでタスクを自動化する方法を学び始めたら、私たちはあなたの考えを聞きたいと思います。質問、コメント、提案もいつでも歓迎しますので、いつでも以下のフォームを使用してお気軽にお問い合わせください。