試纏

ためしてまとめる〜色々なトピックやテーマについて試してみたり、まとめてみたりするブログです。

書籍『Ansible実践ガイド』を実践してみた - 第2章 Ansibleの基礎(その2.Vagrantによる複数仮想環境の準備)

f:id:shinyaa31:20170116194242p:plain:w200

『Ansible実践ガイド』読解&実践 第2章の2本目のエントリです。Vagrantでansible-playbookコマンドの実践...を行う前に、コマンド実践を行うための複数仮想環境の状況をVagrantで準備する部分について当エントリでは手順を纏めておきたいと思います。

Ansible実践ガイド

Ansible実践ガイド

参考にしたのは以下のエントリです。

第2章に関するエントリは複数エントリに分かれて書き進めています。前回の内容は下記エントリとなります。(すみません、投稿時にエントリURLを一部間違えていたので変更致しました...)

実践内容

設定ファイルの内容を読み解いてみる

まずはこれまでの内容で生成されたVagrantfileの中身について、コメント部分を除去した形で整理してみたいと思います。最低限の起動であればこんなにシンプルな設定で行けるんですね。

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant.configure("2") do |config|
  config.vm.box = "centos_for_ansible_controller"
  config.vm.network "private_network", ip: "192.168.123.100"
end

設定内容に関する詳細をちょっと調べてみます。Vagrant.configure("2")の部分、2って何だよと思ってましたが、このエントリを見る感じだとAPIのバージョンを指定してるんですね。

config.vm以下の設定値については下記公式ドキュメントにその用法が載っています。

box,networkについては以下参照。

複数マシン環境作成の実践(と試行錯誤)

専用ディレクトリを作成し、初期化実施。そう言えば複数マシン環境を一度に立ち上げる時ってこのタイミングでvagrant initを複数回(複数種類)実行すれば良いのかしら?まぁその辺は追々調べてみる事にしよう。今回は上記で追加したボックスを使って同じOS種類の環境を3つ立ち上げる事にします。

$ mkdir CentOS_multi
$ cd CentOS_multi/
$ vagrant init centos_for_ansible_multi
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

今回用に生成されたファイルのコメント部分を除去し、まずはこの状態(即ちこれまでと同様の設定)で起動実施してみます。

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant.configure("2") do |config|
 
  config.vm.box = "centos_for_ansible_multi"
  config.vm.network "private_network", ip: "192.168.200.201"
 
end

実行&ログイン実施。当然ながら問題は無いですね。

$ vagrant up
$ vagrant ssh
Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core) 

vagrant haltで環境を停止。コマンド名が(対の意味でイメージしそうな)downで無くhaltとなっているのは以下の様な理由があるんですねぇ。

$ vagrant halt
==> default: Attempting graceful shutdown of VM...

下記エントリの内容に倣い、Vagrantfileを書き換えてみます。

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant.configure("2") do |config|
  config.vm.box = "centos_for_ansible_multi"
 
  # マシン1台目
  config.vm.define "controller" do |controller|
    controller.vm.hostname = "controller.host"
    controller.vm.synced_folder ".", "/vagrant", disabled: true
    # controller.vm.network :forwarded_port, id: "ssh", guest: 22, host: 11022
    controller.vm.network "private_network", ip: "192.168.200.201"
  end
 
end

起動。これも特に問題無し。

$ vi Vagrantfile
$ vagrant reload
$ vagrant ssh
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)   

書籍では1台目がコントローラ、2台目3台目がターゲットという構成でしたのでここでもその内容に倣い、1台目の体裁に合わせる形で2台目3台目の記述も追加します。IPアドレスや名称等、一意である事が要求される部分はそれぞれ適切な値に置き換えます。

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant.configure("2") do |config|
  #config.vm.box = "centos_for_ansible_multi"
  config.vm.box = "centos_for_ansible_multi"
 
  # マシン1台目
  config.vm.define "controller" do |controller|
    controller.vm.hostname = "controller.host"
    controller.vm.synced_folder ".", "/vagrant", disabled: true
    # controller.vm.network :forwarded_port, id: "ssh", guest: 22, host: 11022
    controller.vm.network "private_network", ip: "192.168.200.201"
  end
 
  # マシン2台目
  config.vm.define "target_1st" do |target_1st|
    target_1st.vm.hostname = "target1st.host"
    target_1st.vm.synced_folder ".", "/vagrant", disabled: true
    # target_1st.vm.network :forwarded_port, id: "ssh", guest: 22, host: 12022
    target_1st.vm.network "private_network", ip: "192.168.200.202"
  end
 
  # マシン3台目
  config.vm.define "target_2nd" do |target_2nd|
    target_2nd.vm.hostname = "target2nd.host"
    target_2nd.vm.synced_folder ".", "/vagrant", disabled: true
    # target_2nd.vm.network :forwarded_port, id: "ssh", guest: 22, host: 13022
    target_2nd.vm.network "private_network", ip: "192.168.200.203"
  end
 
