序章

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

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

前提条件

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

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

  • 2つのUbuntu14.04ドロップレット:1つはAnsibleを備えたマスタードロップレットで、もう1つはAnsibleを介して構成されたApacheを実行するセカンダリドロップレットです。
  • 両方のドロップレットのSudo非rootユーザー
  • マスタードロップレットにインストールされたAnsible。 このチュートリアルに従ってください( SSHキーの設定セクションまで)。 そのチュートリアルはUbuntu12.04用に書かれていますが、それでもUbuntu14.04に関連しています。
  • マスタードロップレットのSSHキーを使用して、セカンダリドロップレットへのログインを承認します。これは、マスタードロップレットのこのチュートリアルに従って実行できます。
  • 構成される仮想ホストを設定して使用するために、アクティブDNSレコード、またはローカルマシンにローカルホストファイルを手動で設定します(セカンダリDropletのIPアドレスを使用)。

:このチュートリアルは、既存のチュートリアルで説明されている概念に従います:UbuntuまたはDebianVPSでApacheWebサーバーを構成する方法。 詳細情報が必要な場合、またはAnsibleプロセスと一緒に手動プロセスを確認したい場合は、そのチュートリアルを確認してください。

ステップ1—Ansibleの設定

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

Ansibleがインストールされたら、最初のステップは、どのホストと通信するかをAnsibleに指示することです。 これを行うには、Ansiblehostsファイルを作成する必要があります。 Ansible hostsファイルには、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]
secondary_server_ip ansible_ssh_user=username

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

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

Ansibleが機能していてホストと通信できることをテストするには、基本的なansibleコマンドを実行します。 Ansibleには多くのデフォルトモジュールが付属していますが、開始するのに適した場所はpingモジュールです。 各ホストに接続できるかどうかをチェックするため、hostsファイルの正確性を簡単にチェックできます。

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

ansible apache -m ping

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

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

テストに役立つもう1つのAnsibleモジュールは、コマンドモジュールです。 ホスト上でカスタムコマンドを実行し、結果を返します。 文字列を端末にエコーする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 your-playbook.ymlです。 次のコマンドで、作成したばかりのプレイブックを実行できます。

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が実際に印刷されたかどうかを確認できないことです。 つまり、プレイブックは、出力を確認する必要がないタスクに適しています。 Ansibleは、モジュールの実行中にエラーが発生したかどうかを通知するため、通常は、何か問題が発生したかどうかを知るために、それに依存するだけで済みます。

ステップ3—Apacheをインストールする

プレイブックを紹介したので、ApacheWebサーバーをインストールするタスクを記述します。

通常、Ubuntuでは、Apacheのインストールは、apt-getを介してapache2パッケージをインストールする単純なケースです。 Ansibleを介してこれを行うには、Ansibleのaptモジュールを使用します。 aptモジュールには、特殊なapt-get機能のためのいくつかのオプションが含まれています。 私たちが興味を持っているオプションは次のとおりです。

  • name :インストールするパッケージの名前。単一のパッケージ名またはパッケージのリストのいずれかです。
  • state latestabsent、またはpresentのいずれかを受け入れます。 最新バージョンは最新バージョンがインストールされていることを確認し、存在は単にインストールされていることを確認し、存在しない場合はインストールされている場合は削除します。
  • update_cache :有効になっている場合は(apt-get updateを介して)キャッシュを更新し、キャッシュが最新であることを確認します。

apt以外のパッケージマネージャーにもモジュールがあります。 各モジュールページには、通常、すべての主要なユースケースをカバーする例があり、各モジュールの使用方法を非常に簡単に理解できます。 使用方法について他の場所を探す必要があることはめったにありません。

それでは、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が必要になります。 Ansibleは、Playbook内のシンプルなオプションの一部としてsudoをサポートしています。 ansible-playbookコマンドを使用して、タスクごとのレベルで適用することもできます。

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

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

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

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

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アドレスにアクセスすると、Apache2Ubuntuデフォルトページが表示されます。 これは、サーバーにApacheがインストールされていて、コマンドを実行するために手動で接続していないことを意味します。

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

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

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

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

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

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

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

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

これは、apache2パッケージがすでにインストールされているため、何も変更されていないことを示しています。 多くのホストにまたがる複雑なプレイブックを扱う場合、異なるホストを識別できると非常に便利になります。 たとえば、ホスト常にが特定の構成を更新する必要があることに気付いた場合、そのホスト上にそれを変更しているユーザーまたはプロセスが存在する可能性があります。 べき等がなければ、これは決して気付かれないかもしれません。

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

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

