序章

このチュートリアルは、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 ]。

mysql_userコマンドは、ユーザーの名前と必要な特権を受け入れます。 この例では、laravelというユーザーを作成し、laravelテーブルに対する完全な特権をユーザーに付与します。 また、dbpwd変数のに変更された場合にのみ実行するようにタスクに指示する必要があります。これは、パスワード生成タスクが実行された場合にのみ行われます。

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

新しいAnsibleタスク
- name: Create MySQL User
  mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present
  when: dbpwd.changed

これをまとめて、php.ymlファイルを開いて編集し、上記のタスクを追加できるようにします。

  1. nano php.yml

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

更新された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
    - makepasswd
  notify:
    - restart php5-fpm
    - restart nginx

. . .

次に、パスワードの生成、MySQLデータベースの作成、およびユーザー作成のタスクを下部に追加します。

更新されたphp.yml
. . .

  - name: UFW limit SSH
    ufw: rule=limit port=ssh

  - name: UFW open HTTP
    ufw: rule=allow port=http

  - name: Create MySQL DB
    mysql_db: name=laravel state=present

  - name: Generate DB password
    shell: makepasswd --chars=32
    args:
      creates: /var/www/laravel/.dbpw
    register: dbpwd

  - name: Create MySQL User
    mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present
    when: dbpwd.changed

  handlers:

. . .

まだプレイブックを実行しないでください! MySQLユーザーとデータベースを作成しましたが、パスワードを使用して何もしていないことに気付いたかもしれません。 これについては、次のステップで説明します。 Ansible内でshellタスクを使用する場合、手動でログインして状態をリセットする必要がないように、タスクを実行する前に、タスクの出力/結果を処理するワークフロー全体を完了することを忘れないでください。

ステップ6—データベース用のPHPアプリケーションの構成

このステップでは、MySQLデータベースのパスワードをアプリケーションの.envファイルに保存します。

前回のチュートリアルと同様に、.envファイルを更新して、新しく作成したデータベースの資格情報を含めます。 デフォルトでは、Laravelの.envファイルには次の行が含まれています。

Laravel.envファイル
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

DB_HOST行はそのままにしておくことができますが、次のタスクを使用して他の3つを更新します。これは、前のチュートリアルでAPP_ENVAPP_DEBUG

新しいAnsibleタスク
- name: set DB_DATABASE
  lineinfile: dest=/var/www/laravel/.env regexp='^DB_DATABASE=' line=DB_DATABASE=laravel

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

- name: set DB_PASSWORD
  lineinfile: dest=/var/www/laravel/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ dbpwd.stdout }}
  when: dbpwd.changed

MySQLユーザー作成タスクで行ったように、生成されたパスワード変数(dbpwd.stdout)を使用してファイルにパスワードを入力し、whenオプションを追加して実行のみを保証しますdbpwdが変更されたとき。

ここで、パスワード生成タスクを追加する前に.envファイルがすでに存在していたため、パスワードを別のファイルに保存する必要があります。 生成タスクは、そのファイルの存在を探すことができます(これはタスク内ですでに設定されています)。 また、sudoおよびsudo_userオプションを使用して、www-dataユーザーとしてファイルを作成するようにAnsibleに指示します。

新しいAnsibleタスク
- name: Save dbpw file
  lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present
  sudo: yes
  sudo_user: www-data
  when: dbpwd.changed

php.ymlファイルを開いて編集します。

  1. nano php.yml

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

更新されたphp.yml

. . .

  - name: Create MySQL User
    mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present
    when: dbpwd.changed

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

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

  - name: set DB_PASSWORD
    lineinfile: dest=/var/www/laravel/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ dbpwd.stdout }}
    when: dbpwd.changed

  - name: Save dbpw file
    lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present
    sudo: yes
    sudo_user: www-data
    when: dbpwd.changed

  handlers:

. . .

繰り返しますが、まだプレイブックを実行しないでください!プレイブックを実行する前に、もう1つのステップを完了する必要があります。

