- VMを作成する
- Ansible実行マシンにSSH接続する
- 実行マシン上にAnsibleをインストール
- Playbookをダウンロード
- APIキーを確認する
- 接続設定ファイルを作成
- Ansibleから自動でVMを作成
- 生成されたInventoryファイルを確認
- ansible-playbookを実行
- DBサーバーを作成する
- 新しくDB用サーバーのVMを作成する
- コントロールマシンからSSH接続できることを確認する
- インベントリにグループを追加する
- playbookを編集する
- site.ymlを編集する
- mysql roleを編集する
- wordpress roleを編集する
- 方針
- ヒント
Ansible実行マシンを作成してSSHし、Ansibleをインストールする
- Ansible実行マシン用VMを作成する
- イメージは「CentOS 7.2 64-bit」を使用
- 名前は「ansible-machine」とする
-
- ターミナルを開く
- VM作成時に使った秘密鍵のパーミッションを600に変更する
chmod 600 ssh_private_key
- Ansible実行マシンにSSH接続する
ssh root@xxx.xxx.xxx.xxx -i ssh_private_key
-
- Tera termを起動する
- ホストにはAnsible実行マシンのIPアドレスを入力
- ユーザー名は「root」、秘密鍵にはVM作成時に使った秘密鍵を指定
- エディタをインストールする
- vimやemacsに不慣れな方には nano がオススメです
yum install nano -y
echo 'set const' >> ~/.nanorc
- yumリポジトリにEPELを追加する
yum install epel-release -y
- Ansible, pipをインストール
yum install ansible python-pip -y
- CloudStack API操作に必要なPythonライブラリをインストール
pip install cs sshpubkeys
- ansibleコマンドが使用できることを確認する
ansible[Tab][Tab]
ansible ansible-doc ... ansible-vault
今回のハンズオンで使用するplaybookをダウンロードする
- GitHubの公開リポジトリからgit cloneする
git clone --recursive https://github.com/realglobe-Inc/ansible-demo-playbooks.git
- cdコマンドを使用しディレクトリを移動する
cd ansible-demo-playbooks/wordpress-nginx/
AnsibleからIDCFクラウドが提供するCloudStack APIを操作して、Wordpress設置用VMを作成します。
- Ansible実行マシンからrootもしくはsudo権限を持つユーザーでSSH接続可能
- 外部から80番ポート(HTTP)に接続可能
設定ファイル ~/.cloudstack.ini
を作成し、上で確認した値を使って以下のように編集
[cloudstack]
endpoint = エンドポイント
key = API Key
secret = Secret Key
timeout = 100
プレイブックを使ってWordpress用VMを作成。SSH鍵の設定、公開IPの取得、ファイアウォール設定なども自動で実行される
ansible-playbook -i ./localhost ./prepare_idcf.yml
プレイブックが正常に完了すると、同じディレクトリに hosts
と言う名前のファイルが作られる。
このファイル内に作成されたWordpress用VMへの接続情報が以下のように正しく書き込まれていることを確認。
[wordpress-server]
wordpress-server ansible_host=xxx.xxx.xxx.xxx ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa-ansible-wordpress-handson
xxx.xxx.xxx.xxx
の部分がWordpressが公開されるときのアドレスになる
hosts
ファイルを上記の形式で手動作成する
- wordpressをインストールするplaybookを実行
ansible-playbook -i ./hosts ./site.yml
-
ブラウザから
hosts
内に書かれたIPアドレスにアクセスして、Wordpressインストール画面を表示。
Wordpressが正常にインストールできる事を確認する。 -
Wordpressをアンインストールするplaybookを実行、環境をクリーンアップする。
ansible-playbook -i ./hosts ./clean.yml
- Wordpressにアクセスできなくなっていることを確認
先ほど構築したWordpressサーバーは、WebアプリケーションとDBが同じホスト上に乗っている一台構成のものでしたが、プロダクション運用の際にはパフォーマンスや可用性を考慮してアプリケーション・サーバーとDBサーバーを分割した構成を取ることも多いです。
しかし、今のままのplaybookはこの様な構成に対応していません。
そこで、ここからはplaybookを編集してアプリ+DBの二台構成Wordpress環境を構築してみましょう!
- DBサーバーの要件 * OSはCentOS7.2で作成 * DBのバックエンドはCentOS7系デフォルトのMariaDBとする(CentOS6系ではMySQL) * SSH KeyはWordpressサーバーと同じものを使用する * DBはローカルネットワーク内からのアクセス専用なので、ポート開放の追加設定は必要なし
:warning: IDCFクラウド以外を使う場合は、WordpressサーバーとDBサーバー間をローカルIPで通信可能にしてください。
prepare_idcf.yml
を編集 現在wordpress-server
のみを作成するようになっているので、以下のようにwordpress-db
vmも作成できるようにしましょう。
```yaml
---
- hosts: localhost
connection: local
roles:
- role: idcf_vm
idcf_vm_name: wordpress-server
idcf_vm_inventory_groups:
- wordpress-server
idcf_vm_ssh_key_name: ansible-wordpress-handson
idcf_vm_ports:
- port: 80
protocol: tcp
# 追記ここから
- role: idcf_vm
idcf_vm_name: wordpress-db
idcf_vm_inventory_groups:
- wordpress-db
idcf_vm_ssh_key_name: ansible-wordpress-handson
# 追記ここまで
tasks:
- name: Inventory設定をhostsに書き出し
template:
src: "{{ playbook_dir }}/templates/hosts.j2"
dest: "{{ playbook_dir }}/hosts"
backup: yes
```
- プレイブック実行
編集した
prepare_idcf.yml
をansible-playbook
コマンドから実行しましょう。
```
ansible-playbook -i ./localhost ./prepare_idcf.yml
```
- Inventoryファイルを確認
Inventoryに
wordpress-db
の情報が追加されているか、hosts
を確認してみましょう。
```
[wordpress-db]
wordpress-db ansible_host=xxx.xxx.xxx.xxx ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa-ansible-wordpress-handson
[wordpress-server]
wordpress-server ansible_host=xxx.xxx.xxx.xxx ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa-ansible-wordpress-handson ```
このように、`wordpress-db`, `wordpress-server`両方のホスト情報が書かれていればOKです。
DBサーバー、アプリケーション・サーバー毎に必要なロールが異なることに注意してください。
また、効率化のために共通のcommon
ロールを先に実行している点もポイントです。
-
site.yml
--- - name: 共通のタスクを実行 hosts: all become: yes roles: - common - name: MySQLをインストール hosts: wordpress-db become: yes roles: - mysql - name: Wordpress, Nginx, PHP-FPMをインストール hosts: wordpress-server become: yes roles: - nginx - php-fpm - wordpress
元のプレイブックでは、DBもアプリケーションも同じサーバー内に存在したため、Wordpressが使うデータベースと接続ユーザーの設定をwordpress
ロール内で実行していました。
このままだと、DBサーバーとアプリケーション・サーバーが分かれた時に設定ができなくなってしまうので、これらの操作をmysql
ロールに移しましょう。
-
以下2タスクを
roles/wordpress/tasks/main.yml
からroles/mysql/tasks/main.yml
の最後尾に移動する- name: Wordpress用データベースを作成 mysql_db: name: "{{ wp_db_name }}" state: present - name: Wordpress用データベースユーザーを作成 mysql_user: name: "{{ wp_db_user }}" password: "{{ wp_db_password }}" priv: "{{ wp_db_name }}.*:ALL" host: localhost state: present
上で移動した2タスクの内、Wordpress用データベースユーザーを作成
タスクをよく見てみると、host: localhost
と書いてあります。
これはデータベース・ユーザーの接続元ホストを制限するための設定なので、アプリケーション・サーバーからの接続を受け入れるように書き換える必要があります。
-
roles/mysql/tasks/main.yml
の最後のタスクを書き換え- name: Wordpress用データベースユーザーを作成 mysql_user: name: "{{ wp_db_user }}" password: "{{ wp_db_password }}" priv: "{{ wp_db_name }}.*:ALL" host: "{{ hostvars[item].ansible_default_ipv4.address }}" state: present with_items: groups['wordpress-server']
長い書き方になってしまいますが、この様に書くことで「
wordpress-server
グループに属する全ホストのipアドレス」を動的に設定することができ、冗長化などの際のplaybookの汎用性を高めることができます。 なお、with_items
はplaybook内のタスクをループさせる時に使う書き方です。
Wordpressの設定ファイルwp-config.php
の中にDBのホスト名の設定がありますが、ここもlocalhost
になっているので修正しましょう。
Wordpress用データベースユーザーを作成
の修正と同様の書き方ができますが、今度はDBサーバーのipを取りたいのでwordpress-db
グループの設定を取得します。
また、DBサーバーについてはアプリケーション・サーバーの様に単純に全ホストの値をループで設定することはできませんので、今回はDBサーバーは1台である前提とします。
-
roles/wordpress/templates/wp-config.php
を修正する/** MySQL hostname */
define('DB_HOST', 'localhost');
を、以下の様に書き換え
```php
/** MySQL hostname */
define('DB_HOST', '{{ hostvars[groups['wordpress-db'][0]].ansible_default_ipv4.address }}');
ansible-playbook -i ./hosts ./site.yml
これでDBサーバー、アプリケーション・サーバーの2台構成のWordpress環境の完成です!
今回のWordpress構築用には、今の段階では使われていないMackerelエージェント・インストール用ロール mackerel
が含まれています(roles/mackerel
内)。
このロールを有効化することで、自動で構築したホストをMackerelに登録することが可能となります。
-
site.yml
中 共通のタスクを実行 のroles
内にmackerel
ロールの呼び出しを加えましょう。 -
Mackerel連携には
mackerel_api_key
変数の設定が必要です。今回はansible-playbook
コマンドのオプションで変数を設定してみましょうansible-playbook -i ./hosts -e "mackerel_api_key=YourApiKey" ./site.yml
の形式で実行することができます。
mackerel
ロール実行完了後にMackerelのダッシュボードを見ると、登録ホストにwordpress-server
とwordpress-db
が増えていることが確認できます。