Ubuntu 14.04でDrupalのインストールを自動化するAnsible Playbookを作成する方法

前書き

Ansibleは、システム管理者がインフラストラクチャ管理アクティビティを自動化するために使用する構成管理ツールです。

AnsibleはSSHのみを使用してリモートでコマンドを実行するため、リモートサーバーにエージェントは必要ありません。 これにより、管理対象サーバーにエージェントをインストールしたくない場合、PuppetやChefなどの他の一般的なツールよりもAnsibleの方が適しています。

さらに、Ansibleは他のツールが使用するより強力なプログラミング言語よりも単純なYAML(Yet Another Markup Language)を使用するため、Ansibleを使い始めるのがはるかに簡単です。

Drupalは、インストールに時間がかかりますが自動化が簡単な人気のあるCMSです。 このチュートリアルでは、Drupalのインストールと構成、およびUbuntu 14.04を実行するシステムへのすべての依存関係を自動化するAnsible Playbookを作成します。

前提条件

次のものが必要です。

  • Ubuntu 14.04サーバー(SSH経由でアクセス可能);このサーバーは、AnsibleとDrupalのローカルコピーを実行します

  • オプション:Drupalをインストールする追加のUbuntu 14.04サーバー

  • 各サーバーのsudoユーザー。 Drupalをインストールするサーバーごとにsame usernamesame passwordを使用する必要があります

  • Drupalインストールの仕組みの基本的な理解。 Drupalをプレインストールする必要はありませんが、How To Install Drupal on an Ubuntu 14.04 Server with Apacheを参照できます。

[[step-1 -—- install-ansible]] ==ステップ1—Ansibleをインストールします

Ansibleは、apt-getが使用するデフォルトのリポジトリでは使用できません。 したがって、リポジトリppa:rquillo/ansibleを追加します。

sudo add-apt-repository ppa:rquillo/ansible

プロンプトが表示されたらEnterキーを押します。

パッケージリストを更新します。

sudo apt-get update

Ansibleをインストールします。

sudo apt-get install ansible

[[step-2 -—- create-a-directory-for-the-playbook]] ==ステップ2—Playbookのディレクトリを作成します

Ansibleの命令セットは、プレイブックと呼ばれます。 すべてのプレイブックを単一のディレクトリに保存することをお勧めします。 MyPlaybooksという名前のディレクトリを作成します。

mkdir ~/MyPlaybooks

プレイブックにdrupal_setupという名前を付けましょう。 drupal_setupという名前の新しいディレクトリを作成します。

mkdir ~/MyPlaybooks/drupal_setup

[[step-3 -—- create-a-hosts-file]] ==ステップ3—ホストファイルを作成します

各プレイブックには通常、使用するサーバーの名前を含むhostsファイルがあります。

このチュートリアルでは、Drupalをlocalhostと他の1つのサーバーdrupal_serverにインストールします。 このファイルにサーバーを自由に追加できます。 追加するサーバーはすべて、SSH経由でアクセス可能である必要があります。

nanoを使用して、hostsという名前のファイルを作成および編集します。

nano ~/MyPlaybooks/drupal_setup/hosts

次のコンテンツを用意します。

[drupal_hosts]
localhost
drupal_server_ip

drupalserveripを2番目のサーバーのIPアドレスに置き換える必要があります。 ここには、必要な数だけIPアドレスをリストできます。このプレイブックを使用して、任意の数のUbuntu 14.04サーバーにDrupalをインストールできます。

Note:hostsファイルは、将来このプレイブックを再利用してより多くのDrupalサーバーを構成する場合に更新する必要があるファイルです。 プレイブックを再実行する前に、リストから構成済みのサーバーを削除し、新しいサーバーIPを追加する必要があることに注意してください。

ファイルを保存して閉じます。

[[step-4 -—- create-a-role-to-apt-get-update]] ==ステップ4—apt-getupdateのロールを作成します

Playbookのすべてのロールを保存する新しいディレクトリを作成します。

mkdir ~/MyPlaybooks/drupal_setup/roles

他の作業を行う前にサーバーをapt-getで更新する必要があるため、ロールupdateのディレクトリを作成します。

mkdir ~/MyPlaybooks/drupal_setup/roles/update