mod_rewriteモジュールがApacheに対して有効になっていることを確認しましょう。 SSH経由で、これはa2enmodを使用してApacheを再起動することで簡単に実行できます。 ただし、 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

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

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

これを行うには、notifyオプションをapache2_moduleタスクに追加する必要があります。次に、 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
      notify:
        - restart apache2

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

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

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

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

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

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

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

TASK: [enabled mod_rewrite] ***************************************************
changed: [111.111.111.111]

NOTIFIED: [restart apache2] ***************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=4    changed=2    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>

これを行うには、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

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

    - name: apache2 virtualhost on port 8081
      lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:80>" line="<VirtualHost *:8081>" 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:8081/

lineinfileモジュールは非常に強力であり、既存の構成を非常に簡単に操作できます。 唯一の落とし穴は、変更するファイルで何を期待するかを知る必要があるということですが、最も単純なユースケースをサポートするさまざまなオプションをサポートしています。

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

Ansibleは、ローカル(Ansibleに)テンプレートファイルをホストにコピーする機能を提供するいくつかのモジュールを備えています。 この目的で最も一般的に使用される2つのモジュールは、copyモジュールとtemplateモジュールです。 copyモジュールはファイルをそのままコピーして変更を加えませんが、より強力なtemplateモジュールはテンプレート全体をコピーし、二重中括弧を使用して指定した領域に変数置換を適用します(すなわち、 {{ variable }})。

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

仮想ホスト構成の作成

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

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

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

virtualhost.confという名前の新しいファイルを作成します。

nano virtualhost.conf

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

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

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

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

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

---
- hosts: apache
  sudo: yes
  vars:
    http_port: 80
    domain: example.com
  tasks:
    - name: install apache2
...

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

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

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

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

  • 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内で仮想ホストを有効にすることです。 これは、sudo a2ensite example.comコマンドを実行するか、構成ファイルを/etc/apache2/sites-enabled/に手動でシンボリックリンクするという2つの方法で実行できます。 前者のオプションは、Apacheがプロセスを制御できるため、より安全です。 このため、commandモジュールが再び使用されます。

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

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

余分な作業を防ぐ

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

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

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

- name: a2ensite {{ domain }}
  command: a2ensite {{ domain }}
  args:
    creates: /etc/apache2/sites-enabled/{{ domain }}.conf
  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のウェルカムページではなく、Apache404エラーページが表示されるはずです。 その場合、仮想ホストは正しく機能していますが、単一のコマンドを実行するためにセカンダリドロップレットにSSHで接続していません。

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

このセクションでは、Ansibleを使用してGitリポジトリのクローンを作成し、Webサイトのコンテンツを設定します。

すべてのウェブサイトにはコンテンツが必要です。SSHで接続してGitリポジトリを手動で複製して新しいウェブサイトを設定するのが普通ですが、Ansibleはそれを自動的に行うために必要なツールを提供してくれます。 この例では、gitモジュールが必要な処理を実行します。

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

  • dest –リポジトリがチェックアウトされるホスト上のパス。
  • repo –複製されるリポジトリのURL。 これは、ホストがアクセスできる必要があります。
  • update noに設定すると、Ansibleがリポジトリを既に存在している場合に更新できなくなります。
  • accept_hostkey –SSH経由で接続するときに不明なホストキーを受け入れるようにSSHに指示します。 これは、最初のログイン試行を受け入れるためにSSH経由でログインする必要をなくすので非常に便利ですが、ホスト署名を手動でチェックする機能が削除されます。 リポジトリによっては、このオプションが必要になる場合があります。

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

- name: clone basic html template
  git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no

ただし、ここでPlaybookを実行すると、エラーが発生する可能性があります。 最初にgitパッケージをインストールして、Ansibleがそれを使用してリポジトリのクローンを作成できるようにする必要があります。 apache2パッケージとgitパッケージの両方をインストールするには、aptタスクを更新する必要があります。 apt のドキュメントを確認すると、nameオプションは1つのパッケージしか使用できないため、役に立ちません。 代わりに、アイテムのリストを使用する必要があります。

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

- name: install packages
  apt: name={{ item }} update_cache=yes state=latest
  with_items:
    - apache2
    - git

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

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

nano apache.yml

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

---
- hosts: apache
  sudo: yes

  vars:
    http_port: 80
    domain: example.com

  tasks:

    - name: install packages
      apt: name={{ item }} update_cache=yes state=latest
      with_items:
        - apache2
        - git

    - 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

    - name: clone basic html template
      git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no

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

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

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

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

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

結論

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

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

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

Ansibleモジュールリストを参照して、Ansibleが他に何ができるかを確認できます。