Carpe Diem

備忘録。https://github.com/jun06t

Ansible を使ってみる

概要

ホストPCから環境構築したいゲストPC2台に対してApacheをインストールしてみます。

環境

事前準備1(VMの用意)

Vagrantで3台まとめてUbuntuを起動します。
Vagrant で複数VMを一度に立ち上げるを参考に、Vagrantfileに以下を追記します

 config.vm.define :host do |node|
   node.vm.hostname = "host"
   node.vm.network :private_network, ip: "192.168.33.11"
 end
 config.vm.define :guest1 do |node|
   node.vm.hostname = "guest1"
   node.vm.network :private_network, ip: "192.168.33.12"
 end
 config.vm.define :guest2 do |node|
   node.vm.hostname = "guest2"
   node.vm.network :private_network, ip: "192.168.33.13"
 end

追加したら

$ vagrant up

で全て起動してください。

事前準備2(SSHの設定)

起動できたら

Host -> Guest x2

SSHでアクセスできるように、公開鍵の登録を行います。
まずはホスト用VMにログインします。

$ vagrant ssh host

ログインしたら鍵を作成します。

$ 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
Enter same passphrase again:  ←同じくそのままEnter
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:
7f:a1:7e:a3:1e:93:1a:e0:ca:3a:0e:a4:d5:64:9a:dd vagrant@host
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|    o            |
|   B .           |
| .+ o E S   .    |
|o.   . . . o .   |
|o     . . * .    |
| ... .   + +o    |
| .ooo   ..+o .   |
+-----------------+

作成できたら各ゲストVMに公開鍵をコピーします。

$ 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 3d:72:a3:75:be:64:42:01:22:79:6e:e0:bd:3e:9e:9e.
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 ユーザのパスワードはvagrantです。

vagrant@192.168.33.12's password: 

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.

もう一方も登録しておきます。

$ ssh-copy-id 192.168.33.13

これで下準備は完了しました。

Ansibleインストール(Host)

$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

Ansibleで必要なものは

名前 機能
inventory 対象サーバのアドレスを登録&グルーピング
ansible.cfg 設定ファイル。inventoryの場所とか指定。なくてもOK
モジュール コマンド群。インストールやサービスの設定などができる。冪等性
playbook モジュールをまとめたタスクランナー。形式はyaml

ということなのでまずはinventoryを用意します。ファイル名はhostsとでもします。

$ vim hosts

グループ名はそれぞれweb1, web2とかにでもしておきましょう。好きに付けられます。

[web1]
192.168.33.12

[web2]
192.168.33.13

動作確認

先ほどのグループを指定して実行したければ第一引数にグループ名を、全体に実行したければallと入力します。
また実行する命令は確認用のpingというものを使います。

$ ansible all -i hosts -m ping
192.168.33.12 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.33.13 | success >> {
    "changed": false, 
    "ping": "pong"
}

inventoryの指定が面倒であれば、

$ vim ansible.cfg
[defaults]
hostfile = ./hosts

というファイルを作成すれば-i hostsの部分を書かなくて済みます。
ここまででテスト動作はできたので、次はモジュールをまとめたplaybookを作成して実行します。

Apacheのインストール

yaml形式のファイルを作成します。

$ vim sample.yml

ではApacheをインストールするためのモジュールを登録します。
せっかくグルーピングしているので、

  • ユーザ作成は両方
  • Apacheのインストールはweb1だけ

という方針で登録します。

---
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=test

- hosts: web1
  sudo: yes
  tasks:
    - name: install apache
      apt: name=apache2 state=latest
    - name: start apache and enabled
      service: name=apache2 state=started enabled=yes

注意としてインデントがズレていたり、タブを使ってインデントすると実行時に怒られます。
では実行します。

$ ansible-playbook sample.yml

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.12]
ok: [192.168.33.13]

TASK: [add a new user] ******************************************************** 
changed: [192.168.33.12]
changed: [192.168.33.13]

PLAY [web] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.12]

TASK: [install apache] ******************************************************** 
changed: [192.168.33.12]

TASK: [start apache and enabled] ********************************************** 
ok: [192.168.33.12]

PLAY RECAP ******************************************************************** 
192.168.33.12              : ok=5    changed=2    unreachable=0    failed=0   
192.168.33.13              : ok=2    changed=1    unreachable=0    failed=0   

curlでインストールされてるか確認できます。

$ curl 192.168.33.12

以上です。お疲れ様でした。

ソース