【Laravel Practice03】デプロイサーバーにAnsibleを実行する
まずはAnsibleをデプロイサーバーに向けて実行してみます。
AnsibleがインストールされているPC自身にプロビジョニングができるので、
Macの環境構築なんかもAnsibleでできるみたいです!
ところでAnsibleとは?
ChefやPuppetやItamaeと同列に扱われる、構成管理ツールの1つです。
エージェントレスでシンプルなところが特徴とされています。
エージェントレス?
Chefなど一部の構成管理ツールは、対象のサーバーにもChefがインストールされている必要があったりします。
Ansibleは対象のサーバーにsshで接続できれば、対象のサーバーに特別な準備はいりません。
Ansibleについての説明はしますが、最小限な感じになると思うので、
分からない場合は、コメントいただいたり、ググったり、下の本を読んでみたりしてください・・・!

- 作者: Lorin Hochstein,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/04/16
- メディア: 大型本
- この商品を含むブログ (2件) を見る
とりあえずコマンドを実行してみる
とりあえずエラーが発生しますが、コマンドを打ってみます。
まずは
$ vagrant ssh deploy
で、デプロイサーバーにログイン。
$ sudo ansible-playbook -i /vagrant/hosts -l deploy -c local /vagrant/ansible/deploy.yml ERROR! the playbook: /vagrant/ansible/deploy.yml could not be found
はい、エラーになりましたね。
/vagrant/ansible/deploy.yml
というPlaybookはありません!とのことです。
ひとつずつ解決していきます。
プレイブック?
プレイブックとは作業手順書と置き換えて考えていただければいいと思います。
サーバを構築するための作業手順書です。
構成管理ツールがない時代は、秘伝のテキストファイルにサーバーの構成方法のメモ書きが残されていたりしていたそうですが、
そのような手順を「YAML」という形式で記述したものがプレイブックになります。
デプロイサーバー用のプレイブックということでdeploy.yml
という名前にしてみました。
deploy.yml
- hosts: deploy become: yes roles: - common
こんな感じのファイルになります。
1行目ではhosts: deploy
として、対象のホストを指定しています。
勘のいいかたはお気づきかもしれませんが、最初に打ったコマンドでhostsのファイルをしております。
-i /vagrant/hosts
でhostsのファイルを指定できます。
デフォルトでは/etc/ansible/hosts
のファイルが参照されます。
hostsファイル
[deploy] 127.0.0.1
こんな感じでhostsは設定します。ローカル環境を示す127.0.0.1
またはlocalhost
を指定します。
2行目のbecome: yes
はsudo
で実行する設定です。
実行するユーザーを切り替える際にはbecome_user: deploy
のような感じでユーザー名を指定します。
3-4行目ではrole(ロール)を指定しています。
laravel-servers
└─ansible
└─roles
└─common
└─tasks
│ └─main.yml
└─vars
└─main.yml
こんな感じのディレクトリ構造になっていて、rolesのディレクトリの中にcommonディレクトリを配置するような構造です。
ロールで管理しなくてもプレイブックに直接記述する方法でもOKなのですが、役割が分かりやすくなるので、この形が自分の好みです。
tasksディレクトリの中のmain.ymlに実際にサーバーに対して実行したい処理を書いていきます。
main.yml
上記のファイルをご参照ください。
たくさん色々書いてあります・・・!笑
name: XXXXXXXXXX
で書かれている1つ1つタスクと呼ばれる部分です。
名前は分かりやすい名前をつけてあげましょう。
yum:
やservice:
、shell
などはAnsibleが用意しているモジュールです。
All Modules — Ansible Documentation
http://docs.ansible.com/ansible/list_of_all_modules.html
すごくたくさんもモジュールが用意してあります。
shell
やcommand
のモジュールを使えば、通常のコマンドとしてもかけます。
が、モジュールを使えば、たとえばyum
であれば、
- name: install yum-cron yum: name=yum-cron state=latest
と書くことで、インストールされてなければインストール、すでにインストールされていなければ何もしないというような冪統制を考慮してくれるので、書ける方法があればモジュール経由で書くのがいいかと思います。
各モジュールはドキュメントやグーグル先生に聞いて調べてみてください。。笑
varsディレクトリのmain.yml
vars/main.yml
timezone: Asia/Tokyo
ロール用の変数を宣言する事ができます。
role/main.yml
- name: set timezone shell: timedatectl set-timezone "{{ timezone }}"
という感じで、{{
と}}
で囲って変数を使用します。
commonロールのタスク
下記が今回実行するタスクです
- EPELリポジトリのインストール
- 不要サービスの停止
- yum update
- yum-cronのインストール
- yum-cronの設定
- yum-cronのサービスを有効にする
- SELINUXを無効にする
- nkfのインストール
- 現在のタイムゾーンを取得
- タイムゾーンの設定(変数に指定してあるタイムゾーン以外が設定されている場合のみ)
- gitのインストール
- unzipのインストール
以上が実行されます。
ここまでの作業のコミットは以下になります。
github.com
次から再度コマンド実行していきますので、上のファイルと同じ構成で各ファイルを配置してみてください。
再度コマンドを実行
今度はコマンドを実行してもエラーがなく進むと思います。完了するまでにちょっと時間がかかります。
$ sudo ansible-playbook -i /vagrant/hosts -l deploy -c local /vagrant/ansible/deploy.yml PLAY [deploy] ****************************************************************** TASK [setup] ******************************************************************* ok: [127.0.0.1] TASK [common : install epel repository] **************************************** changed: [127.0.0.1] ~~~~~~~~~~~~~~~~~ PLAY RECAP ********************************************************************* 127.0.0.1 : ok=13 changed=10 unreachable=0 failed=0
ok:
は実行されたタスク
changed:
は今回の実行で変更が行われたタスク
というようなイメージです。
13個が実行さで10個のタスクで今回変更があったということになります。
もう一度同じコマンドを打ってみましょう。
$ sudo ansible-playbook -i /vagrant/hosts -l deploy -c local /vagrant/ansible/deploy.yml PLAY [deploy] ****************************************************************** TASK [setup] ******************************************************************* ok: [127.0.0.1] TASK [common : install epel repository] **************************************** ok: [127.0.0.1] ~~~~~~~~~~~~~~~~~ PLAY RECAP ********************************************************************* 127.0.0.1 : ok=12 changed=0 unreachable=0 failed=0
前回より早く終わったかと思います。
12個が実行さで今回変更はありませんでした。
数が1つ減っているのは、skipping
になっているためです。
指定の条件に合致しない場合は実行されないタスクがあるので、これはこれで正常な動作になります。
気になる人はset timezone
のタスクを見てみてくださいね。
補足ですが-c local
のオプションはAnsibleをローカルモードで実行したい場合のオプションになります。
まとめ
- AnsibleはMacの開発環境構築にも使える!
- Ansibleとはエージェントレスでシンプルな構成管理ツールの1つである
- 同様の構成管理ツールにはChef、Puppet、Itamaeなどがある
- プレイブックに構築手順を「YAML」形式で書く
- hostsは適切に設定しましょう
- ロールに切り出すと役割ごとにタスクを管理しやすいと思う
- Ansibleのモジュールはたくさんあるのでドキュメントを見る
- ロール用に変数も定義できる
- ローカルモードで実行したい場合は
-c local
のオプションをつける
次回はAnsibleを使ってさらにデプロイサーバーの環境を整えていきます・・!
次の記事はこちら!
【Laravel Practice04】AnsibleでNTPサーバーを構築 - 終電23時15分って早くね?