読者です 読者をやめる 読者になる 読者になる

終電23時15分って早くね?

都内のIT企業で働くカラオケ大好きエンジニアの雑記

【Laravel Practice02】デプロイサーバーにAnsibleをインストール

Ansible CentOS Vagrant

f:id:blue_goheimochi:20160624022454p:plain

デプロイサーバーにAnsibleをインストールします。

前回はこちら
【Laravel Practice01】デプロイサーバー、Webサーバー、DBサーバーの準備 - 終電23時15分って早くね?

前回も言いましたが本当はたぶんデプロイサーバーに向けてAnsibleをホストOSから実行すればよいです。
が、Windows環境で(面倒なので)ローカルからAnsibleを実行するのではなくデプロイサーバーにインストールしてみます。

デプロイサーバーにログイン

手順どおりにいけばlaravel-serversディレクトリにいると思いますのでそこで、

$ vagrant ssh deploy

というコマンドでデプロイサーバーにログインします。
複数の仮想サーバーがある場合はvagrant ssh [名前]SSHで対象サーバーにログインできます。
仮想サーバーが1つしかない場合は、名前を明示せずvagrant upだけでOKです。

EPELリポジトリの導入

エンタープライズ Linux 用の拡張パッケージ(EPEL) は、 Red Hat Enterprise Linux (RHEL) 向けの高品質なアドオンパッケージであり、CentOSScientific Linux (SL) のような RHEL からスピンオフしたディストリビューションと互換性のある、Fedora プロジェクトで有志によって作成されたパッケージになります。FedoraRHEL のアップストリームであり、EPEL のアドオンパッケージは主に RHEL 向けにビルドされた Fedora リポジトリをソースとしています。

https://fedoraproject.org/wiki/EPEL/ja

CentOSの標準パッケージには含まれないパッケージをyumでインストールするためにEPELリポジトリを導入します。
Ansibleはこちらのリポジトリからインストールするような想定です。

$ sudo yum install -y epel-release

デプロイサーバのコンソールから上記コマンドで、EPELリポジトリのインストールができます。

Ansibleのインストール

今回利用しているCentOSyumUbuntuのaptなどのパッケージ管理システムを使えば、
ソースコードを落としてきて個別にインストールする必要がないので楽ですね。

最新版が使いたい!となると、パッケージとして提供されてないケースがあるのでそういう場合は手動で最新版をインストールする方法をぐぐって試してみてください。

$ sudo yum install -y ansible

と、yumでさくっとインストールすると、

$ ansible --version
ansible 2.1.0.0

という感じでAnsibleのバージョン2.1がインストールできました。

vagrat up 時に自動でEPELリポジトリとAnsibleをインストールするようにしてみる

前項まででいったん、今回の目的である「デプロイサーバーにAnsibleをインストールする」というのは完了です。
が、せっかくなのでVagrantの機能を使って、vagrant upした際に自動的にデプロイサーバーにEPELリポジトリとAnsibleをインストールしてみます。

Vagrantのプロビジョニングの機能

vagrant upで仮想環境を起動したあとに実行する処理を指定できるのが、Vagrantのプロビジョニングの機能です。

www.vagrantup.com

仮想環境起動後に実行可能な詳しい処理は公式サイトをご確認ください。
ChefやPuppet、Ansibleやシェルスクリプトなどなどで処理を指定する事が可能ですが、
今回はシェルスクリプトでやります。

Vagrantfileの記述

github.com

とても簡単!

server.vm.provision "shell", :path => "provision.sh"

shellの部分でプロビジョニングの方法(chefとかansibleとか)を指定し、
シェルスクリプトの場合は実行するファイルを指定します。

provision.shの記述

github.com


こちらも簡単ですね。

冪等性を意識するために、if文なんかを書いてみました。

yumでインストールしたEPELリポジトリrpmコマンドとgrepを使ってチェックしています。

if [ -n "`rpm -q epel-release | grep -w 'not installed'`" ]; then
  sudo yum install -y epel-release
fi

rpm -qはパッケージの詳細を表示するコマンドです。

インストールされている場合は

$ rpm -q epel-release
epel-release-7-6.noarch

インストールされていない場合は

$ rpm -q epel-release
package epel-release is not installed

のような結果になるので、grep -w 'not installed'でワード検索し、
インストールされていない場合のみインストールするような感じです。
たぶん他のパッケージでも応用して使える気がします。

Ansibleはwhichを使ってチェックしています

if [ ! `which ansible` ]; then
  sudo yum install -y ansible
fi

whichはコマンドを探してくれます。
コマンドがある場合はそのパスとともに結果が返ってきます。

$ which ansible
/usr/bin/ansible

ない場合は、

$ which ansible
/usr/bin/which: no ansible in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin)

no ansibleと出力されていてコマンドが存在しないことが分かります。

whichコマンドの終了ステータス(成功したら 0、失敗したら 1)で判定して、Ansibleがインストールされていない場合のみインストールを実行します。

デプロイサーバーを一度破棄する

$ vagrant destroy -f deploy

上記のコマンドで一度、デプロイサーバーを破棄します。仮想環境を削除できます。
-fのオプションは強制的に削除するオプションで、これをつけないと削除するかどうかを確認されるので、「Y」を応答して削除しましょう。

デプロイサーバーを再構築する

$ vagrant up deplo

前回すでに打ったコマンドと同じですが、再度デプロイサーバーを構築するためにvagrant upを実行します。
そしたらしばらくコンソールを眺めてみましょう。

==> deploy: Running provisioner: shell...
    deploy: Running: C:/Users/HOGEHOGE/AppData/Local/Temp/vagrant-XXXXXXXXXX.sh


のようなログが出てきたらシェルでのプロビジョニングがはじまります。

デプロイサーバーにログインして、EPELとAnsibleを確認する

$ vagrant ssh deploy

でログインし、

$ rpm -q epel-release
epel-release-7-6.noarch
$ which ansible
/usr/bin/ansible
$ ansible --version
ansible 2.1.0.0

となれば無事Vagrantでの自動のプロビジョニングは完了です!

まとめ

  • EPELリポジトリをインストールする
  • EPELリポジトリCentOSの標準パッケージに含まれないパッケージを提供してくれる
  • AnsibleはEPELリポジトリからインストールする
  • yumでインストールできるから簡単ですね!
  • ubuntuの場合はapt-getでインストールできる
  • Vagrantfileにシェルでのプロビジョニングを自動実行するように追加
  • シェルスクリプト以外でもChefやAnsibleなどが起動完了後に実行できる
  • 冪統制をシェルスクリプトでも考えてみると楽しい
  • Ansibleなどの構成管理ツールはそんな冪統制をよしなにしてくれたりもするよ

次は、デプロイサーバーでAnsibleをデプロイサーバー自身に実行してみたいと思います。

次の記事はこちら!
【Laravel Practice03】デプロイサーバーにAnsibleを実行する - 終電23時15分って早くね?


初めてのAnsible

初めてのAnsible