Ubuntu14.04でDrupalのインストールを自動化するためのAnsiblePlaybookを作成する方法
序章
Ansibleは、システム管理者がインフラストラクチャ管理アクティビティを自動化するために使用する構成管理ツールです。
AnsibleはSSHのみを使用してコマンドをリモートで実行するため、リモートサーバーにエージェントは必要ありません。 これにより、管理対象サーバーにエージェントをインストールしたくない場合は、PuppetやChefなどの他の一般的なツールよりもAnsibleの方が適しています。
さらに、Ansibleは他のツールが使用するより強力なプログラミング言語よりも単純なYAML(Yet Another Markup Language)を使用しているため、Ansibleを使い始めるのがはるかに簡単です。
Drupalは人気のあるCMSであり、インストールには時間がかかりますが、自動化は簡単です。 このチュートリアルでは、Drupalのインストールと構成、およびUbuntu14.04を実行するシステムへのすべての依存関係を自動化するAnsiblePlaybookを作成します。
前提条件
次のものが必要になります。
- Ubuntu 14.04サーバー(SSH経由でアクセス可能)。 このサーバーはAnsibleとDrupalのローカルコピーを実行します
- オプション:Drupalをインストールする追加のUbuntu14.04サーバー
- 各サーバーのsudoユーザー。 Drupalをインストールするサーバーごとに、同じユーザー名と同じパスワードを使用する必要があります
- Drupalインストールがどのように機能するかについての基本的な理解。 Drupalをプレインストールする必要はありませんが、Apacheを使用してUbuntu14.04サーバーにDrupalをインストールする方法を参照できます。
ステップ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
ステップ2—プレイブックのディレクトリを作成する
Ansibleの命令セットはプレイブックと呼ばれます。 すべてのプレイブックを1つのディレクトリに保存することをお勧めします。 MyPlaybooksという名前のディレクトリを作成します。
mkdir ~/MyPlaybooks
プレイブックにdrupal_setup
という名前を付けましょう。 drupal_setup
という名前の新しいディレクトリを作成します。
mkdir ~/MyPlaybooks/drupal_setup
ステップ3—ホストファイルを作成する
各プレイブックには通常、使用するサーバーの名前を含むhosts
ファイルがあります。
このチュートリアルでは、Drupalをlocalhostと他の1つのサーバーdrupal_serverにインストールします。 このファイルにサーバーを追加するのは自由です。 追加するすべてのサーバーは、SSH経由でアクセスできる必要があることを忘れないでください。
nano を使用して、hosts
という名前のファイルを作成および編集します。
nano ~/MyPlaybooks/drupal_setup/hosts
次の内容にします。
[drupal_hosts]
localhost
drupal_server_ip
drupal_server_ipを2番目のサーバーのIPアドレスに置き換える必要があります。 ここには、必要な数のIPアドレスをリストできます。 このプレイブックを使用して、任意の数のUbuntu14.04サーバーにDrupalをインストールできます。
注:
hosts
ファイルは、将来このプレイブックを再利用してより多くのDrupalサーバーを構成する場合に更新する必要があるファイルです。 プレイブックを再実行する前に、構成済みのサーバーをリストから削除し、新しいサーバーIPを追加する必要があることに注意してください。
ファイルを保存して閉じます。
ステップ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はこれについてうるさいです。 ファイルを保存して閉じます。
ステップ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のセットアップは完了です。
ステップ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
ステップ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.php
、services.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ではなく各サーバー)へのブラウザーのインストールが完了した後で更新する必要があります。
ステップ8—すべての役割を使用するファイルを作成する
この時点で、すべての役割の準備が整いました。 今、それらを使用する必要があります。
nano を使用して、site.yml
という名前のファイルを作成します。 これは、Ansibleで実際に実行するファイルです。
nano ~/MyPlaybooks/drupal_setup/site.yml
このファイルでは、次のアクティビティを実行します。
- このプレイブックを実行するホストを指定します
- このハンドブックのすべてのタスクを実行するには、
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接続を確立する
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を含む各サーバーで同じである必要があることに注意してください。
注:パスワードを使用する代わりに、AnsibleサーバーのsudoユーザーのSSH公開鍵を各管理対象の
drupal_sudo_user's
authorized_keys
ファイルにコピーできます。サーバ。
各サーバーに接続すると、プレイブックを実行する準備が整います。
ステップ10—ハンドブックを実行する
これで、Playbookをテストする準備が整いました。 ansible-playbook
コマンドを使用して発射します。 -k
オプションは、AnsibleにSSHパスワードの要求を強制します。パスワードなしの認証を設定している場合は、必要ありません。 -K
オプションは、Ansibleにsudo
パスワードの要求を強制します。
cd ~/MyPlaybooks/drupal_setup/
ansible-playbook -i hosts site.yml -kK
SSHパスワードを入力し、Playbookが実行されるのを待ちます。 実行が完了すると、サーバーにDrupalが新たにインストールされます。
注:Ansibleサーバーのsudoユーザーから各管理対象サーバーにSSHキーを追加した場合は、 -k
フラグを省略できます。
これは実行に数分かかり、Ansibleは各ステップで何をしているかを示します。
重要:このスクリプトを実行して将来さらにサーバーをセットアップする場合は、
~/MyPlaybooks/drupal_setup/hosts
ファイルまたはAnsibleから既にセットアップされているサーバーのIPアドレスを削除する必要がありますカスタマイズしたDrupalサイトを上書きします。
ステップ11—Drupalをセットアップする
これで、http://your_server_ip/drupal/
で、ブラウザーを使用してDrupalにアクセスし、ブラウザーベースのインストールを完了することができるようになります。
Drupalのブラウザーインストーラーの完了についてサポートが必要な場合は、この記事の手順に従ってください。
データベース設定は、~/MyPlaybooks/drupal_setup/site.yml
ファイルのvars
セクションで設定した変数になります。
各サーバーにDrupalが正常にインストールされていることを再確認してください。
ステップ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プレイブックを作成する方法を学びました。 このハンドブックを実動システムで使用する前に、インストールをより安全にするために、このプレイブックをさらに構築する必要があります。 プレイブックのDrushコマンドを使用して、Drupalのインストールを管理することもできます。