Ubuntu 14.04でAnsibleを使用してApacheを構成する方法

前書き

  • Apache *は、現在インターネットで使用されている最も人気のあるWebサーバーの1つです。 UbuntuやDebianなどのLinuxディストリビューションでは、パッケージリポジトリに含まれており、すぐに使用できるデフォルトの構成が含まれているため、セットアップと構成が簡単です。

  • Ansible *は、システムにリモートで構成し、ソフトウェアをインストールし、各サーバーに手動でログインすることなく、多数のサーバーで複雑なタスクを実行できる自動化ツールです。 他の代替手段とは異なり、Ansibleは単一のホストにインストールされます。これはローカルマシンである場合もあり、SSHを使用して各リモートホストと通信します。 これにより、新しいサーバーごとにインストールする前提条件パッケージがないため、新しいサーバーの構成が非常に高速になります。 シンプルなモジュールベースの構文を使用して、 `+ yaml +`形式の_playbooks_を使用しているため、非常に使いやすく、理解しやすいです。

前提条件

このチュートリアルでは、新しいUbuntu 14.04マスタードロップレットにAnsibleをインストールし、それを使用して2番目のドロップレットでApacheを構成します。 ただし、Ansibleの利点の1つは、ローカルマシンにインストールして、手動でsshする必要なく他のホストを管理できることです。

このチュートリアルでは、次のものが必要です。

  • 2つのUbuntu 14.04ドロップレット:Ansibleを備えたマスタードロップレットと、Ansibleで構成されたApacheを実行する1つのセカンダリドロップレット

  • 両方のドロップレットのhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04[Sudo non-root users]。

  • マスタードロップレットにインストールされたAnsible。 https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-an-ubuntu-12-04-vps [このチュートリアル](_SSHキーのセットアップ_までセクション)。 このチュートリアルはUbuntu 12.04向けに書かれていますが、Ubuntu 14.04にも関連しています。

  • セカンダリドロップレットへのログインを許可するマスタードロップレットのSSHキー。これはhttps://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys—​2 [このチュートリアルに従って実行できます]マスタードロップレット。

  • アクティブなDNSレコード、またはhttps://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts#step-six-%E2% 80%94-set-up-local-hosts-file-(optional)[ローカルホストファイルを手動でセットアップ]ローカルマシンで(セカンダリドロップレットのIPアドレスを使用して)仮想ホストをセットアップして使用するため構成されます。

:このチュートリアルは、既存のチュートリアルで説明されている概念に従います。 or-debian-vps [UbuntuまたはDebian VPSでApache Webサーバーを設定する方法]。 さらに情報が必要な場合、またはAnsibleプロセスと一緒に手動プロセスを確認する場合は、そのチュートリアルを確認してください。

ステップ1-Ansibleの構成

このセクションでは、サーバーを管理できるようにAnsibleを構成します。

Ansibleをインストールしたら、最初のステップは、どのホストと対話するかをAnsibleに伝えることです。 これを行うには、Ansibleホストファイルを作成する必要があります。 Ansibleホストファイルには、Ansibleコマンドを実行するときに参照するホストのグループが含まれています。 デフォルトでは、これは `+ / etc / ansible / hosts +`にあります。 ただし、これはシステム全体にグローバルに適用され、多くの場合管理者権限が必要です。 代わりに、物事を簡単にするために、ローカルホストファイルを使用するようにAnsibleに指示する必要があります。

Ansibleは常に、実行元のローカルディレクトリで `+ ansible.cfg +`ファイルを探し、見つかった場合はグローバル設定をローカル値でオーバーライドします。 これを念頭に置いて行う必要があるのは、グローバルディレクトリではなくローカルディレクトリのhostsファイルを使用することをAnsibleに伝えることだけです。

新しいディレクトリを作成します(このチュートリアルの残りの部分で使用します)。

mkdir ansible-apache

新しいディレクトリに移動します。

cd ~/ansible-apache/

`+ ansible.cfg +`という新しいファイルを作成し、編集用に開きます。

nano ansible.cfg

そのファイル内で、 `+ [defaults] `グループ内で、 ` hosts `の値を持つ ` hostfile `設定オプションを追加します。 以下を ` ansible.cfg +`ファイルにコピーし、保存して閉じます。

