Ubuntu14.04でAnsibleを使用して高度なPHPアプリケーションをデプロイする方法
序章
このチュートリアルは、Ubuntu14.04でAnsibleを使用してPHPアプリケーションをデプロイすることに関するシリーズの2番目です。 最初のチュートリアルは、アプリケーションをデプロイするための基本的な手順をカバーしており、このチュートリアルで概説されている手順の開始点です。
このチュートリアルでは、コード展開/公開ツールをサポートするためのSSHキーの設定、システムファイアウォールの構成、データベースのプロビジョニングと構成(パスワードを含む)、およびタスクスケジューラ(cron)とキューデーモンの設定について説明します。 このチュートリアルの最後の目標は、前述の高度な構成で完全に機能するPHPアプリケーションサーバーを用意することです。
前回のチュートリアルと同様に、PHPアプリケーションの例としてLaravelフレームワークを使用します。 ただし、これらの手順は、すでに独自のフレームワークやアプリケーションを持っている場合は、他のフレームワークやアプリケーションをサポートするように簡単に変更できます。
前提条件
このチュートリアルは、シリーズの最初のチュートリアルの最後から直接続き、そのチュートリアル用に生成されたすべての構成とファイルが必要です。 そのチュートリアルをまだ完了していない場合は、このチュートリアルを続行する前に、まず完了してください。
ステップ1—アプリケーションリポジトリを切り替える
このステップでは、Gitリポジトリを少しカスタマイズされたサンプルリポジトリに更新します。
デフォルトのLaravelインストールでは、このチュートリアルで設定する高度な機能は必要ないため、既存のリポジトリを標準リポジトリから、デバッグコードが追加されたサンプルリポジトリに切り替えて、動作していることを示します。 。 使用するリポジトリはhttps://github.com/do-community/do-ansible-adv-php
にあります。
まだ行っていない場合は、前のチュートリアルのディレクトリをansible-php
に変更してください。
- cd ~/ansible-php/
既存のプレイブックを開いて編集します。
- nano php.yml
「Gitリポジトリのクローン作成」タスクを見つけて更新すると、次のようになります。
- name: Clone git repository
git: >
dest=/var/www/laravel
repo=https://github.com/do-community/do-ansible-adv-php
update=yes
version=example
sudo: yes
sudo_user: www-data
register: cloned
プレイブックを保存して実行します。
- ansible-playbook php.yml --ask-sudo-pass
実行が終了したら、Webブラウザでサーバーにアクセスします(つまり、 http://your_server_ip/
)。 「ドライバーが見つかりませんでした」というメッセージが表示されます。
これは、デフォルトのリポジトリをサンプルリポジトリに正常にスワップアウトしたが、アプリケーションがデータベースに接続できないことを意味します。 これは私たちがここで見ることを期待しているものであり、チュートリアルの後半でデータベースをインストールしてセットアップします。
ステップ2—展開用のSSHキーの設定
このステップでは、アプリケーションコード展開スクリプトに使用できるSSHキーを設定します。
Ansibleは構成の維持とサーバーとアプリケーションのセットアップに最適ですが、EnvoyやRocketeerなどのツールは、コードの変更をサーバーにプッシュし、アプリケーションコマンドをリモートで実行するためによく使用されます。 これらのツールのほとんどは、アプリケーションのインストールに直接アクセスできるSSH接続を必要とします。 この場合、これはwww-data
ユーザーのSSHキーを構成する必要があることを意味します。
コードをプッシュするユーザーの公開鍵ファイルが必要になります。 このファイルは通常、~/.ssh/id_rsa.pub
にあります。 そのファイルをansible-php
ディレクトリにコピーします。
- cp ~/.ssh/id_rsa.pub ~/ansible-php/deploykey.pub
Ansible authorized_key
モジュールを使用して、公開鍵を/var/www/.ssh/authorized_keys
内にインストールできます。これにより、デプロイメントツールがアプリケーションに接続してアクセスできるようになります。 構成は、ルックアップを使用してキーがどこにあるかを知る必要があるだけであり、ユーザーはキーをインストールする必要があります(この場合はwww-data
)。
- name: Copy public key into /var/www
authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}"
また、実際にログインできるように、www-data
ユーザーのシェルを設定する必要があります。 それ以外の場合、SSHは接続を許可しますが、ユーザーにシェルは表示されません。 これは、user
モジュールを使用し、シェルを/bin/bash
(またはお好みのシェル)に設定することで実行できます。
- name: Set www-data user shell
user: name=www-data shell=/bin/bash
次に、編集用のプレイブックを開いて、新しいタスクを追加します。
- nano php.yml
上記のタスクをphp.yml
プレイブックに追加します。 ファイルの終わりは次のように一致する必要があります。 追加は赤で強調表示されます。
. . .
- name: Configure nginx
template: src=nginx.conf dest=/etc/nginx/sites-available/default
notify:
- restart php5-fpm
- restart nginx
- name: Copy public key into /var/www
authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}"
- name: Set www-data user shell
user: name=www-data shell=/bin/bash
handlers:
. . .
プレイブックを保存して実行します。
- ansible-playbook php.yml --ask-sudo-pass
Ansibleが終了すると、www-data
ユーザーを使用してSSHで接続できるようになります。
- ssh www-data@your_server_ip
ログインに成功すると、機能します。 logout
と入力するか、 CTRL + D を押すと、ログアウトできます。
このチュートリアルの他の手順でその接続を使用する必要はありませんが、上記のように他のツールをセットアップする場合、または必要に応じて一般的なデバッグとアプリケーションのメンテナンスを行う場合に役立ちます。
ステップ3—ファイアウォールの構成
このステップでは、HTTPとSSHの接続のみを許可するようにサーバーのファイアウォールを構成します。
Ubuntu 14.04にはデフォルトでUFW( Uncomplicated Firewall )がインストールされており、Ansibleはufw
モジュールでサポートしています。 多数の強力な機能があり、可能な限りシンプルになるように設計されています。 いくつかのポートを開くだけでよい自己完結型のWebサーバーに最適です。 この例では、ポート80(HTTP)とポート22(SSH)を開いておく必要があります。 HTTPS用のポート443も必要になる場合があります。
ufw
モジュールには、さまざまなタスクを実行するさまざまなオプションがあります。 実行する必要のあるさまざまなタスクは次のとおりです。
-
デフォルトでは、UFWを有効にして、すべての着信トラフィックを拒否します。
-
SSHポートを開きますが、ブルートフォース攻撃を防ぐためにレート制限します。
-
HTTPポートを開きます。
これは、それぞれ次のタスクで実行できます。
- name: Enable UFW
ufw: direction=incoming policy=deny state=enabled
- name: UFW limit SSH
ufw: rule=limit port=ssh
- name: UFW open HTTP
ufw: rule=allow port=http
前と同じように、php.yml
ファイルを開いて編集します。
- nano php.yml
上記のタスクをプレイブックに追加します。 ファイルの終わりは次のように一致する必要があります。
. . .
- name: Copy public key into /var/www
authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}"
- name: Set www-data user shell
user: name=www-data shell=/bin/bash
- name: Enable UFW
ufw: direction=incoming policy=deny state=enabled
- name: UFW limit SSH
ufw: rule=limit port=ssh
- name: UFW open HTTP
ufw: rule=allow port=http
handlers:
. . .
プレイブックを保存して実行します。
- ansible-playbook php.yml --ask-sudo-pass
それが正常に完了しても、SSH(Ansibleを使用)またはHTTP経由でサーバーに接続できるはずです。 他のポートはブロックされます。
次のコマンドを実行することにより、いつでもUFWのステータスを確認できます。
- ansible php --sudo --ask-sudo-pass -m shell -a "ufw status verbose"
上記のAnsibleコマンドの内訳:
ansible
:プレイブックなしで生のAnsibleタスクを実行します。php
:このグループのホストに対してタスクを実行します。--sudo
:コマンドをsudo
として実行します。--ask-sudo-pass
:sudo
パスワードの入力を求めます。-m shell
:shell
モジュールを実行します。-a "ufw status verbose"
:モジュールに渡されるオプション。 これはshell
コマンドであるため、rawコマンドを渡します(つまり、ufw status verbose
)key=value
オプションなしでまっすぐに。
このようなものが返されるはずです。
your_server_ip | success | rc=0 >>
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22 LIMIT IN Anywhere
80 ALLOW IN Anywhere
22 (v6) LIMIT IN Anywhere (v6)
80 (v6) ALLOW IN Anywhere (v6)
ステップ4—MySQLパッケージのインストール
このステップでは、アプリケーションが使用するMySQLデータベースをセットアップします。
最初のステップは、プレイブックの上部にあるパッケージのインストールタスクに必要なパッケージを追加するだけで、MySQLがサーバーにインストールされていることを確認することです。 必要なパッケージは、mysql-server
、mysql-client
、およびphp5-mysql
です。 AnsibleがMySQLと通信できるように、python-mysqldb
も必要になります。
パッケージを追加しているので、nginx
とphp5-fpm
を再起動して、新しいパッケージがアプリケーションで使用できるようにする必要があります。 この場合、データベースに接続できるように、MySQLをPHPで使用できるようにする必要があります。
Ansibleの素晴らしい点の1つは、任意のタスクを変更してプレイブックを再実行すると、変更が適用されることです。 これには、apt
タスクの場合と同様にオプションのリストが含まれます。
前と同じように、php.yml
ファイルを開いて編集します。
- nano php.yml
install packages
タスクを見つけて、上記のパッケージを含むように更新します。
. . .
- name: install packages
apt: name={{ item }} update_cache=yes state=latest
with_items:
- git
- mcrypt
- nginx
- php5-cli
- php5-curl
- php5-fpm
- php5-intl
- php5-json
- php5-mcrypt
- php5-sqlite
- sqlite3
- mysql-server
- mysql-client
- php5-mysql
- python-mysqldb
notify:
- restart php5-fpm
- restart nginx
. . .
プレイブックを保存して実行します。
- ansible-playbook php.yml --ask-sudo-pass
ステップ5—MySQLデータベースを設定する
このステップでは、アプリケーション用のMySQLデータベースを作成します。
Ansibleは、mysql_
で始まるモジュールを使用してMySQLと直接通信できます(例: mysql_db
、mysql_user
)。 mysql_db
モジュールは、特定の名前のデータベースが存在することを確認する方法を提供するため、このようなタスクを使用してデータベースを作成できます。
- name: Create MySQL DB
mysql_db: name=laravel state=present
また、アプリケーションがデータベースに接続できるようにするには、既知のパスワードを持つ有効なユーザーアカウントが必要です。 これに対する1つのアプローチは、パスワードをローカルで生成してAnsibleプレイブックに保存することですが、それは安全ではなく、より良い方法があります。
サーバー自体でAnsibleを使用してパスワードを生成し、必要な場所で直接使用します。 パスワードを生成するには、makepasswd
コマンドラインツールを使用して、32文字のパスワードを要求します。 makepasswd
はUbuntuのデフォルトではないため、パッケージリストにも追加する必要があります。
また、コマンドの出力を記憶するようにAnsibleに指示します(つまり、 パスワード)なので、後でプレイブックで使用できます。 ただし、Ansibleはshell
コマンドを既に実行しているかどうかを認識しないため、そのコマンドを実行するときにファイルも作成します。 Ansibleはファイルが存在するかどうかをチェックし、存在する場合は、コマンドがすでに実行されていると見なし、再度実行することはありません。
タスクは次のようになります。
- name: Generate DB password
shell: makepasswd --chars=32
args:
creates: /var/www/laravel/.dbpw
register: dbpwd
次に、指定したパスワードを使用して実際のMySQLデータベースユーザーを作成する必要があります。 これはmysql_user
モジュールを使用して行われ、パスワード生成タスク中に定義した変数でstdout
オプションを使用して、次のようにシェルコマンドの生の出力を取得できます。[X195X ]