のうない あうとぷっと。
プログラミング

Vagrantで作成したUbuntu18.04にAnsibleでプログラムを自動インストールしてみた覚書

タイトルの通り。色々調べまくったので、知見として覚書します。

確認環境

macOS Mojave 10.14.14上で動作確認

前提として、VagrantとAnsibleについてはインストール済み。

Vagrantのバージョンは

$ vagrant -v
Vagrant 2.2.3

Ansibleのバージョンは

$ ansible --version
ansible 2.7.8

本記事の流れ

今回は下記の通り試してみました。

  1. Vagrantで作業対象のVMを作成する
  2. VagrantにSSHログインできるように設定を入れる
  3. 何度も試せるように環境をsandbox化する
  4. Ansibleでpingを実施して疎通確認する
  5. Ansibleコードを実行して自動インストールができることを確認する。
  6. ~~おまけ: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 updateapt 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

実行結果