[defaults]
hostfile = hosts

次に、 `+ hosts +`ファイルを作成する必要があります。 hostsファイルには多くのオプションがあります。 ただし、非常に単純なものから始めることができます。

`+ hosts +`ファイルを作成し、編集用に開きます。

nano hosts

以下を `+ hosts +`ファイルにコピーします。

[apache]
ansible_ssh_user=

これは、1つのホストを含​​む「+ apache +」というホストグループを指定します。 「」をセカンダリサーバーのホスト名またはIPアドレスに、「」をSSHユーザー名に置き換えます。 これで、Ansibleはサーバーに接続できるはずです。

:ターゲットホストと同じユーザーとしてAnsibleを実行している場合、 `+ ansible_ssh_user = +`コンポーネントはオプションです。

Ansibleが動作し、ホストと通信できることをテストするには、基本的な `+ ansible `コマンドを実行できます。 Ansibleには多くのhttp://docs.ansible.com/list_of_all_modules.html [デフォルトモジュール]が付属していますが、始めるのに適した場所はhttp://docs.ansible.com/ping_module.html[ping]モジュールです。 各ホストに接続できることを確認します。これにより、 ` hosts +`ファイルの正確性を簡単に確認できます。

+ ansible +`コマンドの基本的な使用法は、ホストグループとモジュール名を受け入れます: `+ ansible <group> -m <module> +。 `+ ping +`コマンドを実行するには、次のコマンドを入力します。

ansible apache -m ping

出力は次のようになります。

111.111.111.111 | success >> {
   "changed": false,
   "ping": "pong"
}

テストに役立つもう1つのAnsibleモジュールは、http://docs.ansible.com/command_module.html [command]モジュールです。 ホストでカスタムコマンドを実行し、結果を返します。 文字列を端末にエコーするUnixコマンドである `+ echo `を使用して ` command +`コマンドを実行するには、次のコマンドを入力します。

ansible apache -m command -a "/bin/echo hello sammy"

出力は次のようになります。

111.111.111.111 | success | rc=0 >>
hello sammy

これは、Ansibleの基本的な使用法です。 本当の力は、複数のAnsibleタスクを含むプレイブックを作成することです。 次にそれらについて説明します。

ステップ2-プレイブックの作成

このセクションでは、基本的なAnsibleプレイブックを作成して、より複雑なモジュールを簡単に実行できるようにします。

非常に基本的なAnsibleプレイブックは、ホストグループと、指定されたグループ内のホストで実行される1つ以上のタスクを指定する単一の `+ yaml +`ファイルです。 これらは非常にシンプルで読みやすいため、Ansibleが非常に強力である理由の1つです。

上記の「+ hello sammy +」コマンドの基本的なプレイブックバージョンを作成しましょう。

`+ apache.yml +`というファイルを作成し、編集用に開きます。

nano apache.yml

次のテキストをファイルにコピーし、保存して閉じます。

---
- hosts: apache
 tasks:
   - name: run echo command
     command: /bin/echo hello sammy

`+ hosts:apache `宣言は一番上にあり、 ` apache `ホストグループを使用していることをAnsibleに伝えます。 これは、 ` ansible `コマンドで渡すことと同等です。 次に、タスクのリストがあります。 この例では、 ` run echo command `という名前のタスクが1つあります。 これは、ユーザーがタスクの実行内容を理解するための単なる説明です。 最後に、 ` command:/ bin / echo hello sammy `行は、引数 ` / bin / echo hello sammy `で ` command +`モジュールを実行します。

`+ ansible-playbook `コマンドはプレイブックの実行に使用され、最も簡単な使用法は ` ansible-playbook +`です。 次のコマンドを使用して、作成したプレイブックを実行できます。

ansible-playbook apache.yml

出力は次のようになります。

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [run echo command] ******************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0

ここで注意すべき最も重要なことは、プレイブックがモジュールの出力を返さないことです。そのため、ステップ1で使用した直接コマンドとは異なり、 `+ hello sammy +`が実際に印刷されたかどうかを確認できません。 つまり、出力を表示する必要がないタスクには、Playbookの方が適しています。 Ansibleは、モジュールの実行中にエラーが発生したかどうかを通知するため、通常は、何かがうまくいかないかどうかを知るためだけにそれを信頼する必要があります。

