前書き

このチュートリアルでは、Ansibleを使用して基本的なPHPアプリケーションをプロビジョニングするプロセスについて説明します。 このチュートリアルの最後の目標は、ターゲットのドロップレットで単一のSSH接続または手動コマンドを実行することなく、基本的なPHPアプリケーションを新しいWebサーバーで処理できるようにすることです。

PHPアプリケーションの例としてhttps://github.com/laravel/laravel[Laravel framework]を使用しますが、これらの手順は、すでに独自のフレームワークとアプリケーションをサポートしている場合は簡単に変更できます。

前提条件

このチュートリアルでは、Ansibleを使用して、Ubuntu 14.04ドロップレットにNginx、PHP、およびその他のサービスをインストールおよび構成します。 このチュートリアルはAnsibleの基本的な知識に基づいているため、Ansibleを初めて使用する場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-an- ubuntu-12-04-vps [この基本的なAnsibleチュートリアル]最初。

このチュートリアルを実行するには、次のものが必要です。

ステップ1-Ansibleのインストール

最初のステップは、Ansibleをインストールすることです。 これは、PPA(Personal Package Archive)をインストールし、Ansibleパッケージを `+ apt +`でインストールすることで簡単に実現できます。

最初に、 `+ apt-add-repository +`コマンドを使用してPPAを追加します。

sudo apt-add-repository ppa:ansible/ansible

それが終了したら、 `+ apt +`キャッシュを更新します。

sudo apt-get update

最後に、Ansibleをインストールします。

sudo apt-get install ansible

Ansibleをインストールしたら、新しいディレクトリを作成して作業し、基本的な構成をセットアップします。 デフォルトでは、Ansibleは `+ / etc / ansible / hosts +`にあるhostsファイルを使用します。このファイルには、管理しているすべてのサーバーが含まれています。 このファイルは一部のユースケースでは問題ありませんが、グローバルなファイルなので、ここでは必要ありません。

このチュートリアルでは、ローカルホストファイルを作成し、代わりに使用します。 これを行うには、作業ディレクトリ内に新しいAnsible構成ファイルを作成します。これを使用して、同じディレクトリ内でhostsファイルを探すようにAnsibleに指示できます。

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

mkdir ~/ansible-php

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

cd ~/ansible-php/

「+ ansible.cfg 」という新しいファイルを作成し、それを開いて「 nano +」またはお好みのテキストエディターを使用して編集します。

nano ansible.cfg

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

ansible.cfg

[defaults]
hostfile = hosts

`+ ansible.cfg `ファイルを保存して閉じます。 次に、 ` hosts +`ファイルを作成します。このファイルには、アプリケーションをデプロイするPHPドロップレットのIPアドレスが含まれます。

nano hosts

以下をコピーして、「+ php +」のセクションに追加し、「」をサーバーのIPアドレスに、「」をPHPドロップレットの前提条件で作成したsudo非ルートユーザーに置き換えます。

ホスト

[php]
ansible_ssh_user=

`+ hosts `ファイルを保存して閉じます。 簡単なチェックを実行して、新しい ` php `グループで ` ping +`モジュールを呼び出して、Ansibleが期待どおりにホストに接続できることを確認します。

ansible php -m ping

以前にそのホストにログインしたことがあるかどうかに応じて、SSHホスト認証チェックを取得できます。 pingは次のような正常な応答で返されます。

出力

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

Ansibleがインストールされ、構成されました。 Webサーバーのセットアップに進むことができます。

ステップ2-必要なパッケージのインストール

このステップでは、Ansibleと + apt +`を使用して、必要なシステムパッケージをインストールします。 特に、 `+ git ++ nginx ++ sqlite3 ++ mcrypt +、およびいくつかの `+ php5-* +`パッケージをインストールします。

`+ apt `モジュールを追加して必要なパッケージをインストールする前に、基本的なプレイブックを作成する必要があります。 このプレイブックを基に、チュートリアルを進めていきます。 ` php.yml +`という新しいプレイブックを作成します。

nano php.yml

