Ubuntu14.04でAnsibleを使用してApacheを設定する方法
序章
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 :
latest
、absent
、または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 webmaster@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 webmaster@{{ 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
と呼ばれ、hosts
、sudo
、tasks
、および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が他に何ができるかを確認できます。