ステップ3-Apacheのインストール

プレイブックを紹介したので、Apache Webサーバーをインストールするタスクを作成します。

通常、Ubuntuでは、Apacheのインストールは、 + apt-get +`を介して `+ apache2 +`パッケージをインストールする単純なケースです。 Ansibleを介してこれを行うには、Ansibleのhttp://docs.ansible.com/apt_module.html[apt]モジュールを使用します。 `+ apt`モジュールには、特殊化された + apt-get`機能のための多くのオプションが含まれています。 興味のあるオプションは次のとおりです。

  • * name *:インストールするパッケージの名前。単一のパッケージ名またはパッケージのリスト。

  • 状態+ latest、` + absent`、または `+ present`のいずれかを受け入れます。 Latestは、最新バージョンがインストールされていることを確認し、存在する場合はインストールされていることを確認し、インストールされていない場合は削除します。

  • * update_cache *:有効になっている場合、キャッシュを更新して( `+ apt-get update`を介して)、最新であることを確認します。

: `+ apt +`以外のパッケージマネージャーhttp://docs.ansible.com/list_of_packaging_modules.html [モジュールもあります]。 各モジュールページには、通常すべての主要なユースケースをカバーするサンプルがあり、各モジュールの使用方法を非常に簡単に把握できます。 他の場所で使用方法を調べる必要はほとんどありません。

では、 `+ apache.yml `プレイブックを、 ` command `モジュールの代わりに ` apt `モジュールで更新しましょう。 編集のために ` apache.yml +`ファイルを再度開きます。

nano apache.yml

現在そこにあるテキストを削除し、次のテキストをコピーします。

---
- hosts: apache
 sudo: yes
 tasks:
   - name: install apache2
     apt: name=apache2 update_cache=yes state=latest

+ apt +`行は `+ apache2 +`パッケージ( `+ name = apache2 +)をインストールし、キャッシュを更新したことを確認します( + update_cache = yes +)。 これはオプションですが、インストールする必要があることを明示するために `+ state = latest +`を含めることをお勧めします。

Playbookが各ホストで「+ root」として実行されていない限り、正しい権限を確保するには「+ sudo i」が必要です。 Ansibleは、Playbook内のシンプルなオプションの一部として `+ sudo `をサポートしています。 ` ansible-playbook +`コマンドとタスクごとのレベルで適用することもできます。

次に、プレイブックを実行します。

ansible-playbook apache.yml --ask-sudo-pass

`+-ask-sudo-pass +`フラグは、セカンダリドロップレットでsudoパスワードの入力を求めます。 インストールにはルート権限が必要なため、これが必要です。これまでに実行した他のコマンドは実行しませんでした。

出力は次のようになります。

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0

ブラウザでセカンダリサーバーのホスト名またはIPアドレスにアクセスすると、* Apache2 Ubuntuのデフォルトページ*が表示されます。 つまり、サーバーにApacheが正常にインストールされていて、まだコマンドを実行するために手動で接続していないことを意味します。

この時点で注意すべき重要な概念は_idempotence_です。これは、Ansibleモジュールがどのように動作するかを示しています。 同じコマンドを繰り返し実行できるという考え方ですが、最初の実行ですべてが構成されていれば、その後のすべての実行では変更は行われません。 `+ apt +`モジュールを含め、ほとんどすべてのAnsibleモジュールがサポートしています。

たとえば、同じプレイブックコマンドを再度実行します。

ansible-playbook apache.yml --ask-sudo-pass

出力は次のようになります。 `+ changed = 0 +`セクションに注意してください。

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2        unreachable=0    failed=0

これにより、 `+ apache2 +`パッケージが既にインストールされているため、何も変更されていないことがわかります。 多くのホストで複雑なプレイブックを処理する場合、異なるホストを特定できることが非常に役立ちます。 たとえば、ホストが常に特定の構成を更新する必要があることに気づいた場合、ホストを変更しているユーザーまたはプロセスが存在する可能性があります。 べき等性がなければ、これに気付かないかもしれません。

ステップ4-Apacheモジュールの構成

Apacheがインストールされたので、Apacheでモジュールを使用できるようにする必要があります。

