他の言語でもお読みいただけます:
English、日本語、 Portugues do Brasil、 Française、 Español
この演習では、Ansible を使用して Red Hat Enterprise Linux 上に 2 つの Apache Web サーバーを構築します。この動画では、以下の Ansible の基礎を取り上げます。
- Ansible モジュールパラメーターについて
- 以下のモジュールの概要および使用
- べき等性 の概要および Ansible モジュールのべき等性について
Playbook は、管理ホストに実装する必要な設定または手順を記述するファイルです。Playbook は、長く複雑な管理タスクを、予測できる成功する結果で、簡単に繰り返し可能なルーチンに変更できます。
1 つの Playbook には複数のプレイを含めることができ、単一または複数のタスクを指定できます。1つのタスクでは、前章のモジュールのように module が呼び出されます。play の目的は、ホストのグループをマッピングすることです。task の目的は、それらのホストにモジュールを実装することです。
ヒント
良い例を紹介します。Ansible モジュールがワークショップでのツールであるとすれば、インベントリーは素材で、Playbook は指示書のようなものです。
Playbook は YAML 形式で記述されたテキストファイルなので、以下が必要になります。
-
3 つのダッシュ (
---
) で開始 -
タブではなく、スペースを使用した正しいインデント
重要な点を以下に示します。
-
hosts: タスクを実行する管理対象ホスト
-
tasks: Ansible モジュールを呼び出して必要なオプションを渡すことで実行される操作
-
become: Playbook における特権昇格
警告
Playbook 内のコンテンツの順序は、Ansible が提示された順序でプレイやタスクを実行するため重要です。
Playbook は 冪等 である必要があります。そのため、Playbook を 1 回実行してホストを正しい状態にできるのであれば、2 回目の実行でも安全であるため、ホストをさらに変更する必要はありません。
ヒント
多くの Ansible モジュールは冪等です。そのため、この作業は比較的簡単です。
実践的な説明に移ります。はじめての Ansible Playbook を作成してみましょう。このラボでは、以下の 3 つの手順で Apache Web サーバーをセットアップする Playbook を作成します。
- httpd のインストール
- httpd サービスの有効化と起動
- web.html ファイルを各 Web ホストにコピーします。
この Playbook により、Apache Web サーバーを含むパッケージが node1
にインストールされます。
Playbook に推奨されるディレクトリー構造についての ベストプラクティス があります。Ansible スキルを発展させるためにも、これらのプラクティスを読んで理解することをお勧めします。とはいえ、現在の Playbook は非常に基本的です。複雑な構造を作ると、混乱するだけです。
代わりに、Playbook 用に非常に簡単なディレクトリー構造を作成し、そこにいくつかのファイルを追加します。
コントロールホスト ansible で、ホームディレクトリーに ansible-files
というディレクトリーを作成し、そのディレクトリーにディレクトリーを変更します。
[student@ansible-1 ~]$ mkdir ansible-files
[student@ansible-1 ~]$ cd ansible-files/
以下の内容の apache.yml
というファイルを追加します。前回の演習でも説明したように、vi
/vim
を使います。あるいは、コマンドラインのエディターになれていない場合は、エディター紹介 を参照してください。
---
- name: Apache server installed
hosts: node1
become: yes
これは、Ansible の強みの 1 つである、Playbook 構文が読みやすく、理解しやすいという特徴を示しています。この Playbook では以下のような特徴があります。
name:
からのプレイ用に名前が指定されます。- Playbook を実行するホストは、
hosts:
で定義します。 become:
でユーザー特権昇格を有効にします。
ヒント
特権昇格は、パッケージのインストールや、root パーミッションが必要な他のタスクの実行に必要です。これは
become: yes
で、Playbook で行います。
プレイは定義できました。次は、何か実行するタスクを追加してみましょう。Apache パッケージが最新バージョンでインストールされていることを yum が確認するタスクを追加します。以下のようにファイルを変更します。
---
- name: Apache server installed
hosts: node1
become: yes
tasks:
- name: latest Apache version installed
yum:
name: httpd
state: latest
ヒント
Playbook は YAML で記述されているため、行やキーワードを調整することが重要になります。
task
の t は、become
の b に垂直にそろえるようにしてください。Ansible に慣れてきたら、YAML 構文 を勉強するとよいでしょう。
追加した行:
tasks:
というキーワードでタスクの一部を開始しました。- タスクには名前が付けられ、タスクのモジュールが参照されます。ここでは、
yum
モジュールを使用します。 - モジュールのパラメーターが追加されます。
- パッケージ名を識別する
name:
- パッケージの必要状態を定義する
state:
- パッケージ名を識別する
ヒント
モジュールパラメーターは、各モジュールに個別で指定します。不明な場合は、
ansible-doc
で再度確認します。
Playbook を保存し、エディターを終了します。
Ansible Automation Platform 2 の導入に伴い、開発者の体験全体の一部として、いくつかの新しいキーコンポーネントが導入されています。実行環境は、オートメーションの実行時に使用する予測可能な環境を提供するために導入されました。すべてのコレクションの依存関係は実行環境に含まれ、開発環境で作成されたオートメーションが本番環境と同じように実行されることを確実にしています。
実行環境内で何が見つかるものについて
- RHEL UBI 8
- Ansible 2.9 または Ansible Core 2.11
- Python 3.8
- コンテンツコレクションについて
- Python またはバイナリーの依存関係のコレクション。
実行環境について
オートメーションが実行される環境を定義、構築、配布するための標準的な方法を提供します。一言で言えば、オートメーションの実行環境とは、プラットフォームの管理者が Ansible の管理を容易にするためのコンテナイメージです。
自動化の実行がコンテナー化されていくことを考えると、Ansible Automation Platform 2 以前に存在していた自動化開発のワークフローやツールは、再構築する必要があります。つまり、ansible-navigator
は、ansible-playbook
やその他のansible-*
コマンドラインユーティリティーに取って代わります。
この変更により、Ansible Playbook はコントロールノードの ansible-navigator
コマンドを使用して実行されます。
ansible-navigator
を使用するための前提条件およびベストプラクティスが、このラボで行われています。
これらには以下が含まれます。
ansible-navigator
パッケージのインストール- 全プロジェクトに対するデフォルト設定
/home/student/.ansible-navigator.yml
の作成(オプション) - すべての実行環境(EE)ログは
/home/student/.ansible-navigator/logs/ansible-navigator.log
内に保存されます - Playbook アーティファクトは
/tmp/artifact.json
下に保存されます
Ansible ナビゲーター設定 の詳細
ヒント
ansible-navigato rのパラメーターは、ユーザーの環境に合わせて変更することができます。現在の設定では、すべてのプロジェクトにデフォルトのansible-navigator.yml
を使用していますが、プロジェクトごとに特定のansible-navigator.yml
を作成することができ、これは推奨される方法です。
Playbook を実行するには、ansible-navigator run <playbook>
コマンドを使用します。
[student@ansible-1 ansible-files]$ ansible-navigator run apache.yml
ヒント
既存のansible-navigator.yml
ファイルでは、インベントリファイルの場所が指定されています。これがansible-navigator.yml
ファイル内で設定されていない場合、プレイブックを実行するコマンドは次のようになります。 ansible-navigator run apache.yml -i /home/student/lab_inventory/hosts
Playbook の実行時に、現在実行中の Playbook に関する他の情報間でプレイ名を表示するテキストユーザーインターフェース(TUI)が表示されます。
PLAY NAME OK CHANGED UNREACHABLE FAILED SKIPPED IGNORED IN PROGRESS TASK COUNT PROGRESS
0│Apache server installed 2 1 0 0 0 0 0 2 COMPLETE
お気づきかもしれませんが、play 名 Apache server installed
の前に0
が表示されています。キーボードの 0
キーを押すと、Playbook 完了までに実行されたさまざまなタスクを表示する新しいウィンドウビューが表示されます。この例では、「Gathering Facts」と「latest Apache version installed」のタスクが表示されています。「Gathering Facts」は、各 play の開始時に自動的に実行されるビルトインタスクです。管理対象のノードに関する情報を収集します。この後の演習では、これについて詳しく説明します。「latest Apache version installed」は、apache.yml
ファイル内に作成されたタスクで、httpd
をインストールするものでした。
表示は以下のようになります。
RESULT HOST NUMBER CHANGED TASK TASK ACTION DURATION
0│OK node1 0 False Gathering Facts gather_facts 1s
1│OK node1 1 True latest Apache version installed yum 4s
よく見ると、各タスクには番号がついています。タスク1の「latest Apache version installed」は、変更があり、yum
モジュールを使用しています。この場合の変更点は、ホストnode1
に Apache (httpd
パッケージ) をインストールしたことです。
キーボードで0
または1
を押すと、実行中のタスクの詳細を見ることができます。より伝統的な出力表示が必要な場合は、テキストユーザーインターフェースで :st
と入力してください。
Ansible Playbook を確認してから、キーボードの Esc キーを使用して TUI から終了できます。
ヒント
Esc キーは前の画面に戻るだけです。メインの概要画面でEscキーを押すと、ターミナルウィンドウに戻ります。
Playbook が完了したら、SSH で node1
に接続し、Apache がインストールされていることを確認します。
[student@ansible-1 ansible-files]$ ssh node1
Last login: Wed May 15 14:03:45 2019 from 44.55.66.77
Managed by Ansible
rpm -qi httpd
コマンドを使用して、httpd がインストールされていることを確認します。
[ec2-user@node1 ~]$ rpm -qi httpd
Name : httpd
Version : 2.4.37
[...]
コントロールホストに戻るように exit
コマンドで node1
からログアウトし、package.ymlと名前を付けたAnsible Playbookを作成、実行し、インストールしたパッケージを確認します。
{% raw %}
---
- name: Check packages
hosts: node1
become: true
vars:
package: "httpd"
tasks:
- name: Gather the package facts
ansible.builtin.package_facts:
manager: auto
- name: Check whether a {{ package }} is installed
ansible.builtin.debug:
msg: "{{ package }} {{ ansible_facts.packages[ package ][0].version }} is installed!"
when: "package in ansible_facts.packages"
{% endraw %}
[student@ansible-1 ~]$ ansible-navigator run package.yml -m stdout
PLAY [Check packages] **********************************************************
TASK [Gathering Facts] *********************************************************
ok: [ansible]
TASK [Gather the package facts] ************************************************
ok: [ansible]
TASK [Check whether a httpd is installed] *************************************
ok: [ansible] => {
"msg": "httpd 2.4.37 is installed!"
}
PLAY RECAP *********************************************************************
ansible : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible-navigator run apache.yml
Playbook を 2 回ずつ実行し、出力を比較します。出力「CHANGED」には 1
ではなく 0
が表示され、色が黄色から緑色に変更されます。これにより、Ansible Playbook の実行時に変更が生じると、その変更を簡単に配置できるようになります。
Ansible Playbook の次の部分では、Apache アプリケーションが node1
で有効化されて起動するようにします。
コントロールホストで、~/ansible-files/apache.yml
を編集し、service
モジュールを使用して 2 番目のタスクを追加します。実際の Playbook は以下のようになります。
---
- name: Apache server installed
hosts: node1
become: yes
tasks:
- name: latest Apache version installed
yum:
name: httpd
state: latest
- name: Apache enabled and running
service:
name: httpd
enabled: true
state: started
何を行ったのでしょうか?
- 「Apache enabled and running」という名前の 2 番目のタスクが作成されます。
- モジュールが指定されます (
service
) - モジュール
service
はサービス名 (httpd
) を取ります。これを永続的に設定する必要がある場合は(enabled
)、および現在の状態 (started
) を使用します。
つまり、2 番目のタスクにより、Apache サーバーがターゲットマシンで実行されるようにしています。拡張 Playbook を実行します。
[student@ansible-1 ~]$ ansible-navigator run apache.yml
この出力では、プレイに 1
"CHANGED" が表示されますが、0
を押してプレイの出力に入ることができます。そのタスク 2「Apache enabled and running」は、"CHANGED" 値が True に設定され、黄色でで強調表示されているタスクでした。
-
出力内の変更に慣れるためにも、
ansible-navigator
を使用して Playbook を再び実行してみてください。 -
service_state.yml と名前を付けた Ansible Playbook を作成、実行し、
node1
上で Apache(httpd)サービスが実行されていることを確認します(systemctl status httpd
と同じように)。
{% raw %}
---
- name: Check Status
hosts: node1
become: true
vars:
package: "httpd"
tasks:
- name: Check status of {{ package }} service
service_facts:
register: service_state
- debug:
var: service_state.ansible_facts.services["{{ package }}.service"].state
{% endraw %}
[student@ansible-1 ~]$ ansible-navigator run service_state.yml
タスクが正しく実行され、Apache が接続を受け入れることを確認します。 Ansible の uri
モジュールを使用して、コントロールノードから node1
に HTTP リクエストを作成する、check_httpd.yml という名前の Playbook を作成、実行します。
{% raw %}
---
- name: Check URL
hosts: control
vars:
node: "node1"
tasks:
- name: Check that you can connect (GET) to a page and it returns a status 200
uri:
url: "http://{{ node }}"
{% endraw %}
警告
赤い行と 403 ステータスが多く表示されます。
[student@ansible-1 ~]$ ansible-navigator run check_httpd.yml -m stdout
赤い行やエラーが多く表示されます。Apache によって提供される web.html
ファイルがなければ、「HTTP Error 403: Forbidden」ステータスが表示され、Ansible はエラーを報告します。
では、Ansible を使用してシンプルな web.html
ファイルをデプロイしてはどうでしょうか。ansible コントロールホストで、student
ユーザーとして ~/ansible-files/
にファイルリソースを保持するディレクトリー files
を作成します。
[student@ansible-1 ansible-files]$ mkdir files
次に、コントロールノードに ~/ansible-files/files/web.html
ファイルを作成します。
<body>
<h1>Apache は正常に動作しています</h1>
</body>
以前の例では、Ansible の copy
モジュールを使用してコマンドラインに出力されたテキストをファイルに書き込みました。次は、Playbook でモジュールを使用してファイルをコピーします。
コントロールノードで、ファイル ~/ansible-files/apache.yml
を編集して、copy
モジュールを使用して新しいタスクを追加します。以下のようになります。
---
- name: Apache server installed
hosts: node1
become: yes
tasks:
- name: latest Apache version installed
yum:
name: httpd
state: latest
- name: Apache enabled and running
service:
name: httpd
enabled: true
state: started
- name: copy web.html
copy:
src: web.html
dest: /var/www/html/index.html
この新しいコピータスクで何が起きるのでしょうか。この新しいタスクは、copy
モジュールを使用し、コピー操作のソースオプションおよび宛先オプションをパラメーターとして定義します。
拡張 Playbook を実行します。
[student@ansible-1 ansible-files]$ ansible-navigator run apache.yml -m stdout
-
出力を確認し、「CHANGED」と、その変更に関連するタスクが変更されたことに注意してください。
-
上記の「uri」モジュールを再度使用して playbook (check_httpd.yml) を実行し、Apache をテストします。これで、このコマンドは、その他の情報とともに正常の「status: 200」の行が返されるはずです。
上記では、特定のホストに変更を加えることを簡単に説明しました。では、多くのホストに変更を加えたい場合はどうでしょうか。ここで Ansible の真価が発揮されます。Ansible は、同じタスクセットを多くのホストに確実に適用します。
- そのため、
node1
とnode2
とnode3
で実行するように apache.yml Playbook を変更するのはどうでしょうか。
覚えているとおもいますが、インベントリーは、すべてのノードをグループ web
のメンバーとして一覧表示します。
[web]
node1 ansible_host=11.22.33.44
node2 ansible_host=22.33.44.55
node3 ansible_host=33.44.55.66
ヒント
こちらに表示される IP アドレスは例です。実際のノードの IP アドレスは異なります。
Playbook の hosts
パラメーターを、node1
ではなく web
を参照するように変更します。
---
- name: Apache server installed
hosts: web
become: yes
tasks:
- name: latest Apache version installed
yum:
name: httpd
state: latest
- name: Apache enabled and running
service:
name: httpd
enabled: true
state: started
- name: copy web.html
copy:
src: web.html
dest: /var/www/html/index.html
次に Playbook を実行します。
[student@ansible-1 ansible-files]$ ansible-navigator run apache.yml -m stdout
Apache がすべての Web サーバー(node1、node2、node3)で実行されているかどうかを確認します。すべての出力が緑色である必要があります。
ナビゲーション
{% if page.url contains 'ansible_rhel_90' %}
Previous Exercise - Next Exercise
{% else %}
Previous Exercise - Next Exercise
{% endif %}
Click here to return to the Ansible for Red Hat Enterprise Linux Workshop