end

環境起動実施。起動後にvagrant statusで状況を確認してみます。3環境共に起動出来ている様です。

$ vagrant reload
$ vagrant up
$ vagrant status
Current machine states:
 
controller                running (virtualbox)
target_1st                running (virtualbox)
target_2nd                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`.

vagrant ssh [マシン名]でそれぞれのサーバにログイン。

$ vagrant ssh controller
Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@controller ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_1st
Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@target1st ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_2nd
Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@target2nd ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.

ssh-configコマンドの内容を~/.ssh/configに転記しておくと、複数環境にsshコマンド&任意のホスト名でアクセス出来るようになります。

$ vagrant ssh-config >> ~/.ssh/config
$ cat ~/.ssh/config 
Host controller
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/shinyaa31/Vagrant/CentOS_multi/.vagrant/machines/controller/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
 
Host target_1st
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/shinyaa31/Vagrant/CentOS_multi/.vagrant/machines/target_1st/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
 
Host target_2nd
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/shinyaa31/Vagrant/CentOS_multi/.vagrant/machines/target_2nd/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

それぞれ異なる環境である事を確認するために、サーバ個別に一意のファイルを作成し、それぞれそのファイルしか存在しない=環境としても個別のものである、という事を確認出来ました。

$ vagrant ssh controller
Last login: Fri Jan 20 23:06:25 2017 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@controller ~]$ touch server-controller.txt
[vagrant@controller ~]$ ls *.txt
server-controller.txt
[vagrant@controller ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_1st
Last login: Fri Jan 20 23:06:53 2017 from 192.168.200.201
Welcome to your Vagrant-built virtual machine.
[vagrant@target1st ~]$ touch server-target-1st.txt
[vagrant@target1st ~]$ ls *.txt
server-target-1st.txt
[vagrant@target1st ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_2nd
Last login: Fri Jan 20 23:06:14 2017 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@target2nd ~]$ touch server-target-2nd.txt
[vagrant@target2nd ~]$ ls *.txt
server-target-2nd.txt
[vagrant@target2nd ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.

サーバ間疎通を確認してみる(ping)

第2章では各種サーバ間の通信が発生します。最低限、pingsshは出来ておく必要があると思い、実践する前にこの辺がちゃんと出来ているかどうかを確認しておきたいと思います。

まずはpingから。コントローラサーバ(192.168.200.201)にsshでログインし、

$ vagrant ssh controller
Last login: Fri Jan 20 23:14:43 2017 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.

ターゲットサーバその1(192.168.200.202)にpingを実行してみます。通りませんね...

$ ping 192.168.200.202
PING 192.168.200.202 (192.168.200.202) 56(84) bytes of data.
From 10.0.2.2 icmp_seq=6 Destination Net Unreachable
From 10.0.2.2 icmp_seq=7 Destination Net Unreachable
From 10.0.2.2 icmp_seq=8 Destination Net Unreachable
:

幾つか情報を漁ってみましたが、試した環境では以下の状況が発生していた模様です。

  • ネットワーク設定が足りていないので追加で設定・作業をする必要がある
  • 今回の対象OS(CentOS)については、この辺の設定周りの状況がCentOS6までとCentOS7(※今回使った環境)では仕様・構成が異なっているらしい

参考にしたのはこの辺りの情報です。

下記エントリの内容に倣い、ネットワークデバイスの内容を確認。eth1は存在しているものの、アドレスが割り当てられていない状況になっていました。 - vagrant + centos7 でprivate_networkで設定したIPに接続ができない - Qiita

$ vagrant ssh controller -c "ip a"
    :
3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 08:00:27:da:31:9c brd ff:ff:ff:ff:ff:ff
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_1st -c "ip a"
    :
3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 08:00:27:5a:cb:b3 brd ff:ff:ff:ff:ff:ff
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_2nd -c "ip a"
    :
3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 08:00:27:22:bc:86 brd ff:ff:ff:ff:ff:ff
Connection to 127.0.0.1 closed.

なので以下の形でネットワークを再起動。

$ vagrant ssh controller -c "sudo systemctl restart network.service"
Connection to 127.0.0.1 closed.
$ vagrant ssh target_1st -c "sudo systemctl restart network.service"
Connection to 127.0.0.1 closed.
$ vagrant ssh target_2nd -c "sudo systemctl restart network.service"
Connection to 127.0.0.1 closed.

IPアドレスが割り振られる様になりました。(※"inet"のパート参照)

$ vagrant ssh controller -c "ip a"
    :
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:da:31:9c brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.201/24 brd 192.168.200.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feda:319c/64 scope link 
       valid_lft forever preferred_lft forever
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_1st -c "ip a"
    :
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:5a:cb:b3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.202/24 brd 192.168.200.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe5a:cbb3/64 scope link 
       valid_lft forever preferred_lft forever
Connection to 127.0.0.1 closed.
 
$ vagrant ssh target_2nd -c "ip a"
    :
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:22:bc:86 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.203/24 brd 192.168.200.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe22:bc86/64 scope link 
       valid_lft forever preferred_lft forever
Connection to 127.0.0.1 closed.

コントロールサーバからターゲットサーバへのpingが無事通る様になりました。

$ vagrant ssh controller
Last login: Fri Jan 20 21:05:13 2017 from 10.0.2.2
[vagrant@controller ~]$ ping 192.168.200.202
PING 192.168.200.202 (192.168.200.202) 56(84) bytes of data.
64 bytes from 192.168.200.202: icmp_seq=1 ttl=64 time=0.584 ms
64 bytes from 192.168.200.202: icmp_seq=2 ttl=64 time=0.503 ms
64 bytes from 192.168.200.202: icmp_seq=3 ttl=64 time=0.667 ms
^C
--- 192.168.200.202 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2010ms
rtt min/avg/max/mdev = 0.503/0.584/0.667/0.072 ms
[vagrant@controller ~]$ ping 192.168.200.203
PING 192.168.200.203 (192.168.200.203) 56(84) bytes of data.
64 bytes from 192.168.200.203: icmp_seq=1 ttl=64 time=0.667 ms
64 bytes from 192.168.200.203: icmp_seq=2 ttl=64 time=0.598 ms
64 bytes from 192.168.200.203: icmp_seq=3 ttl=64 time=0.583 ms
64 bytes from 192.168.200.203: icmp_seq=4 ttl=64 time=0.554 ms
^C
--- 192.168.200.203 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3037ms
rtt min/avg/max/mdev = 0.554/0.600/0.667/0.048 ms

サーバ間疎通を確認してみる(SSH)

次いでサーバ間でのssh接続確認。今回利用したこのOSの場合だと、パスワード入力を求められて来たので値を入力する事で無事にsshアクセスする事が出来ました。

## controller(192.168.200.201) から ターゲットその1(192.168.200.202)へのssh確認
$ ssh 192.168.200.202
The authenticity of host '192.168.200.202 (192.168.200.202)' can't be established.
ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.200.202' (ECDSA) to the list of known hosts.
vagrant@192.168.200.202's password: (パスワード入力:vagrant)
Last login: Fri Jan 20 23:06:09 2017 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@target1st ~]$
[vagrant@target1st ~]$ ls *.txt
server-target-1st.txt
 
## controller(192.168.200.201) から ターゲットその2(192.168.200.203)へのssh確認
$ ssh 192.168.200.203
The authenticity of host '192.168.200.203 (192.168.200.203)' can't be established.
ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.200.203' (ECDSA) to the list of known hosts.
vagrant@192.168.200.203's password: (パスワード入力:vagrant)
Last login: Fri Jan 20 23:15:26 2017 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@target2nd ~]$
[vagrant@target2nd ~]$ ls *.txt
server-target-2nd.txt

まとめ

ひとまずこれにて『Vagrantで複数マシン環境を立ち上げる』『立ち上げた複数マシン間での最低限の接続確認(ping,ssh)を行う』の2つが実現出来ました。いよいよ本編実践(第2章:ansible-playbookコマンドの実践)へと移りたいところですが、エントリの文字数が膨れて来たので別エントリにて進める事にします。