Apacheで `+ mod_rewrite `モジュールが有効になっていることを確認しましょう。 SSHを介して、これは ` a2enmod `を使用してApacheを再起動することで簡単に実行できます。 ただし、http://docs.ansible.com/apache2_module_module.html [apache2_module]モジュールとタスクハンドラーを使用して、 ` apache2 +`を再起動することで、Ansibleでも非常に簡単に実行できます。

`+ apache2_module +`モジュールには2つのオプションがあります:

  • * name * –有効にするモジュールの名前( `+ rewrite +`など)。

  • * state * –モジュールを有効または無効にする必要があるかどうかに応じて、「+ present 」または「 absent +」のいずれかです。

編集のために `+ apache.yml +`を開きます。

nano apache.yml

ファイルを更新して、このタスクを含めます。 ファイルは次のようになります。

---
- hosts: apache
 sudo: yes
 tasks:
   - name: install apache2
     apt: name=apache2 update_cache=yes state=latest

ただし、モジュールを有効にした後、 `+ apache2 `を再起動する必要があります。 1つのオプションは、タスクを追加して ` apache2 +`を再起動することですが、プレイブックを適用するたびに実行しないようにします。 これを回避するには、_task handler_を使用する必要があります。 ハンドラーの動作方法は、タスクが変更されたときにハンドラーに通知するようにタスクに指示することができ、ハンドラーはタスクが変更されたときにのみ実行されることです。

これを行うには、 `+ notify `オプションを ` apache2_module `タスクに追加する必要があります。その後、http://docs.ansible.com/service_module.html [service]モジュールを使用して ` apache2 +`を再起動できますハンドラー内。

その結果、次のようなプレイブックが作成されます。

---
- hosts: apache
 sudo: yes
 tasks:
   - name: install apache2
     apt: name=apache2 update_cache=yes state=latest

   - name: enabled mod_rewrite
     apache2_module: name=rewrite state=present

次に、プレイブックを再実行します。

ansible-playbook apache.yml --ask-sudo-pass

出力は次のようになります。

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
ok: [111.111.111.111]







PLAY RECAP ********************************************************************
111.111.111.111            : ok=4        unreachable=0    failed=0

今のところそれはよさそうだ。 ここで、コマンドを再度実行すると、変更はありません。再起動タスクはリストされません。

ステップ5-Apacheオプションの構成

必要なモジュールをオンにして、Apacheが正常にインストールされたので、Apacheを構成する必要があります。

デフォルトでは、ApacheはすべてのHTTPトラフィックをポート80でリッスンします。 チュートリアルのために、代わりにApacheがポート8081でリッスンすることを想定します。 Ubuntu 14.04 x64上のデフォルトのApache構成では、更新する必要がある2つのファイルがあります。

/etc/apache2/ports.conf
   Listen 80

/etc/apache2/sites-available/000-default.conf
   <VirtualHost *:80>

これを行うには、http://docs.ansible.com/lineinfile_module.html [lineinfile]モジュールを使用できます。 このモジュールは非常に強力であり、さまざまな設定オプションを使用することで、ホスト上の既存のファイルに対してあらゆる種類の変更を実行できます。 この例では、次のオプションを使用します。

  • * dest * –コマンドの一部として更新されるファイル。

  • * regexp * –置換される既存の行に一致するために使用される正規表現。

  • * line * – `+ regexp +`行を置き換えるか、最後に新しい行としてファイルに挿入される行。

  • 状態 – `+ present `または ` absent +`のいずれか。

: `+ lineinfile `モジュールは、既存の行と ` regexp `が一致しない場合、ファイルの最後に行を追加します。 オプション ` insertbefore `と ` insertafter +`は、必要に応じて、末尾ではなく前後に追加する行を指定できます。

ポートを「80」から「8081」に更新するために必要なことは、ポート「80」を定義する既存の行を探し、それらを変更してポート「8081」を定義することです。

編集のために `+ apache.yml +`ファイルを開きます。

nano apache.yml

ファイルが次のようになるように追加の行を修正します。

---
- hosts: apache
 sudo: yes
 tasks:
   - name: install apache2
     apt: name=apache2 update_cache=yes state=latest

   - name: enabled mod_rewrite
     apache2_module: name=rewrite state=present
     notify:
       - restart apache2











 handlers:
   - name: restart apache2
     service: name=apache2 state=restarted

