複数のリモートサーバーで複雑なタスクを自動化するための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を使用してタスクを自動化し始めるにあたり、あなたの考えをお聞かせください。質問、コメント、提案も常に歓迎しますので、いつでも下のフォームを使ってご連絡ください。