ステップ7—データベースの移行

このステップでは、データベース移行を実行してデータベーステーブルを設定します。

Laravelでは、これはmigrateコマンドを実行することによって行われます(すなわち php artisan migrate --force)Laravelディレクトリ内。 production環境で必要なため、--forceフラグを追加したことに注意してください。

これを実行するためのAnsibleタスクは次のようになります。

新しいAnsibleタスク
  - name: Run artisan migrate
    shell: php /var/www/laravel/artisan migrate --force
    sudo: yes
    sudo_user: www-data
    when: dbpwd.changed

次に、プレイブックを更新します。 php.ymlファイルを開いて編集します。

  1. nano php.yml

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

更新されたphp.yml
. . .

  - name: Save dbpw file
    lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes   state=present
    sudo: yes
    sudo_user: www-data
    when: dbpwd.changed

  - name: Run artisan migrate
    shell: php /var/www/laravel/artisan migrate --force
    sudo: yes
    sudo_user: www-data
    when: dbpwd.changed

  handlers:

. . .

最後に、プレイブックを保存して実行できます。

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

それが実行を終了したら、ブラウザでページを更新すると、次のメッセージが表示されます。

http:// <^> your_server_ip <^> /
Queue: NO
Cron: NO

これは、データベースが正しくセットアップされ、期待どおりに機能していることを意味しますが、cronタスクまたはキューデーモンはまだセットアップされていません。

ステップ8—cronタスクの構成

このステップでは、構成が必要なcronタスクを設定します。

cronタスクは、設定されたスケジュールで実行されるコマンドであり、メンテナンスタスクの実行や電子メールアクティビティの更新の送信など、アプリケーションの任意の数のタスクを実行するために使用できます。基本的に、ユーザーが手動で介入することなく定期的に実行する必要があります。 cronタスクは、毎分、または必要に応じてまれに実行できます。

Laravelには、デフォルトでschedule:runと呼ばれるArtisanコマンドが付属しています。このコマンドは、毎分実行されるように設計されており、アプリケーション内で定義されたスケジュールされたタスクを実行します。 これは、アプリケーションがこの機能を利用している場合、追加する必要があるcronタスクは1つだけであることを意味します。

Ansibleにはcronモジュールがあり、cronを介して構成できるさまざまなオプションに直接変換されるさまざまなオプションがあります。

  • job:実行するコマンド。 state=presentの場合に必要です。
  • minutehourdaymonth、およびweekday:分、時間、日、月、または曜日それぞれ、ジョブを実行するタイミング。
  • special_timerebootyearlyannuallymonthlyweeklydaily、[ X77X] ):特別な時間指定のニックネーム。

デフォルトでは、毎分実行されるタスクが作成されます。これは私たちが望んでいることです。 これは、必要なタスクが次のようになることを意味します。

新しいAnsibleタスク
- name: Laravel Scheduler
  cron: >
    job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1"
    state=present
    user=www-data
    name="php artisan schedule:run"

run-oneコマンドは、Ubuntuの小さなヘルパーであり、コマンドが1回だけ実行されるようにします。 これは、前のschedule:runコマンドがまだ実行されている場合、それが再度実行されないことを意味します。 これは、cronタスクがループでロックされ、サーバーがリソースを使い果たすまで、時間の経過とともに同じタスクのインスタンスがますます開始される状況を回避するのに役立ちます。

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

  1. nano php.yml

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

更新されたphp.yml
. . .

  - name: Run artisan migrate
    shell: php /var/www/laravel/artisan migrate --force
    sudo: yes
    sudo_user: www-data
    when: dbpwd.changed

  - name: Laravel Scheduler
    cron: >
      job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1"
      state=present
      user=www-data
      name="php artisan schedule:run"

  handlers:

. . .

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

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

次に、ブラウザでページを更新します。 すぐに、次のように更新されます。

http:// <^> your_server_ip <^> /
Queue: NO
Cron: YES

