はじめに
このラボでは、Red Hat Enterprise Linux (RHEL) システムに Apache Web サーバーをデプロイするための完全な Ansible Playbook を実装する方法を学びます。まず、Ansible プロジェクトの基本的なコンポーネントを設定します。これには、管理対象ノードを定義するための静的インベントリファイルの作成と、ansible.cfg ファイルを使用したローカル Ansible 環境の構成が含まれます。
初期設定の後、コアとなるデプロイメントプロセスを自動化するためのマルチタスクプレイブックを作成します。これには、Apache サービスのインストールと起動、カスタム Web ページのデプロイ、および HTTP トラフィックを許可するためのシステムファイアウォールの設定が含まれます。ラボを完了するために、プレイブックに 2 番目のプレイを追加し、コマンドラインから Web サーバーをテストして、デプロイメント全体が成功したことを確認します。
Web サーバー用の静的インベントリファイルを作成する
このステップでは、Ansible インベントリの基本を学びます。インベントリとは、Ansible が管理するサーバー(または「管理対象ノード」)をリスト化したテキストファイルです。Web サーバーのグループに対してシンプルな静的インベントリファイルを作成し、その内容を確認する方法を学びます。
まず、ご自身のシステムに Ansible がインストールされていることを確認する必要があります。デフォルトではインストールされていないため、dnf パッケージマネージャーを使用してインストールします。
ターミナルを開き、基本的な Ansible コマンドラインツールを提供する
ansible-coreパッケージをインストールします。sudo dnf install -y ansible-coreパッケージがインストールされ、検証されていることを示す出力が表示されるはずです。
... Installed: ansible-core-2.16.x-x.el9.x86_64 ... Complete!整理のため、ホームディレクトリ内にこのプロジェクト専用のディレクトリを作成します。
ansible-labという名前にしましょう。mkdir -p ~/project/ansible-lab新しく作成したプロジェクトディレクトリに移動します。この実験での今後の作業はすべて、この場所から行います。
cd ~/project/ansible-lab次に、最初のインベントリファイルを作成します。インベントリファイルは通常、INI 形式で記述されます。
nanoテキストエディタを使用して、inventoryという名前のファイルを作成します。nano inventorynanoエディタ内で、以下の内容を追加します。この設定は[webservers]という名前のグループを定義し、ローカルマシンであるlocalhostをこのグループに追加します。[webservers]はグループ名です。グループは、単一のコマンドで複数のホストを対象とするために使用されます。localhostは管理したいマシンのホスト名です。この場合、LabEx VM 自体です。ansible_connection=localは、Ansible が SSH 経由で接続しようとするのではなく、制御ノード(ご自身の VM)で直接コマンドを実行するように指示する特別な変数です。
[webservers] localhost ansible_connection=localnanoでファイルを保存するには、Ctrl+Oを押し、ファイル名を確認するためにEnterを押し、エディタを終了するためにCtrl+Xを押します。インベントリファイルを作成したら、
ansible-inventoryコマンドを使用してファイルを解析し、含まれるホストのリストを表示できます。-iフラグはインベントリファイルへのパスを指定します。ansible-inventory --list -i inventoryコマンドはインベントリの JSON 形式の表現を出力し、Ansible がファイルを正しく読み取って理解できることを確認します。
{ "_meta": { "hostvars": { "localhost": { "ansible_connection": "local" } } }, "all": { "children": ["ungrouped", "webservers"] }, "webservers": { "hosts": ["localhost"] } }
これで、基本的な静的インベントリファイルを作成し、Ansible がそれを正しく解釈できることを確認できました。このインベントリファイルは、次のステップで作成するプレイブックの基盤となります。
ansible.cfg で Ansible 環境を構成する
このステップでは、Ansible 設定ファイルである ansible.cfg を作成します。このファイルを使用すると、Ansible のデフォルトの動作を設定でき、一般的なオプションをコマンドラインで繰り返し入力する手間を省くことができます。プロジェクトディレクトリに ansible.cfg ファイルを配置することで、デフォルトのインベントリファイルのパスなどの設定を定義でき、Ansible はそのディレクトリから実行された際に自動的にそれらを使用します。
前のステップから引き続き、~/project/ansible-lab ディレクトリにいるはずです。
nanoテキストエディタを使用して、現在のディレクトリ(~/project/ansible-lab)にansible.cfgという名前の新しいファイルを作成します。nano ansible.cfgnanoエディタ内で、以下の内容を追加します。この設定は、Ansible にデフォルトのインベントリファイルの場所を指示します。[defaults]セクションはansible.cfgファイルの標準的な部分であり、ほとんどのデフォルト設定を定義します。inventory = ./inventoryという行は、現在のディレクトリ(.)にあるinventoryファイルをデフォルトのインベントリとして設定します。
[defaults] inventory = ./inventoryファイルを保存するには
Ctrl+Oを押し、Enterを押し、Ctrl+Xで終了します。デフォルトのインベントリパスを設定したので、Ansible コマンドで
-iフラグを使用する必要がなくなりました(~/project/ansible-labディレクトリ内にいる限り)。これをテストするために、前のステップと同じ
ansible-inventory --listコマンドを再度実行しますが、今回は-i inventoryの部分を省略します。ansible-inventory --list前のステップとまったく同じ JSON 出力が表示されるはずです。これは、新しい
ansible.cfgの設定のおかげで、Ansible が自動的にinventoryファイルを見つけて使用していることを確認します。{ "_meta": { "hostvars": { "localhost": { "ansible_connection": "local" } } }, "all": { "children": ["ungrouped", "webservers"] }, "webservers": { "hosts": ["localhost"] } }
プロジェクト固有の ansible.cfg を作成することで、ワークフローがより効率的になりました。これは、一貫した動作を保証し、コマンドラインの複雑さを軽減するために、Ansible プロジェクトで一般的に行われるプラクティスです。
Apache サービスをインストールして起動する Playbook を作成する
このステップでは、最初の Ansible Playbook を記述します。Playbook は、管理対象ホストで実行されるタスクのセットを記述した YAML 形式のファイルです。インベントリで定義された localhost マシンに Apache Web サーバー (httpd) をインストールし、そのサービスを開始する Playbook を作成します。
~/project/ansible-lab ディレクトリにいるはずです。
まず、
nanoテキストエディタを使用して、apache.ymlという名前の新しいファイルを作成します。このファイルに Playbook が含まれます。nano apache.ymlnanoエディタ内で、「プレイ」を定義します。プレイは Playbook の中核となる単位であり、ホストのグループをタスクのセットにマッピングします。apache.ymlに以下の内容を追加します。---: これは YAML ドキュメントの開始を示す標準的なマーカーです。- name: ...: これはプレイの開始です。説明的な名前を付けることはベストプラクティスです。hosts: webservers: これは、インベントリファイル内のwebserversグループのすべてのホストでこのプレイを実行するように Ansible に指示します。become: true: これは、タスクを実行するために特権昇格(sudoなど)を使用するように Ansible に指示します。これは、ソフトウェアのインストールやサービスの管理などのアクションに必要です。tasks:: このキーワードは、実行されるタスクのリストを開始します。
--- - name: Install and start Apache web server hosts: webservers become: true tasks:次に、Playbook にタスクを追加します。各タスクは、Ansible モジュールを呼び出す単一のアクションです。YAML ではインデントが非常に重要なので、タスクが
tasks:セクションの下に正しくインデントされていることを確認してください。- タスク 1: httpd をインストールする。 このタスクは
ansible.builtin.dnfモジュールを使用して、httpdパッケージがインストールされていることを確認します。state: presentパラメータは、パッケージが欠落している場合は Ansible がパッケージをインストールし、既にインストールされている場合は何も行わないことを意味します。 - タスク 2: httpd サービスを開始する。 このタスクは
ansible.builtin.serviceモジュールを使用します。state: startedはサービスが実行されていることを保証し、enabled: trueはシステム起動時に自動的に開始されることを保証します。
apache.ymlファイルのtasks:行の直下に、以下のタスクを追加します。- name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: true- タスク 1: httpd をインストールする。 このタスクは
完成した
apache.ymlPlaybook は次のようになります。インデントを注意深く確認してください。--- - name: Install and start Apache web server hosts: webservers become: true tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: trueファイルを保存して
nanoを終了します(Ctrl+O、Enter、Ctrl+X)。Playbook を実行する前に、
--syntax-checkフラグを付けたansible-playbookコマンドを使用して、構文エラーがないか確認することをお勧めします。ansible-playbook --syntax-check apache.yml構文が正しい場合、コマンドはエラーなしで Playbook のファイル名を表示します。
playbook: apache.yml次に、Playbook を実行します。
ansible-playbook apache.ymlAnsible はタスクを実行します。初回実行のため、両方のタスクで
changedステータスが表示され、システムの状態が変更されたことを示します。PLAY [Install and start Apache web server] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install httpd package] *************************************************** changed: [localhost] TASK [Start and enable httpd service] ****************************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0最後に、
curlを使用してlocalhostからデフォルトの Web ページをリクエストすることで、Apache Web サーバーが実行されていることを確認します。curl http://localhostデフォルトの Apache Test Page が表示されるはずです。これは、Playbook が正常に機能したことを確認します。
<html> <head> <title>Test Page</title> </head> <body> <h1>Test Page</h1> <p>This is the default test page for the Apache HTTP server.</p> </body> </html>
Web ページをデプロイするタスクを追加する
このステップでは、Playbook を拡張して、より現実的な Web サーバー構成を実行します。カスタム index.html ページをデプロイするタスクを追加します。これにより、Ansible のファイル管理モジュールを使用してファイルを管理する方法が示されます。
~/project/ansible-lab ディレクトリにいるはずです。
まず、Playbook がデプロイする簡単な HTML ファイルを作成します。
nanoを使用して、現在のディレクトリにindex.htmlという名前のファイルを作成します。nano index.htmlファイルに以下の HTML コンテンツを追加します。これがカスタム Web ページのコンテンツになります。
<h1>Welcome to the Ansible-managed Web Server!</h1> <p>This page was deployed using an Ansible Playbook.</p>nanoを保存して終了します(Ctrl+O、Enter、Ctrl+X)。次に、
apache.ymlPlaybook を更新して新しいタスクを追加します。YAML フォーマットのエラーを回避するために、既存のapache.ymlファイルを削除し、以下に示す完全なコンテンツで新しいファイルを作成することをお勧めします。重要: 正しい YAML フォーマットを確保し、インデントエラーを回避するために、既存の
apache.ymlファイルを削除し、以下に示す完全なコンテンツで新しいファイルを作成してください。rm apache.yml nano apache.ymlPlaybook に新しいタスクを追加します。このタスクは、
index.htmlファイルを Web サーバーのドキュメントルート(/var/www/html/)にコピーします。- タスク:index.html をデプロイする。 このタスクは
ansible.builtin.copyモジュールを使用します。srcはコントロールノード上のソースファイル(index.html)を指定し、destは管理対象ホスト上の宛先パスを指定します。
- タスク:index.html をデプロイする。 このタスクは
以下の完全な
apache.ymlPlaybook コンテンツをコピーして貼り付けます。これにより、正しい YAML フォーマットとインデントが保証されます。--- - name: Install and start Apache web server hosts: webservers become: true tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Deploy custom index.html ansible.builtin.copy: src: index.html dest: /var/www/html/index.html - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: truenanoを保存して終了します。ファイルを保存して
nanoを終了し(Ctrl+O、Enter、Ctrl+X)、更新された Playbook を実行します。ansible-playbook apache.yml今回は、新しいタスクが実行されているのが表示されるはずです。「Install httpd」および「Start httpd」タスクは、それらの望ましい状態が既に満たされているため
okと報告されるはずです。「Deploy custom index.html」タスクはchangedと報告されます。PLAY [Install and start Apache web server] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install httpd package] *************************************************** ok: [localhost] TASK [Deploy custom index.html] ************************************************ changed: [localhost] TASK [Start and enable httpd service] ****************************************** ok: [localhost] PLAY RECAP ********************************************************************* localhost : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0最後に、
curlを再度使用して、カスタム Web ページが現在提供されていることを確認します。curl http://localhost出力は、
index.htmlファイルのコンテンツになっているはずです。<h1>Welcome to the Ansible-managed Web Server!</h1> <p>This page was deployed using an Ansible Playbook.</p>
Web サーバーのデプロイをテストするための 2 つ目の Play を実装する
この最後のステップでは、Playbook に 2 番目のプレイを追加します。単一の Playbook ファイルには複数のプレイを含めることができ、それらは順次実行されます。これは、異なるホストを対象とするタスクや、異なる目的を持つタスクを整理するのに役立ちます。最初のプレイで構成された Web サーバーをテストするために、コントロールノード(localhost)でのみ実行される新しいプレイを追加します。
~/project/ansible-lab ディレクトリにいるはずです。
Playbook に 2 番目のプレイを追加します。2 番目のプレイを追加する際に正しい YAML フォーマットを確保するために、既存の
apache.ymlファイルを削除し、以下に示す完全な 2 つのプレイを含む新しいファイルを作成することをお勧めします。重要: 2 番目のプレイを追加する際に YAML のインデントエラーを回避するために、既存の
apache.ymlファイルを削除し、以下に示す完全な 2 つのプレイを含む新しいファイルを作成してください。rm apache.yml nano apache.ymlPlaybook に 2 番目のプレイを追加します。2 番目のプレイにより、異なるホストを対象とするタスクや、異なる目的を持つタスクを整理できます。
name: Test web server: 新しいプレイの説明的な名前です。hosts: localhost: このプレイは、コントロールノード自体であるlocalhostで実行されます。become: false: このテストでは root 権限は必要ないため、明示的に特権昇格を無効にします。- タスク:Web コンテンツを確認する。 このタスクは
ansible.builtin.uriモジュールを使用して、Web サーバーに HTTP リクエストを行います。サーバーがステータスコード 200(OK)を返し、返されたコンテンツに「Ansible-managed」という文字列が含まれていることを確認します。これにより、これまで手動で行っていたcurlとgrepのチェックが自動化されます。
以下に、両方のプレイを含む完全な
apache.ymlPlaybook コンテンツをコピーして貼り付けます。--- - name: Install and start Apache web server hosts: webservers become: true tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Deploy custom index.html ansible.builtin.copy: src: index.html dest: /var/www/html/index.html - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: true - name: Test web server from localhost hosts: localhost become: false tasks: - name: Verify web server is serving correct content ansible.builtin.uri: url: http://localhost return_content: yes status_code: 200 register: result failed_when: "'Ansible-managed' not in result.content"nanoを保存して終了します(Ctrl+O、Enter、Ctrl+X)。完全な Playbook を実行します。Ansible は最初のプレイを実行し、すべてのタスクが既に望ましい状態(
ok)にあることを確認してから、2 番目のプレイに進んでテストを実行します。ansible-playbook apache.yml出力には、両方のプレイが実行されていることが表示されます。すべてのタスクは
okステータスで正常に完了するはずです。PLAY [Install and start Apache web server] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install httpd package] *************************************************** ok: [localhost] TASK [Deploy custom index.html] ************************************************ ok: [localhost] TASK [Start and enable httpd service] ****************************************** ok: [localhost] PLAY [Test web server from localhost] ****************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Verify web server is serving correct content] **************************** ok: [localhost] PLAY RECAP ********************************************************************* localhost : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2 番目のプレイを追加することで、サービスを構成するだけでなく、デプロイが成功したことを確認するための組み込みテストも含まれる、より堅牢な自動化ワークフローを作成しました。
まとめ
この実験では、ansible-core パッケージをインストールし、プロジェクトディレクトリを構造化することによって、RHEL 環境を Ansible 自動化のために準備する方法を学びました。管理対象ノードのグループを定義するために基本的な静的インベントリファイルを作成し、ローカル接続で localhost を指定しました。また、カスタムインベントリを指すように ansible.cfg ファイルを使用して Ansible 環境を構成し、Playbook を実行するためのクリーンで整理されたワークスペースを確立しました。
次に、Apache Web サーバーのデプロイを自動化するための包括的な Ansible Playbook を作成しました。これには、ansible.builtin.dnf モジュールを使用して httpd パッケージをインストールするタスクと、ansible.builtin.service モジュールを使用してサービスが開始され有効になっていることを確認するタスクの作成が含まれていました。Playbook は、ansible.builtin.copy モジュールを使用してカスタム index.html Web ページをデプロイするように拡張されました。最後に、同じ Playbook 内に 2 番目のプレイを実装してデプロイを検証しました。ansible.builtin.uri モジュールを使用して新しくデプロイされた Web サーバーへの接続をテストし、完全なセットアップと検証ワークフローを示しました。