次の構成に貼り付けます。 最初の2行は、使用するホストグループ( + php +)を指定し、デフォルトで `+ sudo +`を使用してコマンドが実行されるようにします。 残りは、必要なパッケージを含むモジュールを追加します。 独自のアプリケーション用にこれをカスタマイズするか、サンプルのLaravelアプリケーションと一緒に使用する場合は、以下の構成を使用できます。

---
- hosts: php
 sudo: yes

 tasks:

 - 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

`+ php.yml `ファイルを保存します。 最後に、 ` ansible-playbook `を実行して、Dropletにパッケージをインストールします。 PHPドロップレットのsudoユーザーにパスワードが必要な場合は、 `-ask-sudo-pass +`オプションを使用することを忘れないでください。

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

手順3-システム構成ファイルの変更

このセクションでは、PHPドロップレットのシステム構成ファイルの一部を変更します。 変更する最も重要な設定オプション(Nginxのファイルについては後の手順で説明します)は、デフォルト値がセキュリティリスクであるため、 `+ php5-fpm `の ` cgi.fix_pathinfo +`オプションです。

最初にこのファイルに追加するすべてのセクションについて説明し、次にコピーして貼り付けるために `+ php.yml +`ファイル全体を含めます。

lineinfileモジュールを使用して、ファイル内の構成値が予想どおりになっていることを確認できます。 これは、一般的なhttps://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions [正規表現]を使用して実行できるため、Ansibleはパラメーターが含まれる可能性のあるほとんどの形式を理解できます。 また、変更を有効にするには、 `+ php5-fpm `と ` nginx `を再起動する必要があるため、2つのハンドラーを新しい ` handlers +`セクションに追加する必要があります。 ハンドラーは、タスクが変更されたときにのみ起動されるため、これに最適です。 また、プレイブックの最後で実行されるため、複数のタスクが同じハンドラーを呼び出すことができ、1回だけ実行されます。

上記を行うセクションは次のようになります。

 - name: ensure php5-fpm cgi.fix_pathinfo=0
   lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0
   notify:
     - restart php5-fpm
     - restart nginx

 handlers:
   - name: restart php5-fpm
     service: name=php5-fpm state=restarted

   - name: restart nginx
     service: name=nginx state=restarted

注:Ansibleバージョン1.9.1のバグ

次に、 `+ php5-mcrypt `モジュールが有効になっていることを確認する必要もあります。 これは、シェルタスクで ` php5enmod `スクリプトを実行し、有効になっているときに ` 20-mcrypt.ini +`ファイルが正しい場所にあることを確認することで実行されます。 タスクが特定のファイルを作成することをAnsibleに伝えていることに注意してください。 そのファイルが存在する場合、タスクは実行されません。

 - name: enable php5 mcrypt module
   shell: php5enmod mcrypt
   args:
     creates: /etc/php5/cli/conf.d/20-mcrypt.ini

ここで、もう一度編集するために `+ php.yml +`を開きます。

nano php.yml

上記のタスクとハンドラーを追加して、ファイルが以下と一致するようにします。

---
- hosts: php
 sudo: yes

 tasks:

 - 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

 - name: ensure php5-fpm cgi.fix_pathinfo=0
   lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0
   notify:
     - restart php5-fpm
     - restart nginx

 - name: enable php5 mcrypt module
   shell: php5enmod mcrypt
   args:
     creates: /etc/php5/cli/conf.d/20-mcrypt.ini

 handlers:
   - name: restart php5-fpm
     service: name=php5-fpm state=restarted

   - name: restart nginx
     service: name=nginx state=restarted

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

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

これで、Dropletにすべての必要なパッケージがインストールされ、基本構成がセットアップされ、準備が完了しました。

ステップ4-Gitリポジトリーの複製

このセクションでは、Gitを使用してLaravelフレームワークリポジトリをDropletにクローンします。 ステップ3と同様に、プレイブックに追加するすべてのセクションを説明し、 `+ php.yml +`ファイル全体をコピーして貼り付けます。

Gitリポジトリを複製する前に、 `+ / var / www +`が存在することを確認する必要があります。 これを行うには、ファイルモジュールを使用してタスクを作成します。

