序章

このチュートリアルは、Ubuntu14.04でAnsibleを使用してPHPアプリケーションをデプロイすることに関するシリーズの2番目です。 最初のチュートリアルは、アプリケーションをデプロイするための基本的な手順をカバーしており、このチュートリアルで概説されている手順の開始点です。

このチュートリアルでは、コード展開/公開ツールをサポートするためのSSHキーの設定、システムファイアウォールの構成、データベースのプロビジョニングと構成(パスワードを含む)、およびタスクスケジューラ(cron)とキューデーモンの設定について説明します。 このチュートリアルの最後の目標は、前述の高度な構成で完全に機能するPHPアプリケーションサーバーを用意することです。

前回のチュートリアルと同様に、PHPアプリケーションの例としてLaravelフレームワークを使用します。 ただし、これらの手順は、すでに独自のフレームワークやアプリケーションを持っている場合は、他のフレームワークやアプリケーションをサポートするように簡単に変更できます。

前提条件

このチュートリアルは、シリーズの最初のチュートリアルの最後から直接続き、そのチュートリアル用に生成されたすべての構成とファイルが必要です。 そのチュートリアルをまだ完了していない場合は、このチュートリアルを続行する前に、まず完了してください。

ステップ1—アプリケーションリポジトリを切り替える

このステップでは、Gitリポジトリを少しカスタマイズされたサンプルリポジトリに更新します。

デフォルトのLaravelインストールでは、このチュートリアルで設定する高度な機能は必要ないため、既存のリポジトリを標準リポジトリから、デバッグコードが追加されたサンプルリポジトリに切り替えて、動作していることを示します。 。 使用するリポジトリはhttps://github.com/do-community/do-ansible-adv-phpにあります。

まだ行っていない場合は、前のチュートリアルのディレクトリをansible-phpに変更してください。

  1. cd ~/ansible-php/

既存のプレイブックを開いて編集します。

  1. nano php.yml

「Gitリポジトリのクローン作成」タスクを見つけて更新すると、次のようになります。

更新されたAnsibleタスク
- 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

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

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

実行が終了したら、Webブラウザでサーバーにアクセスします(つまり、 http://your_server_ip/)。 「ドライバーが見つかりませんでした」というメッセージが表示されます。

これは、デフォルトのリポジトリをサンプルリポジトリに正常にスワップアウトしたが、アプリケーションがデータベースに接続できないことを意味します。 これは私たちがここで見ることを期待しているものであり、チュートリアルの後半でデータベースをインストールしてセットアップします。

ステップ2—展開用のSSHキーの設定

このステップでは、アプリケーションコード展開スクリプトに使用できるSSHキーを設定します。

Ansibleは構成の維持とサーバーとアプリケーションのセットアップに最適ですが、EnvoyRocketeerなどのツールは、コードの変更をサーバーにプッシュし、アプリケーションコマンドをリモートで実行するためによく使用されます。 これらのツールのほとんどは、アプリケーションのインストールに直接アクセスできるSSH接続を必要とします。 この場合、これはwww-dataユーザーのSSHキーを構成する必要があることを意味します。

コードをプッシュするユーザーの公開鍵ファイルが必要になります。 このファイルは通常、~/.ssh/id_rsa.pubにあります。 そのファイルをansible-phpディレクトリにコピーします。

  1. cp ~/.ssh/id_rsa.pub ~/ansible-php/deploykey.pub

Ansible authorized_keyモジュールを使用して、公開鍵を/var/www/.ssh/authorized_keys内にインストールできます。これにより、デプロイメントツールがアプリケーションに接続してアクセスできるようになります。 構成は、ルックアップを使用してキーがどこにあるかを知る必要があるだけであり、ユーザーはキーをインストールする必要があります(この場合はwww-data)。

新しいAnsibleタスク
- name: Copy public key into /var/www
  authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}"

また、実際にログインできるように、www-dataユーザーのシェルを設定する必要があります。 それ以外の場合、SSHは接続を許可しますが、ユーザーにシェルは表示されません。 これは、userモジュールを使用し、シェルを/bin/bash(またはお好みのシェル)に設定することで実行できます。

新しいAnsibleタスク
- name: Set www-data user shell
  user: name=www-data shell=/bin/bash

次に、編集用のプレイブックを開いて、新しいタスクを追加します。

  1. nano php.yml

上記のタスクを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:
  