これは、cronがバックグラウンドで正しく機能していることを意味します。 サンプルアプリケーションの一部として、毎分実行されているcronジョブがあり、データベースのステータスエントリを更新して、アプリケーションが実行中であることを認識します。

ステップ9—キューデーモンの設定

手順8のschedule:runArtisanコマンドと同様に、Laravelにはqueue:work --daemonArtisanコマンドで開始できるキューワーカーも付属しています。 このステップでは、Laravelのキューデーモンワーカーを構成します。

キューワーカーは、バックグラウンドでタスクを実行するという点でcronジョブに似ています。 違いは、アプリケーションが、ユーザーによって実行されたアクションを介して、またはcronジョブを介してスケジュールされたタスクから、ジョブをキューにプッシュすることです。 キュータスクは、ワーカーによって一度に1つずつ実行され、キューで見つかったときにオンデマンドで処理されます。 キュータスクは通常、メールの送信や外部サービスへのAPI呼び出しなど、実行に時間がかかる作業に使用されます。

schedule:runコマンドとは異なり、これは毎分実行する必要のあるコマンドではありません。 代わりに、常にバックグラウンドでデーモンとして実行する必要があります。 これを行う一般的な方法は、supervisord のようなサードパーティのパッケージを使用することですが、その方法では、システムの構成と管理の方法を理解する必要があります。 cronとrun-oneコマンドを使用して実装するもっと簡単な方法があります。

キューワーカーデーモンを起動するためのcronエントリを作成し、run-oneを使用して実行します。 これは、cronが最初に実行されたときにプロセスを開始し、それ以降のcronの実行は、ワーカーの実行中にrun-oneによって無視されることを意味します。 ワーカーが停止するとすぐに、run-oneはコマンドの再実行を許可し、キューワーカーが再開します。 これは非常にシンプルで使いやすい方法であり、別のツールを構成して使用する方法を学ぶ必要がありません。

これらすべてを念頭に置いて、キューワーカーを実行するための別のcronタスクを作成します。

新しいAnsibleタスク
- name: Laravel Queue Worker
  cron: >
    job="run-one php /var/www/laravel/artisan queue:work --daemon --sleep=30 --delay=60 --tries=3 1>> /dev/null 2>&1"
    state=present
    user=www-data
    name="Laravel Queue Worker"

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

  1. nano php.yml

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

更新されたphp.yml
. . .

  - name: Laravel Scheduler
    cron: >
      job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1"
      state=present
      user=www-data
      name="php artisan schedule:run"

  - name: Laravel Queue Worker
    cron: >
      job="run-one php /var/www/laravel/artisan queue:work --daemon --sleep=30 --delay=60 --tries=3 1>> /dev/null 2>&1"
      state=present
      user=www-data
      name="Laravel Queue Worker"

  handlers:
. . .

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

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

以前と同様に、ブラウザでページを更新します。 1分後、次のように更新されます。

http:// <^> your_server_ip <^> /
Queue: YES
Cron: YES

これは、キューワーカーがバックグラウンドで正しく機能していることを意味します。 最後のステップで開始したcronジョブは、ジョブをキューにプッシュします。 このジョブは、実行時にデータベースを更新して、データベースが機能していることを示します。

これで、機能するcronジョブとキューワーカーを含む実際のLaravelアプリケーションの例ができました。

結論

このチュートリアルでは、PHPアプリケーションのデプロイにAnsibleを使用する際のより高度なトピックのいくつかについて説明しました。 使用するすべてのタスクは、ほとんどのPHPアプリケーションに合わせて簡単に変更でき(特定の要件に応じて)、アプリケーション用に独自のプレイブックを設定するための良い出発点になるはずです。

このチュートリアルの一部として(www-dataユーザーログインの確認を除いて)単一のSSHコマンドを使用しておらず、MySQLユーザーパスワードを含むすべてが自動的に設定されています。 このチュートリアルに従うと、アプリケーションの準備が整い、コードの更新をプッシュするツールがサポートされます。