vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです。月間13万PV〜。

初めてのAnsibleをVagrant+CentOS7で使ってみる

      2017/01/31

LINEで送る
Pocket

first-ansible
こんにちは、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を利用する際の参考になれば幸いです。

この記事が気に入ったら
いいね ! しよう

Twitter で
LINEで送る
Pocket

okutani (@okutani_t) のヒトコト
Ansibleに似たようなものにChefというツールがありますが、学習コストが高いということでずっと見送っていました。今回Ansibleが使えるようになったので良かったです。

 - プログラミング

スポンサーリンク

PC用AdSense

PC用AdSense

Share
  • このエントリーをはてなブックマークに追加

  こちらの関連記事もどうぞ

[Win,Mac]プログラミング用フォント『Ricty』を導入してみよう

こんにちは、okutani(@okutani_t)です。Ricty(リクティ)は …

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。