こんにちわ。昨日飲み過ぎたonagataniです。こんにちわ。
さて、今日は12月8日ということでMT AdventCalenderの8日目です。
今回は僕が公開している(というか昨日公開したw)Movable TypeのサーバをEC2上に構築するAnsible-Playbookを紹介します。本番環境を想定して作っているので是非ご利用下さい。
https://github.com/onagatani/ansible-playbook-AmazonLinuxMovableType
MT-AMIのApache版は有償しかないですが、パッケージ版は個人利用の場合にはライセンス無償なのでお財布にも優しいですね。
ちなみに対象インスタンスはどれでも大丈夫ですが一応t2.midiumとしておきます。
Macのterminalを開き以下のようにpipコマンドで導入して下さい
http://docs.ansible.com/ansible/intro_installation.html#latest-releases-via-pip
なお、自分のmac(10.9.5)ではhomebrewでインストールされるAnsibleのバージョンが1.9.3でした。1.9.3はバグがあるためhomebrewは使用せずにpipでAnsibleを導入しましたが、皆さんの環境も1.9.3の場合はpipでインストールする事をおすすめします。
https://github.com/ansible/ansible-modules-core/issues/2013
$ ssh-keygen -t rsa
コマンドを実行するとファイルを設置する場所を聞かれますので、./username(任意) と入力して下さい。
次にSSH(SFTP)接続時のパスフレーズを聞かれますので任意で入力します(パスフレーズを紛失すると使えなくなりますのでメモして下さい)。SSH・SFTP用に2つ作成して下さい。
※スナップショットやMySQLDumpが必要なければrootユーザのcronをコメントアウトして下さい。
※スナップショット取得スクリプトはこちらを参考に修正したものを利用しています。
git clone git@github.com:onagatani/ansible-playbook-AmazonLinuxMovableType.git
https://github.com/onagatani/ansible-playbook-AmazonLinuxMovableType/archive/master.zip
解凍しましたらansible-playbook-AmazonLinuxMovableTypeフォルダにターミナルで移動して下さい
以下の各ファイルの該当箇所を作成したいサーバ用に修正して下さい。
192.168.1.XXX => 対象サーバのドメインもしくはIPアドレスに変更する
以下のようにファイルを修正して下さい
server_hostname: "ec2_hostname" => サーバのホスト名になります。例えば本番ならprod_fqdnなどが良いでしょう
root_email: "name@example.com" => サーバからの通知メールの送付先になります。ご自身のメールアドレスにすると良いでしょう
s3bucket: bucket-name => データベースのバックアップファイルを格納するS3のバケット名に変更する
dbbackupdir: db => S3内のデータベース保存ディレクトリ (事前に作成する必要はありません)
mt:
ver: MT-6.2.2 => インストールするMTのバージョンです
adminscript: mt.cgi => mt-configのAdinScriptです
db:
name: movabletype => MT用のデータベース名になります(自動で作成されます)
user: movabletype => MT用のデータベースユーザ名になります(自動で追加されます)
passwd: passwd => MT用のデータベースパスワードになります(自動で設定されます)
basic:
user: 'username' => MT管理画面へのアクセス制限ユーザ名になります
passwd: 'passwd' => MT管理画面へのアクセス制限パスワードになります
vhosts:
- { name: vhost1.example.com } => サーバに設定するドメイン名になります。1つ以上記載して下さい
- { name: vhost2.example.com } => 複数作成可能です
wheel_users:
- { name: "SSHユーザ名", password: "SSHのパスフレーズを記載します", groups: "wheel" } => sudo可能なSSHユーザを追加します。必ず1アカウント以上作成して下さい
sftp_users:
- { name: "SFTP-Onlyユーザ名", password: "SSHのパスフレーズを記載します", groups: "apache,sftponly" } => SFTP専用ユーザを追加します。必ず1アカウント以上作成して下さい
SSHのパスフレーズを記載しますの箇所には事前準備で用意したSSH鍵のパスフレーズをハッシュ化したものを記載します(サーバ内でのsshユーザのパスワードとパスフレーズを共通にします)。ハッシュ化するコマンドは以下です。
$ openssl passwd -1 'SSH(SFTP)ユーザのパスフレーズ'
コマンドを実行するとハッシュ化されたパスフレーズが出力されるのでgroup_vars/allファイルの該当箇所に記載して下さい。
移動先:roles/sshd/files/public_keys/
移動時にはファイル名をユーザ名.pubからユーザ名に変更して下さい。
今回はサンプルとしてPageButeを添付してみました。
$ ansible-playbook -s -i hosts site.yml -u ec2-user --private-key=EC2の鍵ファイル名 --extra-vars "mysql_root_password=mysqlに設定するルートパスワード(任意)"
mysqlのルートパスワードが漏れると大変なのでymlでは管理しないようにしています。
再起動後にブラウザからアクセスするとMTの管理画面に無事にアクセスできると思います。
http://vhost1.example.com/mt/mt.cgi
今回のサーバはPSGIで起動しているのでカスタムフィールドの変更などがうまく適用されない場合はツールメニューからPSGI Restartを使用してMTを再起動して下さい。
なお、運用でサーバに変更を加える場合もあるかと思いますが、playbookを再度適用してしまうとデグレードの原因になりますのでplaybook側を正として運用しサーバ側への変更はansibleで行うようにすると良いかと思います。とはいえ、なかなかそうもいかないと思いますのでapacheのconfは極力触らずにAnsibleの管理外であるコンテンツ側(.htaccess)で対応すると良いと思います。
発行するコマンドは1回ですが、事前の準備等がありAWSやLunuxにある程度精通していないと使えない感じかもしれません。希望があればAWS+MT+Ansibleでサーバ構築ハンズオンでもやりたいなぁと思います。面倒な人は僕に直接相談下さい。お酒飲ませてくれたら助けます。
さて、今日は12月8日ということでMT AdventCalenderの8日目です。
この記事は情報が古くなっています。githubで最新のドキュメントを公開していますので以下のリンク先をご覧下さい。
https://github.com/izanami-team/IZANAMI/blob/master/README.ja.md
今回は僕が公開している(というか昨日公開したw)Movable TypeのサーバをEC2上に構築するAnsible-Playbookを紹介します。本番環境を想定して作っているので是非ご利用下さい。
https://github.com/onagatani/ansible-playbook-AmazonLinuxMovableType
機能・メリット
- オールインワンのMTサーバを自動構築
- 既存のMTライセンスがそのまま使える
- Apacheやmod_phpなどNginxやphp-fpmに慣れていない人にも優しい構成
- AWS用の設定もやってくれます
- バックアップ設定も含めて全部やってくれます(スナップショット・MySQLDump)
- プロダクション環境でも利用可能(自己責任)
- ある程度チューニング済み
- PSGIなのでMTも高速
- ssh用のユーザとSFTP専用のユーザを複数作成可能
MT-AMIのApache版は有償しかないですが、パッケージ版は個人利用の場合にはライセンス無償なのでお財布にも優しいですね。
ちなみに対象インスタンスはどれでも大丈夫ですが一応t2.midiumとしておきます。
使い方
Ansibleの導入
自宅にMacしかないのでMacについて説明しますが、AnsibleはどのOSでもPythonが動けば動くはずです。AmazonLinuxとCentOS、MacOSについてはplaybookの動作確認済みですMacのterminalを開き以下のようにpipコマンドで導入して下さい
http://docs.ansible.com/ansible/intro_installation.html#latest-releases-via-pip
なお、自分のmac(10.9.5)ではhomebrewでインストールされるAnsibleのバージョンが1.9.3でした。1.9.3はバグがあるためhomebrewは使用せずにpipでAnsibleを導入しましたが、皆さんの環境も1.9.3の場合はpipでインストールする事をおすすめします。
https://github.com/ansible/ansible-modules-core/issues/2013
SSHユーザの作成
今回使用するplaybookではSSH(SFTP)接続のユーザを最低2ユーザ作成します。サーバの管理者用とコンテンツ管理用(SFTPオンリー)になります。以下のコマンドをmacのターミナルで実行してSSH(SFTP)接続時の鍵を事前に作成します。以下に例を記載しておきます。$ ssh-keygen -t rsa
コマンドを実行するとファイルを設置する場所を聞かれますので、./username(任意) と入力して下さい。
次にSSH(SFTP)接続時のパスフレーズを聞かれますので任意で入力します(パスフレーズを紛失すると使えなくなりますのでメモして下さい)。SSH・SFTP用に2つ作成して下さい。
EC2の準備
AmazonLinuxで起動させます。今回公開しているplaybookではaws cliを使用しますのでEC2にはIAM Role(ec2とS3の権限が必要です)を設定して下さい。S3バケットの用意
S3のデータベースのDumpを保存するバケットを作成して下さい。バックアップローテーションはS3のライフサイクル機能を利用して下さい。EC2スナップショット
今回作成するサーバではcronで毎日定時にスナップショットを取得するように設定されますが。起動したインスタンスに以下のタグをつけて下さい。- backupタグ:ON
- generation:ローテーション数数値で入力
※スナップショットやMySQLDumpが必要なければrootユーザのcronをコメントアウトして下さい。
※スナップショット取得スクリプトはこちらを参考に修正したものを利用しています。
playbookの取得
githubからplaybookのソースを取得します。gitcloneするかzipをダウンロードして解凍して下さい。git clone git@github.com:onagatani/ansible-playbook-AmazonLinuxMovableType.git
https://github.com/onagatani/ansible-playbook-AmazonLinuxMovableType/archive/master.zip
解凍しましたらansible-playbook-AmazonLinuxMovableTypeフォルダにターミナルで移動して下さい
ドメイン等の設定
Ansibleではプロビジョニングされる対象サーバの設定はyamlで変数として設定します。以下の各ファイルの該当箇所を作成したいサーバ用に修正して下さい。
hostsファイル
[movabletype-server]192.168.1.XXX => 対象サーバのドメインもしくはIPアドレスに変更する
group_vars/allファイル
以下のようにファイルを修正して下さい
server_hostname: "ec2_hostname" => サーバのホスト名になります。例えば本番ならprod_fqdnなどが良いでしょう
root_email: "name@example.com" => サーバからの通知メールの送付先になります。ご自身のメールアドレスにすると良いでしょう
s3bucket: bucket-name => データベースのバックアップファイルを格納するS3のバケット名に変更する
dbbackupdir: db => S3内のデータベース保存ディレクトリ (事前に作成する必要はありません)
mt:
ver: MT-6.2.2 => インストールするMTのバージョンです
adminscript: mt.cgi => mt-configのAdinScriptです
db:
name: movabletype => MT用のデータベース名になります(自動で作成されます)
user: movabletype => MT用のデータベースユーザ名になります(自動で追加されます)
passwd: passwd => MT用のデータベースパスワードになります(自動で設定されます)
basic:
user: 'username' => MT管理画面へのアクセス制限ユーザ名になります
passwd: 'passwd' => MT管理画面へのアクセス制限パスワードになります
vhosts:
- { name: vhost1.example.com } => サーバに設定するドメイン名になります。1つ以上記載して下さい
- { name: vhost2.example.com } => 複数作成可能です
wheel_users:
- { name: "SSHユーザ名", password: "SSHのパスフレーズを記載します", groups: "wheel" } => sudo可能なSSHユーザを追加します。必ず1アカウント以上作成して下さい
sftp_users:
- { name: "SFTP-Onlyユーザ名", password: "SSHのパスフレーズを記載します", groups: "apache,sftponly" } => SFTP専用ユーザを追加します。必ず1アカウント以上作成して下さい
SSHのパスフレーズを記載しますの箇所には事前準備で用意したSSH鍵のパスフレーズをハッシュ化したものを記載します(サーバ内でのsshユーザのパスワードとパスフレーズを共通にします)。ハッシュ化するコマンドは以下です。
$ openssl passwd -1 'SSH(SFTP)ユーザのパスフレーズ'
コマンドを実行するとハッシュ化されたパスフレーズが出力されるのでgroup_vars/allファイルの該当箇所に記載して下さい。
authorized_keysの設置
事前準備で実行したssh-keygenコマンドにて、ユーザ名.pubというファイルが生成されているのでこれを以下の場所に移動させます。移動先:roles/sshd/files/public_keys/
移動時にはファイル名をユーザ名.pubからユーザ名に変更して下さい。
MT本体の設置
roles/movabletype/files/以下にMTのzipファイルを設置して下さい。プラグインの設置
roles/movabletype/files/mt-plugins及びmt-static以下に設置したディレクトリやファイルはそのままサーバのplugins及びmt-static以下にコピーされます。今回はサンプルとしてPageButeを添付してみました。
プロビジョニング実行
準備が完了したのでプロビジョニングを実行します。$ ansible-playbook -s -i hosts site.yml -u ec2-user --private-key=EC2の鍵ファイル名 --extra-vars "mysql_root_password=mysqlに設定するルートパスワード(任意)"
mysqlのルートパスワードが漏れると大変なのでymlでは管理しないようにしています。
プロビジョニング終了
終了後は一度サーバをリスタートする事をお勧めします。再起動後にブラウザからアクセスするとMTの管理画面に無事にアクセスできると思います。
http://vhost1.example.com/mt/mt.cgi
今回のサーバはPSGIで起動しているのでカスタムフィールドの変更などがうまく適用されない場合はツールメニューからPSGI Restartを使用してMTを再起動して下さい。
なお、運用でサーバに変更を加える場合もあるかと思いますが、playbookを再度適用してしまうとデグレードの原因になりますのでplaybook側を正として運用しサーバ側への変更はansibleで行うようにすると良いかと思います。とはいえ、なかなかそうもいかないと思いますのでapacheのconfは極力触らずにAnsibleの管理外であるコンテンツ側(.htaccess)で対応すると良いと思います。
MT設定
ドキュメントルートなどは以下になります。- ドキュメントルート:/var/www/vhosts/ドメイン名/htdocs
- MTの設置場所:/var/www/movabletype
- Basic認証パスワードファイル:/var/www/movabletype/basic_passwd
- MT再起動コマンド:sudo svc -du /service/movabletype
発行するコマンドは1回ですが、事前の準備等がありAWSやLunuxにある程度精通していないと使えない感じかもしれません。希望があればAWS+MT+Ansibleでサーバ構築ハンズオンでもやりたいなぁと思います。面倒な人は僕に直接相談下さい。お酒飲ませてくれたら助けます。
コメント