このプロセスの一環として `+ apache2 +`を再起動する必要があり、同じハンドラーを再利用できますが、複数の変更されたタスクにもかかわらず、ハンドラーは1回しかトリガーされないことに注意することが重要です。

次に、プレイブックを実行します。

ansible-playbook apache.yml --ask-sudo-pass

Ansibleが完了すると、ブラウザでホストにアクセスできるようになり、ポート「80」ではなくポート「8081」で応答します。 ほとんどのWebブラウザーでは、これはURLの最後に「:port +」を追加することで簡単に実現できます:「 http://111.111.111.111:/ + `」。

`+ lineinfile +`モジュールは非常に強力で、既存の設定をマングリングするのをとても簡単にします。 唯一の欠点は、変更するファイルに何を期待するかを知る必要があることですが、ほとんどの単純なユースケースをサポートするさまざまなオプションをサポートしています。

ステップ6-仮想ホストの構成

Ansibleは、ローカル(Ansibleに)テンプレートファイルをホストにコピーする機能を提供するモジュールをいくつか備えています。 この目的で最もよく使用される2つのモジュールは、http://docs.ansible.com/copy_module.html [copy]モジュールとhttp://docs.ansible.com/template_module.html[template]モジュールです。 + copy +`モジュールはファイルをそのままコピーし、変更しませんが、より強力な `+ template +`モジュールはテンプレート全体にコピーし、二重中括弧(つまり、 `+ {{変数}} +)。

このセクションでは、http://docs.ansible.com/template_module.html [template]モジュールを使用して、サーバーに新しい仮想ホストを構成します。 多くの変更があるので、それらを少しずつ説明し、更新された `+ apache.yml +`ファイル全体をこのステップの最後に含めます。

仮想ホスト構成の作成

最初のステップは、新しい仮想ホスト構成を作成することです。 マスタードロップレットで仮想ホスト構成ファイルを作成し、Ansibleを使用してセカンダリドロップレットにアップロードします。

以下は、独自の構成の開始点として使用できる基本的な仮想ホスト構成の例です。 以下に強調表示されているポート番号とドメイン名の両方が、構成にハードコーディングされていることに注意してください。

<VirtualHost *:>
   ServerAdmin [email protected]
   ServerName
   ServerAlias www.
   DocumentRoot /var/www/
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

`+ virtualhost.conf +`という新しいファイルを作成します。

nano virtualhost.conf

以下を `+ virtualhost.conf +`に貼り付けます。 テンプレートを使用しているため、上記のハードコードされた値を変数に変更して、将来変更しやすくすることをお勧めします。

<VirtualHost *:>
   ServerAdmin [email protected]
   ServerName
   ServerAlias www.
   DocumentRoot /var/www/
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

テンプレート変数を使用する

次に、プレイブックを更新してテンプレートをプッシュし、変数を使用する必要があります。

最初のステップは、変数のプレイブックにセクションを追加することです。 「+ vars 」と呼ばれ、「 hosts」、「+ sudo」、「+ tasks」、および「+ handlers」と同じレベルになります。 上記のテンプレートで使用されている両方の変数を入力する必要があり、プロセスでポートを「80」に戻します。

---
- hosts: apache
 sudo: yes



 tasks:
   - name: install apache2
...

変数はタスクやテンプレートで使用できるため、既存の `+ lineinfile `モジュールを更新して、以前に指定したハードコードされた ` 8081 `ではなく、指定された ` http_port `を使用できます。 変数を行に追加する必要があり、特定のポートを検索しないように、「 regexp +」オプションを更新する必要があります。 変更は次のようになります。

lineinfile: dest=/etc/apache2/ports.conf regexp="" line="Listen " state=present
lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="" line="<VirtualHost *:>"

テンプレートモジュールの追加

次のステップでは、テンプレートモジュールを追加して、構成ファイルをホストにプッシュします。 これらのオプションを使用して、それを実現します。

  • * dest * –更新されたテンプレートをホストに保存する宛先ファイルのパス、つまり + / etc / apache2 / sites-available / {{domain}}。conf +

  • * src * –ソーステンプレートファイル、つまり + virtualhost.conf +

これらをプレイブックに適用すると、次のようなタスクになります。

- name: create virtual host file
 template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

仮想ホストを有効にする

ほぼ完了しました! ここで必要なのは、Apache内で仮想ホストを有効にすることです。 これは2つの方法で行うことができます: `+ sudo a2ensite example.com `コマンドを実行するか、設定ファイルを手動で ` / etc / apache2 / sites-enabled / `にシンボリックリンクします。 前者のオプションは、Apacheがプロセスを制御できるため、より安全です。 このため、 ` command +`モジュールが再び使用されます。

上記で発見したように、使用方法は非常に簡単です。

- name: a2ensite {{ domain }}
 command: a2ensite {{ domain }}
 notify:
 - restart apache2

余分な仕事を防ぐ

最後に、 `+ command `モジュールはいつ実行すべきか、また実行すべきでないかを知る必要があるため、プレイブックが複数回実行された場合にモジュールが不必要に実行されることはありません。 私たちの場合、 ` .conf`ファイルがホスト上にまだ作成されていない場合にのみ実行する必要があります。

これは、モジュールの実行中に作成されているファイルをモジュールに伝えることができる `+ creates +`オプションを使用して行われます。 ファイルが存在する場合、モジュールは実行されません。 Apacheはサイトが有効になっているときにシンボリックリンクを作成するため、それを確認することで問題が解決します。

変更は次のようになります。

- name: a2ensite {{ domain }}
 command: a2ensite {{ domain }}


 notify:
 - restart apache2

タスクの `+ args +`セクションの使用に注意することが重要です。 これは、モジュールオプションをリストするオプションの方法であり、この場合、モジュールオプションとコマンド自体との間の混乱を取り除きます。

最終的な `+ apache.yml +`プレイブック

これらの変更を適用しましょう。 `+ apache.yml +`を開きます。

nano apache.yml

上記のすべての変更で、 `+ apache.yml +`プレイブックを次のように変更します。

---
- hosts: apache
 sudo: yes
 vars:
   http_port: 80
   domain: example.com
 tasks:
   - name: install apache2
     apt: name=apache2 update_cache=yes state=latest

   - name: enabled mod_rewrite
     apache2_module: name=rewrite state=present
     notify:
       - restart apache2

   - name: apache2 listen on port {{ http_port }}
     lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
     notify:
       - restart apache2

   - name: apache2 virtualhost on port {{ http_port }}
     lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"
     notify:
       - restart apache2

   - name: create virtual host file
     template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

   - name: a2ensite {{ domain }}
     command: a2ensite {{ domain }}
     args:
       creates: /etc/apache2/sites-enabled/{{ domain }}.conf
     notify:
       - restart apache2

 handlers:
   - name: restart apache2
     service: name=apache2 state=restarted

ファイルを保存して閉じてから、プレイブックを実行します。

ansible-playbook apache.yml --ask-sudo-pass

ブラウザでセカンダリドロップレットのホスト名またはIPアドレスにアクセスすると、ポート + 8081 +`ではなく、ポート `+ 80 +`で再び応答することがわかります。 次に、ドメインにアクセスします(つまり、 `+ example.com +)新しい仮想ホストに指定しました。 ファイルをまだ追加していないため、Apacheのウェルカムページではなく、Apacheの「404」エラーページが表示されます。 その場合、仮想ホストは正常に動作していますが、まだ2番目のドロップレットにSSHで接続して単一のコマンドを実行していません。

ステップ7-WebサイトでGitリポジトリを使用する

このセクションでは、Webサイトのコンテンツを設定するために、Ansibleを使用してGitリポジトリを複製します。

すべてのWebサイトにはコンテンツが必要であり、SSHを使用してGitリポジトリを手動で複製して新しいWebサイトをセットアップするのは普通ですが、Ansibleはそれを自動的に行うために必要なツールを提供します。 この例では、http://docs.ansible.com/git_module.html [git]モジュールが必要なことを行います。

