タイトルの通り。色々調べまくったので、知見として覚書します。
Contents
確認環境
macOS Mojave 10.14.14上で動作確認
前提として、VagrantとAnsibleについてはインストール済み。
Vagrantのバージョンは
$ vagrant -v
Vagrant 2.2.3
Ansibleのバージョンは
$ ansible --version
ansible 2.7.8
本記事の流れ
今回は下記の通り試してみました。
- Vagrantで作業対象のVMを作成する
- VagrantにSSHログインできるように設定を入れる
- 何度も試せるように環境をsandbox化する
- Ansibleでpingを実施して疎通確認する
- Ansibleコードを実行して自動インストールができることを確認する。
- ~~おまけ:Ansibleでできるいろんなこと。~~
6は落ち着いたら追記予定。
Vagrantで作業対象のVMを作成する
vagrant init
を実行してVagrantfileの雛形を作成する。
$ vagrant init bento/ubuntu-18.04
vagrantfileを編集する。必要な設定のみを残す。
$ vi Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
end
end
vagrant up
を実行し、VMを立ち上げる。
$ vagrant up
これで自動インストール作業対象のVMが作成できました。
VagrantにSSHログインできるように設定を入れる
vagrant ssh
でのログインができますが、sshコマンドでのアクセスはできないかと思います。
sshコマンドでアクセスできるように設定を入れます。
vagrant ssh-config
を実行することで秘密鍵の場所、ポート、ユーザなどSSH接続に必要な情報を知ることができます。
$ vagrant ssh-config
Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/xxxx/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
この情報を~/.ssh/config
に書き込むことで設定が書き込まれます。
$ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config
これで接続に必要な設定が書き込まれました。
$ cat ~/.ssh/config
Host 192.168.33.10
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/xxxx/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
試しにSSHログインをしてみましょう
$ ssh 192.168.33.10
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-29-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Tue Jun 18 18:01:53 UTC 2019
System load: 0.0 Processes: 87
Usage of /: 2.9% of 61.80GB Users logged in: 0
Memory usage: 10% IP address for eth0: 10.0.2.15
Swap usage: 0% IP address for eth1: 192.168.33.10
192 packages can be updated.
100 updates are security updates.
Last login: Tue Jun 18 17:38:14 2019 from 10.0.2.2
vagrant@vagrant:~$
ログインができました。これでAnsibleを使って設定を自動化できるようになりました。
何度も試せるように環境をsandbox化する
Ansibleを使えるようにはなりましたが、失敗して最初からやり直したいときに再度vagrant destroy
して削除して
vagarant init
からやり直すのはめんどくさいので、手軽に切り戻しできるように環境をsandbox化してしまいましょう。
vagrant plugin の saharaというプラグインを使用します。サハラ砂漠ってことですかね。
$ vagrant plugin install sahara
最初は有効になっていないと思いますが、とりあえず状態を確認します。
$ vagrant sandbox status
[default] Sandbox mode is off
sandboxを有効化するにはvagrant sandbox on
$ vagrant sandbox on
[default] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
sandboxを無効化するにはvagrant sandbox off
$ vagrant sandbox off
[default] Stopping sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
状態を切り戻しするにはvagrant sandbox rollback
$ vagrant sandbox rollback
[default] Rolling back the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
状態を反映させたいときはvagrant sandbox commit
$ vagrant sandbox commit
[default] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
をそれぞれ実行してください。
ではvagrant sandbox on
を実行して、Sandboxを有効化してからAnsible自動化を試してみましょう。
Ansibleでpingを実施して疎通確認する
vagrantとAnsibleの疎通確認を行うため、pingを実行してみます。
$ ansible -i [インベントリファイル] [ターゲット] -m ping
$ ansible -i hosts xxxx -m ping
192.168.33.10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
SUCCESSなので、疎通確認はできているようです。
ちなみに、VagrantにSSHログインできるように設定を入れる設定ができていないと
下記の通りエラーが出力されます。
$ ansible -i hosts xxxx -m ping
192.168.33.10 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.33.10 port 22: Connection refused",
"unreachable": true
}
Ansibleコードを実行して自動インストールができることを確認する。
今回は初期インストール時に実行するapt update
とapt upgrade
をansibleから実行できるか試してみます。
$ vi test.yml
AnsibleのPlaybookは下記の通り書きました。
---
- hosts: xxxx ← どのマシンを対象とするか
user: root
tasks:
- name: apt update ←このタスクでは何を行うか(自由記述)
apt:
update_cache: yes
- name: apt upgrade
apt:
upgrade: yes
AnsibleのPlaybookを実行してみましょう。
$ ansible-playbook -i hosts test.yml
実行結果