- name: create /var/www/ directory
 file: dest=/var/www/ state=directory owner=www-data group=www-data mode=0700

前述のように、Gitモジュールを使用してリポジトリをDropletに複製する必要があります。 通常、 `+ git clone `コマンドに必要なのはソースリポジトリのみであるため、プロセスは単純です。 この場合、宛先も定義し、 ` update = no `を設定して、リポジトリが既に存在する場合は更新しないようにAnsibleに指示します。 Laravelを使用しているため、使用するgitリポジトリのURLは ` https:// github.com / laravel / laravel.git +`です。

ただし、権限が正しいことを確認するには、 `+ www-data`ユーザーとしてタスクを実行する必要があります。 これを行うために、 `+ sudo +`を使用して特定のユーザーとしてコマンドを実行するようAnsibleに指示できます。 最終的なタスクは次のようになります。

- name: Clone git repository
 git: >
   dest=/var/www/laravel
   repo=https://github.com/laravel/laravel.git
   update=no
 sudo: yes
 sudo_user: www-data

:SSHベースのリポジトリの場合、 `+ accept_hostkey = yes +`を追加して、SSHホスト検証がタスクをハングさせないようにすることができます。

前と同様に、編集のために `+ php.yml +`ファイルを開きます。

nano php.yml

上記のタスクをプレイブックに追加します。ファイルの終わりは次と一致する必要があります。

...

 - name: enable php5 mcrypt module
   shell: php5enmod mcrypt
   args:
     creates: /etc/php5/cli/conf.d/20-mcrypt.ini

 - name: create /var/www/ directory
   file: dest=/var/www/ state=directory owner=www-data group=www-data mode=0700

 - name: Clone git repository
   git: >
     dest=/var/www/laravel
     repo=https://github.com/laravel/laravel.git
     update=no
   sudo: yes
   sudo_user: www-data

 handlers:
   - name: restart php5-fpm
     service: name=php5-fpm state=restarted

   - name: restart nginx
     service: name=nginx state=restarted

プレイブックを保存して閉じ、実行します。

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

手順5-Composerを使用したアプリケーションの作成

このステップでは、Composerを使用してPHPアプリケーションとその依存関係をインストールします。

Composerには、必要なすべての依存関係をインストールし、 `+ composer.json `ファイルの ` post-create-project-cmd `セクションで定義されているプロジェクト作成手順を実行する ` create-project +`コマンドがあります。 これは、アプリケーションを最初に使用するために正しくセットアップするための最良の方法です。

次のAnsibleタスクを使用して、Composerを「+ / usr / local / bin / composer +」としてグローバルにダウンロードおよびインストールできます。 これにより、Ansibleを含むDropletを使用する誰でもアクセスできるようになります。

- name: install composer
 shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 args:
   creates: /usr/local/bin/composer