`+ git +`モジュールには多くのオプションがあり、このチュートリアルに関連するオプションは次のとおりです。

  • * dest * –リポジトリがチェックアウトされるホスト上のパス。

  • * repo * –クローンされるリポジトリのURL。 これはホストからアクセス可能でなければなりません。

  • * update * – `+ no +`に設定すると、Ansibleが既に存在するリポジトリを更新できなくなります。

  • * accept_hostkey * – SSH経由で接続するときに未知のホストキーを受け入れるようにSSHに指示します。 これは、最初のログイン試行を受け入れるためにSSH経由でログインする必要がなくなるため、非常に便利ですが、ホスト署名を手動で確認する機能が削除されます。 リポジトリによっては、このオプションが必要になる場合があります。

チュートリアルの目的のために、ホストに複製できる単一の `+ index.html `ページを持つ単純なGitリポジトリがあります。 同様のものを含む別のパブリックリポジトリが既にある場合は、自由に置き換えてください。 それを念頭に置いて、 ` git +`タスクは次のようになります。

- name: clone basic html template
 git: repo= dest= update=no

ただし、今すぐPlaybookを実行すると、おそらくエラーが発生します。 Ansibleがリポジトリを複製するために使用できるように、まず `+ git `パッケージをインストールする必要があります。 ` apache2 `パッケージと ` git `パッケージの両方をインストールするには、 ` apt `タスクを更新する必要があります。 http://docs.ansible.com/apt_module.html[apt]のドキュメントを確認すると、 ` name +`オプションは単一のパッケージしか受け取らないため、役に立たないことがわかります。 代わりに、_list of items_を使用する必要があります。

Ansibleは、ループするアイテムのリストを指定して、それぞれにタスクを適用する機能を提供します。 これらはタスクの一部として `+ with_items `オプションを使用して指定され、 ` apt +`タスクは次のように更新されます:

- name: install packages
 apt: name= update_cache=yes state=latest

アイテムのリストは `+ item +`変数を使用し、リスト内の各アイテムに対してタスクを実行します。

もう一度 `+ apache.yml +`を開きます。

nano apache.yml

以下に一致するようにプレイブックを更新します。

---
- hosts: apache
 sudo: yes

 vars:
   http_port: 80
   domain: example.com

 tasks:







   - name: enabled mod_rewrite
     apache2_module: name=rewrite state=present
     notify:
       - restart apache2

   - name: apache2 listen on port {{ http_port }}
     lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
     notify:
       - restart apache2

   - name: apache2 virtualhost on port {{ http_port }}
     lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"
     notify:
       - restart apache2

   - name: create virtual host file
     template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

   - name: a2ensite {{ domain }}
     command: a2ensite {{ domain }}
     args:
       creates: /etc/apache2/sites-enabled/{{ domain }}.conf
     notify:
       - restart apache2




 handlers:
   - name: restart apache2
     service: name=apache2 state=restarted

ファイルを保存して、プレイブックを実行します。

ansible-playbook apache.yml --ask-sudo-pass

`+ git +`をインストールし、リポジトリを正常に複製します。 手順6で仮想ホストにアクセスすると、404エラー以外のものが表示されるはずです。 非仮想ホストがまだデフォルトページを返していることを確認することを忘れないでください。

要約すると、Gitがインストールされ、Gitを介して新しい仮想ホストに基本的なHTMLページが複製されました。 手動のSSHコマンドはまだ必要ありません。 基本的なHTML Webサイトをたどるだけで、公開のGitリポジトリにある場合は、これで完了です!

結論

Ansible Playbookを作成して、仮想ホストとGitリポジトリを使用してApache Webサーバーを実行するようにホストを構成するプロセス全体を自動化しました。 これらはすべて、サーバーに直接ログインする必要なく達成されました。最良の部分は、ほとんどのUbuntuサーバーに対して新しいPlaybookを実行して同じ結果を達成できることです。

注意:ホストで既にApacheが設定および変更されている場合、必要な状態に戻すために各変更を処理する必要があります。 良い面として、Ansibleはこれらの変更が存在する場合にのみ修正するため、メインのPlaybookにそれらを含めるのは安全です!

Ansibleは非常に強力で、学習曲線も非常に簡単です。 このチュートリアルで説明する基本的な概念を使用して開始し、このレベルにとどまるか、さらに多くを学んで本当に複雑な部分に到達することができます。 どちらの方法でも、すべてではないにしてもほとんどのタスクで手動でログインする必要なく、サーバーを構成および管理できます。

Ansible Module Listを参照して、Ansibleが他に何ができるかを確認できます。