各役割には1つ以上のタスクがあります。 この役割に関連付けられているすべてのタスクを保持するために、tasksという名前のディレクトリを作成します。

mkdir ~/MyPlaybooks/drupal_setup/roles/update/tasks

nanoを使用して、main.ymlという名前の新しいタスクファイルを作成および編集します。 これは、Ansibleにこのロールを実行するときに何をすべきかを伝えるファイルです。

nano ~/MyPlaybooks/drupal_setup/roles/update/tasks/main.yml

このファイルで、Ansibleのaptモジュールを使用してシステムを更新します。

---

- name: apt-get update the server
  apt: update_cache=yes

ファイルに余分な空白がないことを確認してください。 Ansibleはこれについてうるさいです。 ファイルを保存して閉じます。

[[step-5 -—- create-a-role-to-set-up-php]] ==ステップ5—PHPをセットアップするためのロールを作成する

ロールphpのディレクトリを作成します。

mkdir ~/MyPlaybooks/drupal_setup/roles/php

このロールのtasksディレクトリを作成します。

mkdir ~/MyPlaybooks/drupal_setup/roles/php/tasks

Drupalには、PHPを使用するように構成されたWebサーバーが必要です。 このチュートリアルでは、Apacheを使用します。 PHPをインストールすると、Apacheが自動的にインストールされるため、追加のコマンドは必要ありません。

nanoを使用して、phpロールのmain.ymlを作成および編集します。

nano ~/MyPlaybooks/drupal_setup/roles/php/tasks/main.yml

Ansibleのaptモジュールを使用して、PHP5(およびそれが依存するパッケージ)とPHP5GDライブラリをインストールします。 ファイルに次を追加します。

---

- name: Install PHP and associated packages
  apt: name=php5 state=latest

- name: Install PHP GD library
  apt: name=php5-gd state=latest
  notify:
    - Restart Apache

PHP GDライブラリをインストールした後、Apacheを再起動する必要があります。 したがって、このロールにはハンドラーも必要です。

ロールのすべてのハンドラーは別のディレクトリに保存されます。 現在のロール用にhandlersという名前のディレクトリを作成します。

mkdir ~/MyPlaybooks/drupal_setup/roles/php/handlers

nanoを使用して、main.ymlファイルを作成および編集します。

nano ~/MyPlaybooks/drupal_setup/roles/php/handlers/main.yml

次のコードを追加してください。

---

- name: Restart Apache
  service: name=apache2 state=restarted

PHPとApacheのセットアップが完了しました。

[[step-6 -—- create-a-role-to-set-up-mysql]] ==ステップ6—MySQLをセットアップするためのロールを作成する

Drupalには、設定とコンテンツを保存するデータベースが必要です。 このチュートリアルでは、MySQLを使用します。

この役割とそのタスクのディレクトリを作成します。

mkdir -p ~/MyPlaybooks/drupal_setup/roles/mysql/tasks

このロールの最初のタスクは、MySQLとその依存関係をインストールします。 nanoを使用して、setup.ymlという名前のファイルを作成および編集します。

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/setup.yml

このファイルでは、Ansibleにaptモジュールを再度使用してインストールするように指示します。

  • mysql-server

  • libapache2-mod-auth-mysql

  • php5-mysql

そのため、ファイルに次を追加します。

---

- name: Install MySQL server
  apt: name=mysql-server state=latest

- name: Install Apache module for MySQL authentication
  apt: name=libapache2-mod-auth-mysql state=latest

- name: Install MySQL module for PHP
  apt: name=php5-mysql state=latest

このロールには、もう1つのタスクファイルがあります。 Drupalには独自のMySQLデータベースとデータベースユーザーが必要なので、それらを作成するために個別のタスクファイルを作成します。 nanoを使用して、create_db.ymlという名前のファイルを作成および編集します。

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/create_db.yml

Ansibleには、MySQLを管理できるモジュールがあります。 このタスクでは、次のモジュールを使用します。

  • mysql_db-Drupal用の新しいデータベースを作成します。

  • mysql_user新しいユーザーを作成し、データベースへのアクセスを許可します。

mysql_dbまたはmysql_userを使用する前に、Python MySQLdbパッケージがリモートホストにインストールされていることを確認する必要があります。 aptモジュールを使用してインストールします。

ファイルに次の内容を追加します。

---
- name: Install Python MySQLdb
  apt: name=python-mysqldb state=latest

- name: Create the Drupal database
  mysql_db: db={{ db_name }} state=present

- name: Create the Drupal user
  mysql_user: >
    name={{ db_user }}
    password={{ db_password }}
    priv={{ db_name }}.*:ALL
    host=localhost

\ {\ {}}で囲まれた文字列は変数を示すことに注意してください。 このタスクには、変数{{ db_user }}{{ db_password}}、および{{ db_name }}があります。 これらの変数の値は後のステップで設定します。

次に、このロールには2つのタスクがあることをAnsibleに知らせる必要があります。 これを行うには、main.ymlファイルを作成します。

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/main.yml

このファイルに次のコードを追加します。

---

- include: setup.yml
- include: create_db.yml

[[step-7 -—- create-a-role-to-install-drupal]] ==ステップ7—Drupalをインストールするためのロールを作成する

それでは、Drupal自体のインストールに移りましょう。

この役割とそのタスクのディレクトリを作成します。

mkdir -p ~/MyPlaybooks/drupal_setup/roles/drupal/tasks

nanoを使用して、main.ymlという名前のタスクファイルを作成および編集します。

nano ~/MyPlaybooks/drupal_setup/roles/drupal/tasks/main.yml

このタスクでは、Ansibleに次のアクションを実行するように指示します。

  • リモートホストにgitをインストールします。 これは、Ansibleのgitモジュールを使用するために必要です

  • Ansibleのgitモジュールを使用して、リポジトリのhttp://git.drupal.org/project/drupal.gitからDrupalの最新の安定バージョンを複製します。 ダウンロードしたファイルは/var/www/html/drupalに配置されます

  • デフォルトファイルからsettings.phpおよびservices.ymlファイルを作成します

  • settings.phpservices.yml、およびsites/default/filesのアクセス許可を更新します

ファイルに次のコードを追加します。

---

- name: Install git
  apt: name=git state=latest

- name: Clone Drupal
  git: >
    repo=http://git.drupal.org/project/drupal.git
    dest=/var/www/html/drupal/
    update=no

- name: Create settings.php
  command: cp /var/www/html/drupal/sites/default/default.settings.php /var/www/html/drupal/sites/default/settings.php

- name: Create services.yml
  command: cp /var/www/html/drupal/sites/default/default.services.yml /var/www/html/drupal/sites/default/services.yml

- name: Update permissions of settings.php
  file: path=/var/www/html/drupal/sites/default/settings.php mode=777

- name: Update permissions of services.yml
  file: path=/var/www/html/drupal/sites/default/services.yml mode=777

- name: Update permissions of files directory
  file: >
    path=/var/www/html/drupal/sites/default/files
    mode=777
    state=directory
    recurse=yes

これらのファイルのアクセス許可は、各サーバーでブラウザーのインストールを完了した後で(Ansibleではなく各サーバーで)更新する必要があります。

[[step-8 -—- create-a-file-to-use-all-the-roles]] ==ステップ8—すべての役割を使用するファイルを作成する

この時点で、すべての役割の準備ができました。 これらを使用する必要があります。

nanoを使用して、site.ymlという名前のファイルを作成します。 これは、Ansibleで実際に実行するファイルです。

nano ~/MyPlaybooks/drupal_setup/site.yml

このファイルでは、次のアクティビティを実行します。

  • このPlaybookが実行されるホストを指定します

  • このプレイブックのすべてのタスクを実行するには、sudoを使用する必要があることを指定します

  • さまざまな役割で使用される変数にデフォルト値を設定します

  • すべての役割を実行する

次のコードを追加してください。

---

- hosts: drupal_hosts

  sudo: yes

  vars:
    - db_name: drupal
    - db_user: drupal_user
    - db_password: drupal_db_pass

  roles:
    - update
    - php
    - mysql
    - drupal

変数db_passwordの値をdrupal_db_pass以外に変更してください。 好みに合わせて、他の2つの変数の値も自由に変更できます。

[[ステップ-9 --- ssh接続の確立]] ==ステップ9—SSH接続を確立する