. . .

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

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

Ansibleが終了すると、www-dataユーザーを使用してSSHで接続できるようになります。

  1. 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モジュールには、さまざまなタスクを実行するさまざまなオプションがあります。 実行する必要のあるさまざまなタスクは次のとおりです。

  1. デフォルトでは、UFWを有効にして、すべての着信トラフィックを拒否します。

  2. SSHポートを開きますが、ブルートフォース攻撃を防ぐためにレート制限します。

  3. HTTPポートを開きます。

これは、それぞれ次のタスクで実行できます。

新しいAnsibleタスク
- 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ファイルを開いて編集します。

  1. nano php.yml

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

更新された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:
  
. . .

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

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

それが正常に完了しても、SSH(Ansibleを使用)またはHTTP経由でサーバーに接続できるはずです。 他のポートはブロックされます。

次のコマンドを実行することにより、いつでもUFWのステータスを確認できます。

  1. ansible php --sudo --ask-sudo-pass -m shell -a "ufw status verbose"

上記のAnsibleコマンドの内訳:

  • ansible:プレイブックなしで生のAnsibleタスクを実行します。
  • php:このグループのホストに対してタスクを実行します。
  • --sudo:コマンドをsudoとして実行します。
  • --ask-sudo-passsudoパスワードの入力を求めます。
  • -m shellshellモジュールを実行します。
  • -a "ufw status verbose":モジュールに渡されるオプション。 これはshellコマンドであるため、rawコマンドを渡します(つまり、 ufw status verbosekey=valueオプションなしでまっすぐに。

このようなものが返されるはずです。

UFWステータス出力
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-servermysql-client、およびphp5-mysqlです。 AnsibleがMySQLと通信できるように、python-mysqldbも必要になります。

パッケージを追加しているので、nginxphp5-fpmを再起動して、新しいパッケージがアプリケーションで使用できるようにする必要があります。 この場合、データベースに接続できるように、MySQLをPHPで使用できるようにする必要があります。

Ansibleの素晴らしい点の1つは、任意のタスクを変更してプレイブックを再実行すると、変更が適用されることです。 これには、aptタスクの場合と同様にオプションのリストが含まれます。

前と同じように、php.ymlファイルを開いて編集します。

  1. nano php.yml

install packagesタスクを見つけて、上記のパッケージを含むように更新します。

更新されたphp.yml
. . .

- 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

. . .

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

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

ステップ5—MySQLデータベースを設定する

このステップでは、アプリケーション用のMySQLデータベースを作成します。

Ansibleは、mysql_で始まるモジュールを使用してMySQLと直接通信できます(例: mysql_dbmysql_user)。 mysql_dbモジュールは、特定の名前のデータベースが存在することを確認する方法を提供するため、このようなタスクを使用してデータベースを作成できます。

新しいAnsibleタスク
- name: Create MySQL DB
  mysql_db: name=laravel state=present

また、アプリケーションがデータベースに接続できるようにするには、既知のパスワードを持つ有効なユーザーアカウントが必要です。 これに対する1つのアプローチは、パスワードをローカルで生成してAnsibleプレイブックに保存することですが、それは安全ではなく、より良い方法があります。

サーバー自体でAnsibleを使用してパスワードを生成し、必要な場所で直接使用します。 パスワードを生成するには、makepasswdコマンドラインツールを使用して、32文字のパスワードを要求します。 makepasswdはUbuntuのデフォルトではないため、パッケージリストにも追加する必要があります。

また、コマンドの出力を記憶するようにAnsibleに指示します(つまり、 パスワード)なので、後でプレイブックで使用できます。 ただし、Ansibleはshellコマンドを既に実行しているかどうかを認識しないため、そのコマンドを実行するときにファイルも作成します。 Ansibleはファイルが存在するかどうかをチェックし、存在する場合は、コマンドがすでに実行されていると見なし、再度実行することはありません。

タスクは次のようになります。

新しいAnsibleタスク
- name: Generate DB password
  shell: makepasswd --chars=32
  args:
    creates: /var/www/laravel/.dbpw
  register: dbpwd

次に、指定したパスワードを使用して実際のMySQLデータベースユーザーを作成する必要があります。 これはmysql_userモジュールを使用して行われ、パスワード生成タスク中に定義した変数でstdoutオプションを使用して、次のようにシェルコマンドの生の出力を取得できます。[X195X ]