Composerがインストールされている場合、使用できるComposerモジュールがあります。 この場合、Composerにプロジェクトの場所を指定し( + working_dir +`パラメーターを使用)、 `+ create-project +`コマンドを実行します。 このフラグは `+ create-project +`コマンドではサポートされていないため、 `+ optimize_autoloader = no +`パラメーターも追加する必要があります。 `+ git`コマンドのように、これを + www-data`ユーザーとして実行して、パーミッションが有効であることを確認したいと思います。 すべてをまとめると、次のタスクが得られます。

- name: composer create-project
 composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no
 sudo: yes
 sudo_user: www-data

注意:Composerには空のキャッシュがあり、すべてを新鮮にダウンロードする必要があるため、 `+ create-project +`タスクは新しいドロップレットでかなりの時間がかかる場合があります。

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

nano php.yml

プレイブックの最後が次と一致するように、「+ tasks 」セクションの最後、「 handlers +」の上にタスクを追加します。

...

 - name: Clone git repository
   git: >
     dest=/var/www/laravel
     repo=https://github.com/laravel/laravel.git
     update=no
   sudo: yes
   sudo_user: www-data

 - name: install composer
   shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
   args:
     creates: /usr/local/bin/composer

 - name: composer create-project
   composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no
   sudo: yes
   sudo_user: www-data

 handlers:
   - name: restart php5-fpm
     service: name=php5-fpm state=restarted

   - name: restart nginx
     service: name=nginx state=restarted

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

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

ここで再びAnsibleを実行するとどうなりますか? `+ composer create-project `が再度実行されます。Laravelの場合、これは新しい ` APP_KEY `を意味します。 したがって、代わりに必要なのは、そのタスクを新しいクローンの後にのみ実行するように設定することです。 ` git clone `タスクの結果で変数を登録し、 ` composer create-project `タスク内でそれらの結果を確認することで、1回だけ実行されることを保証できます。 ` git clone `タスクが_Changed_であった場合、 ` composer create-project +`を実行します。そうでない場合はスキップされます。

注意: Ansible `+ composer +`モジュールのいくつかのバージョンにはバグがあるようです。

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

nano php.yml

`+ git clone `タスクを見つけます。 次のように、 ` register `オプションを追加して、タスクの結果を ` cloned +`変数に保存します。

- name: Clone git repository
 git: >
   dest=/var/www/laravel
   repo=https://github.com/laravel/laravel.git
   update=no
 sudo: yes
 sudo_user: www-data

次に、 `+ composer create-project`タスクを見つけます。 `+ when `オプションを追加して、 ` cloned +`変数が変更されたかどうかを確認します。

- name: composer create-project
 composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no
 sudo: yes
 sudo_user: www-data

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

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

Composerは、実行されるたびに `+ APP_KEY +`の変更を停止します。

ステップ6-環境変数の更新

このステップでは、アプリケーションの環境変数を更新します。

Laravelには、デフォルトの `+ .env `ファイルが付属しています。このファイルは、 ` APP_ENV `を ` local `に、 ` APP_DEBUG `を ` true `に設定します。 それらをそれぞれ「 production」と「+ false」に交換します。 これは、次のタスクで `+ lineinfile +`モジュールを使用するだけで実行できます。

- name: set APP_DEBUG=false
 lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false

- name: set APP_ENV=production
 lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production

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

nano php.yml

このタスクをプレイブックに追加します。ファイルの終わりは次と一致する必要があります。

...

 - name: composer create-project
   composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no
   sudo: yes
   sudo_user: www-data
   when: cloned|changed

 - name: set APP_DEBUG=false
   lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false

 - name: set APP_ENV=production
   lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production

 handlers:
   - name: restart php5-fpm
     service: name=php5-fpm state=restarted

   - name: restart nginx
     service: name=nginx state=restarted

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

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

`+ lineinfile +`モジュールは、テキストファイルをすばやく調整するのに非常に役立ちます。また、このような環境変数を正しく設定するのに最適です。

手順7-Nginxの構成

このセクションでは、PHPアプリケーションを提供するためにNginxを構成します。

WebブラウザでDropletにアクセスすると(つまり、 + http:/// +)、Laravelの新しいプロジェクトページの代わりにNginxのデフォルトページが表示されます。 これは、 `+ / var / www / laravel / public `ディレクトリからアプリケーションを提供するようにNginx Webサーバーを設定する必要があるためです。 これを行うには、そのディレクトリでNginxのデフォルト設定を更新し、 ` php-fpm +`のサポートを追加して、PHPスクリプトを処理できるようにする必要があります。

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

nano nginx.conf

このファイル内にこのサーバーブロックを保存します。 https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04#step-fourのステップ4を確認できます。 -このNginx設定の詳細については、%E2%80%94-configure-nginx-to-use-our-php-processor [このチュートリアル]。以下の変更は、Laravelパブリックディレクトリの場所を指定し、Nginxが `+ hosts `ファイルで定義したホスト名を ` inventory_hostname `変数を使用して ` server_name +`として使用することを確認しています。

nginx.conf

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /var/www/laravel/public;
   index index.php index.html index.htm;

   server_name {{ inventory_hostname }};

   location / {
       try_files $uri $uri/ =404;
   }

   error_page 404 /404.html;
   error_page 500 502 503 504 /50x.html;
   location = /50x.html {
       root /var/www/laravel/public;
   }

   location ~ \.php$ {
       try_files $uri =404;
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params;
   }
}

`+ nginx.conf`ファイルを保存して閉じます。

これで、テンプレートモジュールを使用して、新しい構成ファイルをプッシュできます。 `+ template `モジュールは、 ` copy `モジュールと非常によく似た見た目と発音の場合がありますが、大きな違いがあります。 ` copy `は、変更を加えずに1つ以上のファイルをコピーしますが、 ` template `は単一のファイルをコピーし、ファイル内のすべての変数を解決します。 設定ファイル内で ` {{inventory_hostname}} `を使用したため、 ` template `モジュールを使用して、 ` hosts +`ファイルで使用したIPアドレスに解決します。 このように、Ansibleが使用する構成ファイルをハードコーディングする必要はありません。

ただし、タスクを作成するときに通常行われるように、ドロップレットで何が起こるかを考慮する必要があります。 Nginxの設定を変更しているため、Nginxと `+ php-fpm `を再起動する必要があります。 これは、 ` notify +`オプションを使用して行われます。

- name: Configure nginx
 template: src=nginx.conf dest=/etc/nginx/sites-available/default
 notify:
   - restart php5-fpm
   - restart nginx

`+ php.yml +`ファイルを開きます:

nano php.yml

タスクセクションの最後にこのnginxタスクを追加します。 `+ php.yml +`ファイル全体は次のようになります。

php.yml

---
- hosts: php
 sudo: yes

 tasks:

 - 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

 - name: ensure php5-fpm cgi.fix_pathinfo=0
   lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0
   notify:
     - restart php5-fpm
     - restart nginx

 - name: enable php5 mcrypt module
   shell: php5enmod mcrypt
   args:
     creates: /etc/php5/cli/conf.d/20-mcrypt.ini

 - name: create /var/www/ directory
   file: dest=/var/www/ state=directory owner=www-data group=www-data mode=0700

 - name: Clone git repository
   git: >
     dest=/var/www/laravel
     repo=https://github.com/laravel/laravel.git
     update=no
   sudo: yes
   sudo_user: www-data
   register: cloned

 - name: install composer
   shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
   args:
     creates: /usr/local/bin/composer

 - name: composer create-project
   composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no
   sudo: yes
   sudo_user: www-data
   when: cloned|changed

 - name: set APP_DEBUG=false
   lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false

 - name: set APP_ENV=production
   lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production

 - name: Configure nginx
   template: src=nginx.conf dest=/etc/nginx/sites-available/default
   notify:
     - restart php5-fpm
     - restart nginx

 handlers:
   - name: restart php5-fpm
     service: name=php5-fpm state=restarted

   - name: restart nginx
     service: name=nginx state=restarted

プレイブックを保存して再度実行します。

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

完了したら、ブラウザに戻って更新します。 Laravelの新しいプロジェクトページが表示されます。

結論

このチュートリアルでは、パブリックリポジトリを使用したPHPアプリケーションのデプロイについて説明します。 Ansibleがどのように機能するかを学習するには最適ですが、常にオープンなリポジトリを備えた完全なオープンソースプロジェクトに取り組むとは限りません。 これは、プライベートリポジトリでステップ3の `+ git clone +`を認証する必要があることを意味します。 これは、SSHキーを使用して非常に簡単に実行できます。

たとえば、SSHデプロイキーを作成してリポジトリに設定したら、Ansibleを使用して、 `+ git clone +`タスクの前にそれらをサーバーにコピーして設定できます。

- name: create /var/www/.ssh/ directory
 file: dest=/var/www/.ssh/ state=directory owner=www-data group=www-data mode=0700

- name: copy private ssh key
 copy: src=deploykey_rsa dest=/var/www/.ssh/id_rsa owner=www-data group=www-data mode=0600

これにより、サーバーがアプリケーションを正しく認証およびデプロイできるようになります。

” ” ‘

Composerを使用して依存関係を管理するUbuntuベースのNginx Webサーバーに基本的なPHPアプリケーションをデプロイしました! これらはすべて、PHPドロップレットに直接ログインし、1つの手動コマンドを実行する必要なく完了しています。