Playbookを実行する前に、~/.ssh/known_hostsファイルにhostsファイルに記載されている各ホストのエントリが含まれている必要があります。

これを行う簡単な方法は、SSHを使用して、このサーバーから~/MyPlaybooks/drupal_setup/hostsファイルにリストされている各サーバーに1回接続することです。

次のコマンドを使用して、SSH経由でlocalhostに接続します。

ssh localhost

この方法でサーバーに初めて接続する場合は、次のメッセージが表示されます。

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is b1:18:3d:19:15:21:39:5a:f7:9f:3c:37:68:ba:62:01.
Are you sure you want to continue connecting (yes/no)?

yesと言うと、次のようなメッセージが表示されます。

Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.

hostsファイルにリストされている他のサーバーに接続します。

ssh drupal_sudo_user@drupal_server_ip

ユーザー名とIPアドレスを各サーバーの実際の情報に置き換えてください。 sudoユーザー名(例ではdrupal_sudo_user)とパスワードは、localhostを含む各サーバーで同じである必要があることに注意してください。

Note:パスワードを使用する代わりに、Ansible server’s sudoユーザーのSSH公開鍵を各管理対象サーバーのdrupal_sudo_user'sauthorized_keysファイルにコピーできます。

各サーバーに接続すると、プレイブックを実行する準備が整います。

[[step-10 -—- run-the-playbook]] ==ステップ10—Playbookを実行します

これで、Playbookをテストする準備ができました。 ansible-playbookコマンドを使用して起動します。 -kオプションは、AnsibleにSSHパスワードの要求を強制します。パスワードなしの認証を設定している場合は、必要ありません。 -Kオプションは、Ansibleにsudoパスワードの要求を強制します。

cd ~/MyPlaybooks/drupal_setup/
ansible-playbook -i hosts site.yml -kK

SSHパスワードを入力し、Playbookの実行を待ちます。 実行が完了すると、サーバーに新しいDrupalがインストールされます。

Note:Ansible server’s sudoユーザーから各管理対象サーバーにSSHキーを追加した場合は、-kフラグを省略できます。

これは実行に数分かかり、Ansibleは各ステップで何をしているかを表示します。

Important:このスクリプトを実行して将来さらにサーバーをセットアップする場合は、~/MyPlaybooks/drupal_setup/hostsファイルから既にセットアップされているサーバーのIPアドレスを削除する必要があります。そうしないと、Ansibleがカスタマイズしたサーバーを上書きします。 Drupalサイト。

[[step-11 -—- set-up-drupal]] ==ステップ11—Drupalを設定する

これで、ブラウザーを使用してDrupalにアクセスし、ブラウザーベースのインストールをhttp://your_server_ip/drupal/で完了することができるようになります。

Drupal Setup Page

Drupalのブラウザーインストーラーの完了についてサポートが必要な場合は、this articleの指示に従ってください。

データベース設定は、~/MyPlaybooks/drupal_setup/site.ymlファイルのvarsセクションで設定した変数になります。

各サーバーでDrupalが正常にインストールされていることを再確認してください。

[[step-12 -—- clean-up-the-host-list]] ==ステップ12—ホストリストをクリーンアップします

~/MyPlaybooks/drupal_setup/hostsファイルからホストを削除する良い機会です。 そうすることで、プレイブックを再度実行した場合、既に設定したホストを誤って上書きすることはありません。

トラブルシューティング

YAMLは空白を区別することに注意してください。 プレイブックに問題がある場合は、.ymlファイルに不適切なインデントまたは余分なスペースがある可能性があります。

次のようなエラーが表示された場合:

fatal: [server-name] => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

これは、~/.ssh/known_hostsファイルに1つ以上のホストのエントリを追加できなかったことを意味します。

最初に、localhostまたはターゲットリモートサーバーに手動でSSH接続する必要があります。 その後、プレイブックを再度実行してください。

結論

このチュートリアルでは、ApacheとMySQLとともに、DrupalをセットアップするAnsibleプレイブックを作成する方法を学びました。 本番システムでこのプレイブックを使用する前に、インストールをより安全にするために、このプレイブックをさらにビルドする必要があります。 PlaybookのDrushコマンドを使用して、Drupalのインストールを管理することもできます。

Related