初めてのAnsibleをVagrant+CentOS7で使ってみる
2017/01/31
こんにちは、okutani(@okutani_t)です。『Ansible』を使うと、サーバーや開発環境の構築を自動化することができます。
また、Ansibleの『play-book』(プレイブック)という機能で環境を構築していくのですが、play-bookではYAMLファイルに設定を記述して利用していきます。
そのplay-bookファイルをやりとりするようにすれば、サーバーの環境をポータブルにすることができて便利です。
Ansibleは手元のマシンにインストールしておき、SSH接続から対象サーバーを構築していくため、Chefに比べて手軽に利用することができるのも利点のひとつです。
今回は、Vagrantで立ち上げた「bent/centos7.1」にAnsibleを導入し、同じくVagrantで立ち上げた対象用サーバー(CentOS7)にかんたんなお試しの環境を構築してみたので、その手順を紹介します。
今回利用したCentOS、Ansibleのバージョンは次のとおりです。
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
$ ansible --version
ansible 1.9.4
また、実行環境はWindows, Macどちらでも可能です。本記事では、Windows上で立ち上げたVagrantで動かしていますが、なんの問題もなく進められました。
ではさっそく、初めてのAnsibleを使っていってみましょう。
参考Ansible チュートリアル | Ansible Tutorial in Japanese
参考Ansibleをはじめる人に。 – Qiita
スポンサーリンク
Vagrantで2台のCentOSを起動
Vagrantを使って2台のCentOS(ホストと対象サーバー)を立ち上げます。
$ mkdir ansible_test
$ cd ansible_test
$ vagrant init bento/centos-7.1
作成されたVagrantfileを書き換えて、2台分の仮想環境をいっぺんに立ち上げられるようにします。Vagrantfileをエディタで開きましょう。
$ vi Vagrantfile
config.vm.boxの箇所をコメントアウトし、以下のように追記しました。
# config.vm.box = "bento/centos-7.1" #コメントアウト
config.vm.define "host" do |node|
node.vm.box = "bento/centos-7.1"
node.vm.hostname = "host"
node.vm.network :private_network, ip: "192.168.33.11"
end
config.vm.define "target" do |node|
node.vm.box = "bento/centos-7.1"
node.vm.hostname = "target"
node.vm.network :private_network, ip: "192.168.33.12"
end
上記設定で、hostが「IP: 192.168.33.11」、targetが「IP: 192.168.33.12」で立ち上がります。
次のコマンドで実際に立ち上げてみましょう。
$ vagrant up
ちゃんと2台の仮想マシンが立ち上がったか確認してみます。
$ vagrant status
Current machine states:
host running (virtualbox)
target running (virtualbox)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
これでhostとtargetの仮想マシンが立ち上がりました。
ホスト側にAnsibleを導入
では、ホストマシンにAnsibleを導入していきましょう。
次のコマンドで仮想マシンにログインします。
$ vagrant ssh host
Ansibleを導入するにはEPELリポジトリが必要です。下記コマンドでEPELをインストール。
$ sudo yum -y install epel-release
Ansibleを導入。
$ sudo yum -y install ansible
導入を確認。
$ ansible --version
ansible 1.9.4
configured module search path = None
無事にAnsibleをホストマシンに導入できました。
SSH接続用の鍵を作成&送信
Ansibleでは、操作したい対象にSSHで接続して環境を構築します。hostでSSH鍵を作成。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): [Enter]
Enter passphrase (empty for no passphrase): [パスフレーズ入力]
Enter same passphrase again: [パスフレーズ入力]
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
a5:c1:de:07:be:8e:bc:10:63:8f:c2:13:2a:74:a1:b1 vagrant@host
The key's randomart image is:
+--[ RSA 2048]----+
| |
| . |
| . . o o |
| + . . * . |
| E .. + S o . |
|. .o o = o |
|. . + o . . |
| . o o o |
| +.. |
+-----------------+
targetサーバーに公開鍵を送信。
接続するか聞かれるので「yes」、targetのログインパスワード(今回はvagrantなので『vagrant』)を入力。
$ ssh-copy-id 192.168.33.12
The authenticity of host '192.168.33.12 (192.168.33.12)' can't be established.
ECDSA key fingerprint is e1:f9:fa:6f:8e:fb:cd:63:3f:40:ae:64:f6:28:5e:da.
Are you sure you want to continue connecting (yes/no)? [yesと入力]
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter
out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
vagrant@192.168.33.12's password: [vagrantと入力]
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.33.12'"
and check to make sure that only the key(s) you wanted were added.
※もし、Mac→VagrantのCentOSといった形でおこないたい場合、ssh-copy-idはMacOSでは標準で入っていません。hostマシン側でMacを使いたい場合は鍵をscpで送信する、もしくはHomebrewで「$ brew install ssh-copy-id」などで導入すればOKです
また、今回はtargetのIPを直接指定して送信しましたが、「~/.ssh/config」に別名を貼ってあげれば、IPをわざわざ指定せず、代わりに「target」と指定できて手間がなくなるかと思います。一応、一例を載せておきます。
$ sudo vi ~/.ssh/config
Host target
HostName 192.168.33.12
この場合は「$ chmod 600 ~/.ssh/config」と権限を変更、「$ ssh-copy-id target」で公開鍵を設置できます。
IPを直接指定する場合は、上記の設定はいりません。お好みで利用してみてください。
host側で次のコマンドを入力し、SSH接続できるか確認してみましょう。
[vagrant@host ~]$ ssh 192.168.33.12
Last login: Fri Mar 4 03:27:56 2016 from 192.168.33.11
[vagrant@target ~]$
無事にhostからtargetに、SSHでログインできていることが確認できました。exitでhostに戻っておきます。
[vagrant@target ~]$ exit
logout
Connection to 192.168.33.12 closed.
[vagrant@host ~]$
次は「インベントリファイル」「プレイブック」を作成していきましょう。
インベントリファイル、プレイブックを作成
targetのサーバーを指定するために「インベントリファイル」、導入する内容を管理する「プレイブック」を作成していきます。
まずはインベントリファイル「hosts」を次のように作成してみましょう。
$ sudo vi hosts
[target]
192.168.33.12
targetグループを指定すると、192.168.33.12を見るように設定しました。
接続確認(ping)
これで、Ansibleからtargetを指定すれば、192.168.33.12のサーバーが見れるようになります。
試しに、接続確認用のAnsibleコマンド(ping)を使って接続ができるか確認してみましょう。次のコマンドを実行してみます。
$ ansible target -i hosts -m ping
192.168.33.12 | success >> {
"changed": false,
"ping": "pong"
}
上記のように「”ping”: “pong”」と返ってくれば成功です。「”changed”: false」となっているのは「変更点が何もないですよ」といった意味なのでエラーではないです。
では、次にサーバーに導入する内容をレシピのように記述する、プレイブックファイル「play-book.yml」を作成してみましょう。
$ sudo vi play-book.yml
---
- hosts: target
become: True
tasks:
- name: yumをアップデート
yum: name=* state=latest
- name: install the php
yum: name=php state=latest
「yumのアップデート」「PHPの導入」をおこなうタスクを記述してみました。
「name」には、どのタスクが実行されているか分かるように名前をつけることができます。上記のように、日本語も使えます。
「state=latest」とすることで、リポジトリ内の最新版を指定することができます。YAML形式ですっきり記述できて良いですね。
「become: True」とすることで、sudoで実行することができます。「name」には処理の内容の名前を分かりやすくつけておきます。
プレイブックファイルが作成できたので、次のコマンドで構文があっているかどうかチェックしてみましょう。
$ ansible-playbook play-book.yml -i hosts --syntax-check
playbook: play-book.yml
上記のように表示されればOKです。エラーが出る場合は、インデントや「-」の有り無しを確認してみましょう。
次のコマンドで、処理をおこなうタスク一覧を確認できます。
$ ansible-playbook play-book.yml -i hosts --list-tasks
playbook: play-book.yml
play #1 (target): TAGS: []
yumをアップデート TAGS: []
install the php TAGS: []
では、次のコマンドで「仮実行」してみましょう。あくまで仮実行なので、実際に対象サーバーではプレイブックの内容は実行されません。
$ ansible-playbook play-book.yml -i hosts --check
PLAY [target] *****************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.33.12]
TASK: [yumをアップデート] **********************************************
changed: [192.168.33.12]
TASK: [install the php] *******************************************************
changed: [192.168.33.12]
PLAY RECAP ********************************************************************
192.168.33.12 : ok=3 changed=2 unreachable=0 failed=0
ここまでエラーがなければ、次のコマンドで実際に実行してみましょう。
$ ansible-playbook play-book.yml -i hosts
実行が終了したら、targetサーバーにアクセスしてPHPが導入されているか確認してみましょう。
$ ssh 192.168.33.12
$ php --version
PHP 5.4.16 (cli) (built: Jun 23 2015 21:17:27)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
上記のとおり、targetサーバーにPHPが導入されているのが確認できました。
まとめ
このように、Ansibleを使うと「操作するマシン上にAnsibleを導入して、SSH接続で対象サーバーを構築する」といったやり方で、スマートにサーバーを構築することができます。
プレイブックファイル内の記述が多くなってくると、見通しが悪くなってくるかと思います。その場合は、「role」という仕組みでプレイブックファイルを分割して管理することができます。もし余裕があれば、今後そちらも記事にしたいと思います。
また、本記事は以下の書籍を参考にしています。
Ansibleを利用する際の参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク